仿真/建模/设计

使用GROMACS 2020创建更快的分子动力学模拟

GROMACS公司-最广泛使用的HPC应用程序之一,随着GROMACS 2020年新版本包括NVIDIA和核心GROMACS开发人员.

作为生物分子系统的模拟软件包,GROMACS使用牛顿运动方程演化粒子。强制命令运动:例如,两个带正电的离子相互排斥。精明的力是模拟中最昂贵的部分,因为所有成对的粒子可能会相互作用,模拟涉及许多粒子。

GROMACS提供了广泛的功能不同类型的力计算。对于大多数模拟重要类别(就计算费用而言)包括:

  • 非结合短程力:在一定截止范围内的粒子被认为是直接相互作用的。
  • 颗粒网格Ewald(PME)远程力:对于较大的距离,力通过一种方案进行建模,其中傅里叶变换用于在傅里叶空间中进行计算。这比直接在实际空间中计算所有交互作用要便宜得多。
  • 粘结短程力:由于粒子之间键的特定行为,例如,拉伸两个共价键原子时的谐波电势,也需要这样做。

在以前的GROMACS版本中,这些力类已经支持GPU加速(PME力计算中使用了CUDA快速傅里叶变换库)。最新加入的是2019系列中的GPU保税部队,该部队是通过NVIDIA和核心GROMACS开发商之前的合作开发的。

然而,仍然存在一个问题。力计算有在现代GPU上速度如此之快,以致于模拟的其他部分在计算费用方面非常重要,特别是当您想要对单个模拟使用多个GPU。

本文介绍了2020版本中可用于解决此问题的新性能功能。对于许多典型的模拟,整个时间步长现在可以在GPU上运行,避免了CPU和PCIe瓶颈。现在,GPU之间的通信操作可以直接在GPU内存空间之间运行。这项工作的结果表明,性能有了很大提高。

单GPU移植和优化

下图(图1)描述了在单个GPU和之前的2019版本上运行时,典型GROMACS仿真中单个时间步长的关键部分(时间步长从左到右运行):

图1。使用2019年GROMACS版本的单个时间步长的关键部分。

不同的框样式表示每个零件的硬件分配:

  • 在GPU上执行(带实心边框的绿色框):显示了三种类型的力计算,它们可以相互重叠。
  • 在CPU上执行(带虚线边框的蓝色框):缓冲操作(BO)是内部数据布局转换和强制减少操作。更新和约束是时间步的最后一部分,其中原子坐标将使用先前计算的力进行更新和约束。
  • 数据传输(无边框的红色框):所需的PCIe主机到设备(H2D)和设备到主机(D2H)数据传输。 

通用分组只加速力的计算是一种有效的策略体系结构。即使有了加速度,它们仍然占据主导地位时间步长的其他部分在性能方面并不重要。然而,在现代架构(如Volta)上,力核现在非常快其他间接费用也变得很大。

GROMACS 2020版本中的解决方案是所有关键计算部分的完全GPU支持。GPU在整个时间步长内使用,并且消除了重复的PCIe传输,如图2所示

图2。使用GROMACS 2020优化时间步长。

PME力内核也进行了优化,以允许更多有效地将工作分配给CUDA线程和更好的内存访问模式。

多GPU优化

为了将多个GPU用于单个仿真,GROMACS将PME力计算分配给单个专用GPU。它分解了剩余GPU上的非键合力和键合力计算。单个MPI任务将控制每个GPU:这些任务分别称为PME任务和Particle-Particle(PP)任务。下图(图3)描述了2019年版4-GPU仿真的情况:

图3。使用GROMACS 2019进行4-GPU仿真的单个时间步长的关键部分。

对于单个GPU情况,只有力计算(在绿色带实线边框)卸载到GPU,CPU(蓝色带虚线边界)和PCIe(红色,无边界)组件限制性能。

现在需要两种类型的通信:具有“光环交换”性质的PP任务之间(其中将每个域的边缘转移到相邻域)PME和PP任务之间。对两个坐标数据都执行这些操作(靠近每个时间步长的开始)和力数据(靠近每一时间步长结束)。

在这个预先存在的代码路径中,数据通过CPU,如下图(图4)所示,用于光环交换坐标数据:

图4。坐标数据halo交换的代码路径,使用GROMACS 2019。

如图4所示:

  • 主机到设备(H2D)和设备到主机(D2H)在GPU和CPU之间传输数据需要CUDA内存副本内存空间。它们使用相对低带宽的PCIe总线。
  • 在CPU上执行缓冲区打包。是的必需,因为要传输的数据不连续。
  • 在CPU内存空间上操作的MPI调用用于在控制独立GPU的MPI任务之间传输数据。

使用GROMACS 2020,这些通信操作现在可以在GPU内存空间之间直接执行,并自动路由,包括使用NVLink(如果可用),如图5所示:

图5。使用GROMACS 2020优化时间步长,用于4-GPU模拟。

新战略如下图所示(图6):

图6。坐标数据halo交换的代码路径,使用GROMACS 2020。

CUDA对等(P2P)内存副本现在可以传输数据直接在GPU内存空间之间。它们穿越高带宽NVLink互连(如果可用)。即使在没有NVLink的系统上由于它提供的异步性,该机制的速度大大加快。

这些P2P传输是由以下事实促成的:缓冲区现在使用CUDA内核直接封装在GPU内存空间中。这个需要有关传输中涉及的数组索引的信息,但信息不会每次都更改。只有当分解变化。您很少在CPU和传输到GPU,对性能没有显著影响。

GROMACS提供了一个名为“线程MPI”的内部MPI库,它在后台使用CPU线程。因此,对于主要的P2P数据传输,您可以利用多个MPI任务位于同一进程中这一事实,并使用在统一虚拟地址空间上操作的CUDA内存副本。然而,这意味着优化仅限于单个计算节点(对于不支持的情况,会自动进行回退)。目前正在进行进一步的工作,以扩展该机制,消除这一限制。

每个MPI任务都必须知道哪些远程内存位置写入和读取,还必须使用远程CUDA事件来允许CUDA以在不同的GPU之间正确同步。这些是在以下双方之间交换的MPI任务在更改时使用MPI发送和接收通信。

早期的图表显示了坐标的光晕交换PP任务之间的数据。力数据的光晕交换机制PP任务之间是类似的,其中需要缓冲区解包,而不是包装。同样,PP和PME之间的协调和强制通信任务类似,但缓冲区打包和解包不是必需的数据是连续的。

性能结果

为了演示这些好处,我们展示了运行多GPU的结果选择三个测试用例来代表真实世界模拟的典型系统尺寸范围。从最小到最大的,我们使用了以下测试用例模拟:

  • 多动症(95561个原子)
  • 纤维素(408609个原子)
  • STMV(1066628个原子)

我们使用了四个NVIDIA V100-SXM2 16GB GPU(带有完整的NVLink连接)由两个Intel Xeon E5-2698 v4(Broadwell)20核CPU托管,其中(如上所述),我们为PME分配了一个GPU,并将PP分解为其余三个GPU。

图7。使用三个多GPU仿真示例比较2019年GROMACS和2020年GROMAC。

图7中的图表比较了新的GROMACS 2020版本(启用了早期优化)与之前的2019.5版本在每个测试用例中的性能。该图显示,每种情况下实现的加速比都在2X到3X之间,其中加速比随问题大小而增加。标签显示了每种情况下的实际性能,以纳秒/天为单位,即在运行模拟的一天内可以模拟多少纳秒。这些性能优势是由于本文中描述的改进的结合。

当在单个GPU上运行时,多GPU通信的改进当然是不相关的,因此改进不那么显著。然而,由于整个时间步长可以在GPU上运行,并且避免了昂贵的PCIe传输,因此仍然有很大的优势。将多个仿真分配给同一个GPU时,您可能希望根据使用中的情况使用预先存在的代码路径–使用可用选项进行实验。

在运行上述性能比较时,但仅限于一个GPU(和一个主机CPU),我们观察到,在三个测试用例中,2020版(启用了所有优化)的加速比上一个2019版在1.4X–1.5X的范围内。

为模拟启用优化

此帖子中的优化尚未由启用违约。新的代码路径已经过标准GROMACS的验证回归测试,但仍然缺乏实质性的“真实世界”测试。我们强烈要求建议您根据默认路径仔细验证结果。任何所报告的问题将被开发团队感激地接收以提供帮助使软件成熟。

GROMACS应使用其内部螺纹MPI库而不是任何外部MPI库。有关更多信息,请参阅前面的Multi-GPU优化部分。

在运行时,可以通过将以下三个环境变量设置为shell中的任何非NULL值来完全启用优化(此处显示的是bash shell)。

对于PP任务之间的光环交换通信,请使用以下命令:

export GMX_GPU_DD_COMMS=真

对于PME和PP任务之间的通信,请使用以下命令:

导出GMX_GPU_PME_PP_COMMS=真

启用时间步长的更新和约束部分对于多GPU:

导出GMX_FORCE_UPDATE_DEFAULT_GPU=true

这些设置的组合将触发所有优化,包括依赖项,如缓冲区的GPU加速操作。

在单个GPU上运行时,仅GMX_FORCE_UPDATE_DEFAULT_GPU公司是必需的(如果仅用于单GPU,则可以通过添加-更新gpu选项mdrun软件命令)。

在单GPU和多GPU情况下,还需要通过以下选项将三类力计算分配给GPUmdrun软件:

-nb gpu-键合gpu-pme gpu

在多GPU上-核动力装置1选项也需要将PME限制为单个GPU。

当使用更新组时,新的GPU更新和约束代码路径仅支持与跨多个GPU的PP任务的域分解结合使用。这意味着除了小分子外,不支持约束所有键。

为了促进这一点,我们建议您将氢键的键转换为约束,而不是所有键。为此,在GROMACS预处理器grompp的.mdp输入文件中,更改以下行:

约束=所有债券

新行应如下所示:

约束=氢键

有关更多信息,请参阅mdp选项用户指南的第节。

这是全套mdrun软件运行4-GPU性能比较时使用的选项:

gmx mdrun-v-nsteps 100000-resetstep 90000-noconfout\
-ntmpi 4-ntump 10\
-nb gpu-绑定gpu-pme gpu-npme 1\
-nstlist 400

第一行指示GROMACS为这个相对较短的基准测试运行100000个步骤。定时计数器在步骤90000重置,以避免定时中包含初始化成本,因为这些对于长时间生产运行通常并不重要。选择这些特定值是为了让GROMACS有足够的时间自动执行PME调整,其中PME网格的大小被调整,以在PP和PME任务之间实现最佳负载平衡。类似地-诺康福特选项指示GROMACS在短期基准测试运行结束时不写入输出文件,以避免人为的高I/O开销。

第二行指定四个thread-MPI任务应该使用(每个GPU一个),每个线程10个OpenMP线程-MPI任务。正在使用40个OpenMP线程来匹配服务器中物理CPU内核的数量。

第三行将所有力计算卸载到GPU,如前所述。

决赛-nstlist 400标准选项指示GROMACS以400步的频率更新邻居列表。使用Verlet方案时,可以调整此选项,而不会损失任何精度。我们通过实验发现该值可以提供最佳性能。

接下来的步骤

有关使用的更多信息,请参阅GROMACS 2020发行说明用户指南有关此帖子中描述的发展的更多信息,请参阅GTC 19演示文稿在现代多GPU系统上加速GROMACS,可进行录制。

讨论(15)

标签