现在,开始阅读此《GPU Ready Apps Guide》(GPU Ready 应用程序指南)。
可以从 GROMACS 网站下载 GROMACS(版本 5.1.2)。在以下示例中,命令行会将“VERSION”替换为 5.1.2 或您要使用的最新或所需 GROMACS 版本。截止本文写作时,版本 5.1.4 已发布,经证明其性能优于版本 5.1.2。
要配置(使用 CMake)并构建 GPU 加速版本,需要以下软件:
*推荐使用最新的 CUDA 版本(当前为 7.5)以及所用 CUDA 版本支持的最新 gcc 版本。
$ wget ftp://ftp.gromacs.org/pub/gromacs/gromacs-VERSION.tar.gz
$ tar -xzvf gromacs-VERSION.tar.gz
$ mkdir gromacs-VERSION-build
$ cd gromacs-VERSION-build
$ CC=gcc CXX=g++ cmake <GROMACS_SRC_DIR> -DGMX_OPENMP=ON -DGMX_GPU=ON -
DGPU_DEPLOYMENT_KIT_ROOT_DIR=<GDK_PATH> -DGMX_BUILD_OWN_FFTW=ON -
DGMX_PREFER_STATIC_LIBS=ON -DCMAKE_BUILD_TYPE=Release -
DCMAKE_INSTALL_PREFIX=<GROMACS_INSTALL_DIR>
请将
GROMACS 5.1 GPU 频率可以通过 NVML 进行自动调整,以实现最佳性能。要构建可选的 NVML 支持,需要使用 GPU 部署套件 (GDK)。
下载并安装此套件后,请将
这里其他的一些配置是使用 CMake 选项设定的,例如使用 -DGMX_OPENMP=ON 启用 OpenMP 支持。通过 -DGMX_BUILD_OWN_FFTW=ON 配置选项,可以在 GROMACS 构建期间下载并构建 FFTW。这将确保为 FFTW 选择了正确的优化标志。或者,可以使用指定的 FFTW 安装;请参阅 GROMACS 安装说明的 FFTW 一节以获取详细信息。如需了解每个选项的详细信息,请参阅 GROMACS 手册。
$ CC=mpicc CXX=mpicxx cmake <GROMACS_SRC_DIR> -DGMX_OPENMP=ON -DGMX_GPU=ON
-DGPU_DEPLOYMENT_KIT_ROOT_DIR=<GDK_PATH> -DGMX_MPI=ON -DGMX_BUILD_OWN_FFTW=ON -DGMX_PREFER_STATIC_LIBS=ON -
DCMAKE_BUILD_TYPE=Release -DGMX_BUILD_UNITTESTS=ON -DCMAKE_INSTALL_PREFIX=<GROMACS_INSTALL_DIR>
要构建并安装 GROMACS,请使用以下命令:
$ make
$ sudo make install
安装后要检查 GROMACS 的正确性,请向配置命令中添加 -DREGRESSIONTEST_DOWNLOAD=ON 选项,并在“make install”之前运行“make check”。另外,您可以使用“make -jN”,N 是平台中用于加速 make 进程的核心数。
如需了解安装选项的更多详细信息,请参阅 GROMACS 安装指南。
GROMACS 提供了一些脚本,用于为不同的 shell 设置环境。要设置 PATH 和其他环境,可使用以下命令。
如果按上述内容同时构建 MPI 和非 MPI 二进制文件,您会在安装版本的 bin 文件夹中找到“gmx”和“gmx_mpi”。本指南中描述的示例使用 GROMACS ftp 中的“水”数据集。使用这些数据集运行 GROMACS 首先需要下面所述的数据准备步骤。可以在此处找到为运行 GROMACS 的输入准备相关的更多详细信息/选项。
要运行 GROMACS,需要执行以下两个步骤:
1. 使用 grompp (GROMACS 预处理程序)准备输入内容
a.对于单节点版本: $ gmx grompp -f
2. 启动 mdrun
a.对于单节点版本, $ gmx mdrun
b。对于 MPI 版本 (np = #GPUs):$ mpirun –np
对于较小的节点计数,这些设置通常可以提供出色的性能。不过,进行一些调整往往能提高 GROMACS 的模拟性能。对于较大的节点计数,手动调整更为重要。请参阅 GROMACS 手册 和 gmx-users 邮件列表以及发表的论文,以了解详细信息。
文档中说明了与 GPU 相关的性能调整选项。可 下载用于基准测试的输入集。
通过调整静电截断(超过后由长程部分处理力的距离),GROMACS 可以将工作从 CPU(PME 任务)转移到 GPU(PP 任务)(可以使用 –tunepme 命令行开关禁用自动启用)。由于存在准确性限制,因此无法实现反向转移。例如,在 GPU 完成 PP 任务的速度比 CPU 更快(请参阅下图)的情况下,GROMACS 会将工作从 CPU 转移到 GPU,从而缩短应用程序运行时间。
PP 任务的复杂性为 O(m*n),而 PME 任务的复杂性为 O(n log(n)),其中 n 是粒子数,m 是近邻列表的大小。通常,m 的值介于 200 到 400 之间,远小于 n。
以下设置可用于调整 GROMACS 的性能。
通过使用 MPI 和 OpenMP,GROMACS 能够利用集群中所有可用的 GPU 和 CPU 资源。最佳启动配置因输入集与网络功能而异。这些启动配置包括每逻辑核心一个 MPI 进程且每个带有一个 OpenMP 线程,到每节点一个 MPI 进程且使用节点内所有可用核心。要选择最佳启动配置,可遵循以下准则:
Computing: | Num Ranks | Num Threads | Call Count | Wall time (s) | Giga-Cycles | total sum % |
[…] | ||||||
Comm. coord. | 2 | 10 | 252681 | 63.467 | 3808.202 | 3.6 |
[…] | ||||||
Comm. energies. | 2 | 10 | 25917 | 1.108 | 66.457 | 0.1 |
Total | 1782.537 | 106957.655 | 100.0 | |||
Breakdown of PME mesh computation | ||||||
[…] | ||||||
PME 3D-FFT Comm. | 2 | 10 | 518322 | 126.829 | 7610.103 | 7.1 |
[…] |
脚本 1 md.log 中通信花费的时间
对于 MPI 版本,可以通过所用 MPI 实现的启动程序 (-np parameter) 来控制 MPI 秩数,而 OpenMP 线程数可以通过 mdrun 命令行选项 –ntomp 或环境变量 OMP_NUM_THREADS 进行控制。mdrun 的单节点版本使用线程 MPI(基于线程的内部 MPI 实现)和 OpenMP。对于此版本,OpenMP 线程数还可以使用命令行选项 –ntomp 来控制,而 MPI 秩数可以使用 –ntmpi 来控制。对于 GROMACS 的 GPU 加速版本,每个 GPU 必须至少有一个 MPI 秩才能利用所有可用 GPU。
GROMACS OpenMP 线程和 MPI 进程应正确固定到系统的核心/线程。此操作可以通过所用的 MPI 启动程序/批处理系统或 GROMACS 完成。默认情况下,GROMACS 会尝试自动固定线程,但是在某一固定已由 MPI 启动程序、OpenMP 实现完成或者可用的逻辑核心数与节点上使用的总线程数不匹配的情况下,此功能将关闭。在这种情况下,如果固定并非由 MPI 启动程序或批处理系统完成,可以使用选项 –pin 启用固定。
使用系统中的所有逻辑核心(也称为 SMT 或超线程)通常会小幅提升性能。
GROMACS 的 GPU 内核未利用 GPU 的所有功能和散热预算。因此,建议通过应用程序频率将 GPU 频率提高到最大支持值,此操作也很安全。从 GROMACS 5.1 开始,如果应用程序频率权限设置为“UNRESTRICTED”(无限制),此操作将由 gmx 可执行程序自动完成,因此您应看到类似以下的输出内容:Changing GPU clock rates by setting application clocks for Tesla K80 to (2505,875)
如果应用程序频率权限设置为“RESTRICTED”(受限制),GROMACS 会发出相关警告,输出类似以下的内容:
Not possible to change GPU clocks to optimal value because of insufficient permissions to set application clocks for Tesla K80.Current values are (2505,562).Max values are (2505,875) Use sudo nvidia-smi -acp UNRESTRICTED or contact your admin to change application clock permissions.
按照警告消息中的指示,您可以使用
$ sudo nvidia-smi -acp UNRESTRICTED
将应用程序频率权限更改为“UNRESTRICTED”(无限制)。
如果您的 GROMACS 构建不包含 GDK,GROMACS 将发出类似以下内容的警告消息:
GROMACS was configured without NVML support hence it can not exploit
application clocks of the detected Tesla K80 GPU to improve performance.
(GROMACS 未配置 NVML 支持,因此无法利用检测到的 Tesla K80 GPU 的应用程序频率来提高性能)Recompile with the NVML library (compatible with the driver used) or set application clocks manually.(请使用(与所用驱动程序兼容的)NVML 库来重新编译,或手动设置应用程序频率。)
在这种情况下,可手动使用类似以下内容的命令配置最大加速频率。请注意,对于不同的 GPU,具体的最大频率设置将有所不同。
$ nvidia-smi -ac 2505,875 # 这是 K80 GPU 的最大频率
如需了解 GPU Boost 的更多详细信息,请参阅 使用 GPU Boost 和 K80 Autoboost 提高性能。
当使用韦尔莱截断方案(GPU 加速所需)时,可以自由选择近邻列表的更新间隔。如果近邻列表搜索花费很长时间,可以延长近邻列表的更新间隔。md.log 文件中指定了近邻列表搜索的时间(请参阅“脚本 2 md.log 中近邻列表搜索花费的时间”)。可能需要增加截断半径时,此操作将自动完成。由于近邻列表是在 CPU 上计算,且较长的截断半径会导致进行更多的力计算,因此增大 nstlist 会将部分工作从 CPU 转移到 GPU。除了近邻列表计算需要 MPI 秩之间的通信外,这还会以通信换取计算。
Computing: | Num Nodes |
Num Threads |
Call Count |
Wall time (s) |
Giga-Cycles | total sum % |
[…] | ||||||
Neighbor search | 2 | 10 | 6480 | 32.464 | 1947.963 | 1.8 |
[…] | ||||||
Total | 1782.537 | 106957.655 | 100.0 |
[…] |
Force evaluation time GPU/CPU: 4.972 ms/5.821 ms = 0.854 |
For optimal performance this ratio should be close to 1! |
[…] |
脚本 3 md.log 中的 PME PP 负载均衡输出
如上所述,可以均衡 PME 节点与 PP 节点之间的负载。默认情况下,此功能处于启用状态,可使用参数 –notunepme 将其关闭。对于单进程 GPU 加速运行,将在输出文件 md.log 中报告 PP (GPU) / PME (CPU) 负载均衡(请参阅“脚本 3 md.log 中的 PME PP 负载均衡输出”)
PME 网格计算的分解
Breakdown of PME mesh computation | ||||||
PME redist. X/F | 2 | 10 | 518322 | 167.004 | 10020.730 | 9.4 |
PME spread/gather | 2 | 10 | 518322 | 429.501 | 25771.381 | 24.1 |
PME 3D-FFT | 2 | 10 | 518322 | 123.600 | 7416.369 | 6.9 |
PME 3D-FFT Comm. | 2 | 10 | 518322 | 126.829 | 7610.103 | 7.1 |
PME solve Elec | 2 | 10 | 259161 | 13.470 | 808.259 | 0.8 |
脚本 4 md.log 中 PME 任务花费的时间
使用 PME 处理长程非键合相互作用是一项通信密集型任务,因为它需要执行 3D FFT。由于 PP 和 PME 任务相互独立,因此 GROMACS 支持启动所谓的单独 PME 节点(仅执行 PME 任务的进程),以便通过 MPMD 方式减少网络压力。默认情况下,仅当不使用 GPU 时,才会自动确定 PME 秩。可以使用参数 –npme 对其进行微调。如果输出文件 md.log 中报告的 PME 任务的通信时间较长,应考虑单独的 PME。通常会发生于 3-4 个或更多节点的情况下。
有两种不同选项可将 MPI 秩映射到与 GROMACS 的 GPU 加速运行相关的 PP 和 PME 节点:
在很多情况下,在多个 MPI 秩之间共享 GPU 会提高性能。
对于使用 GROMACS 的非 MPI 构建这样的单节点情况,只需通过使用 -ntmpi 和参数的线程 MPI 并将 -ntmpi 设置(或允许 GROMACS 为您设置)为每个 GPU 运行 2 个或多个 MPI 秩即可提供相关支持。
对于使用 GROMACS 的 MPI 构建这样的多节点运行,可以通过多进程服务 (MPS) 在支持计算能力 3.5 的 GPU 上共享 GPU。这需要将所用 GPU 设置为独占进程模式,并在每个节点上启动 MPS 控制守护程序 (nvidia-cuda-mps-control):
#!/bin/bash
sudo nvidia-smi -c 3
nvidia-cuda-mps-control -decho " -started nvidia-cuda-mps-control on `hostname`"
用于在单个节点上启动 MPS 的示例脚本
#!/bin/bash
echo quit | nvidia-cuda-mps-control
sudo nvidia-smi -c 0
echo " stopping MPS on `hostname`"
用于在单个节点上停止 MPS 的示例脚本
可以在 此处找到有关 MPS 的更多信息。
系统提供了一些更高级的区域分解设置。对于非均匀系统(例如,每个区域的原子数),调整这些选项可以进一步提高性能。请参阅 GROMACS 手册或 GROMACS 用户邮件列表,以获取更多信息。
免责声明
*GROMACS 提供了很多选项,用于调整性能以处理不同的输入内容以及在不同的架构/系统上进行处理。指令集涵盖了对于 GPU 加速 GROMACS 而言重要的方面。
本节将为您说明几个运行 GROMACS 的示例。可以从 此处获取用于这些示例的输入数据集。
要开始使用,请下载并解压缩档案文件
$ wget ftp://ftp.gromacs.org/pub/benchmarks/water_GMX50_bare.tar.gz
$ tar -zxvf water_GMX50_bare.tar.gz
此数据包括具有不同大小的示例“水”数据,其文件夹名称类似 0384、0768 和 1536。文件夹名称对应原子数(以千计),即文件夹 0768 包含具有 25.6 万个水分子及 76.8 万个原子的用例。第一步是使用 grompp 工具准备数据。
例如,要运行用例 1536,请使用以下命令。如果您要使用粒子网格埃瓦尔德 (Particle Mesh Ewald, PME),请使用 pme.mdp。运行下列命令将生成 topol.tpr 文件,该文件用作 GROMACS mdrun 的输入内容。
$ cd water-cut1.0_GMX50_bare/1536
$ gmx grompp -f pme.mdp
以下是一些在 1 个或 2 个节点上使用及不使用 GPU 运行 GROMACS 的不同变化,并代表了本节结束时一部分用于收集示例结果的用例。
GPU 示例中使用的 MPI 秩数取决于系统中的 GPU 数以及每个 GPU 的 MPI 秩数。在大多数情况下,每个 GPU 运行多个 MPI 秩可以提高性能。此操作可以通过将线程 MPI 用于单节点示例来实现,也可以通过在多个节点上运行时使用 CUDA MPS 功能实现。本指南中说明了有关 CUDA MPS 的一些其他详细信息。
通常,在使用 GPU 时,建议对每个秩使用 2 到 6 个 OMP 线程。可以使用 -ntomp 或变量 OMP_NUM_THREADS 指定所需的每个秩的 OMP 线程数。通常需要实验来调整 MPI 秩数与每个秩的线程数的相对关系,以确定最适用于特定系统配置和输入数据的设置。
在下面的示例 1、2 和 4 中,使用 2 块 Tesla K80,即每个节点上有 4 个 GPU(2 块 K80 板)。
5 个示例运行于具有 2 个 haswell CPU 插槽的节点
示例 1. 未指定启动参数(ntmpi 和 ntomp),因此 GROMACS 将自动确定每个 GPU 的 MPI 秩数以及要对每个秩启动的 OMP 线程数。
使用线程 MPI 在具有 4 个 GPU 的单节点上运行,允许 GROMACS 自行确定启动参数(ntmpi 和 ntomp)。
$ GROMACS_BIN_DIR/gmx mdrun -resethway -noconfout -nsteps 4000 -v -pin on -nb gpu
如果您有时间进行实验,可以尝试使用每 GPU 的 MPI 秩数与每秩的 OMP 线程数的所有可用组合,以确定最合适的设置。可用选项取决于每个节点的 CPU 核心总数和 GPU 数。例如,如果每个节点有 4 个 GPU 和 32 个 CPU 核心,可以尝试下面的组合以确定提供最佳性能的设置。
-ntmpi 4 -ntomp 8 | # 1 rank per GPU with 8 threads per rank |
-ntmpi 8 -ntomp 4 | # 2 MPI ranks per GPU with 4 threads per rank |
-ntmpi 16 -ntomp 2 | # 4 MPI ranks er GPU with 2 threads per rank |
对于下面的示例 2-5,所选用例提供基准测试系统上的最佳结果。
示例 2. 运行条件:单节点,4 GPU,每秩 4 OMP 线程,8 秩,每 GPU 2 MPI 秩,使用线程 MPI
$ GROMACS_BIN_DIR/gmx mdrun -ntmpi 8 -ntomp 4 -resethway -noconfout -nsteps 4000 -v -pin on -nb gpu
示例 3.运行条件:单节点,仅 CPU 核心,每秩 1 OMP 线程,32 秩,使用线程 MPI
$ $GROMACS_BIN_DIR/gmx mdrun -ntmpi 32 -ntomp 1 -resethway -noconfout -nsteps 4000 -v -pin on -nb cpu
示例 4.运行条件:2 节点,每节点 4 GPU,每秩 2 OMP 线程,每节点 16 秩,每 GPU 4 MPI 秩,使用 CUDA MPS 以允许每个 GPU 运行多个 MPI 秩:
$ OMP_NUM_THREADS=2 mpirun -np 32 $GROMACS_BIN_DIR/gmx_mpi mdrun -resethway -noconfout -nb gpu -nsteps 8000 -v -pin on
示例 5.运行条件:2 节点,仅 CPU 核心,每秩 1 OMP 线程,每节点 32 秩
$ OMP_NUM_THREADS=1 mpirun -np 64 $GROMACS_BIN_DIR/gmx_mpi mdrun -resethway -noconfout -nb cpu -nsteps 8000 -v -pin on
本节将介绍单个节点上的多 GPU 性能。此外,基准测试将展示每节点两块 Tesla P100 GPU 卡的一个、两个、三个和四个节点的对应性能。每块 P100 卡都有一个 Pascal GPU。此运行使用描述大小为 0768、1536 和 3072 的水数据所需的命令行变体完成。