完成基准测试后,可以重置这些显卡,使它们以受支持的最高频率运行:
性能数据的免责声明
虽然已在生产系统上生成表示性能的数据,但它们仅用作指南以说明下面介绍的方法。请注意,您系统上的性能可能会不同,原因是 CPU 和GPU 的性能受到多个方面的影响。
最简单的方法:每个 GPU 一个进程
要使用我们系统中的所有 4 个 GPU,最简单的方法就是启动 VASP 的 4 个 MPI 进程,并让系统自动处理映射(即进程将在哪些 CPU 核心上运行):
mpirun -n 4 ~/bin/vasp_gpu
英特尔 MPI 环境自动将进程固定到特定的 CPU 核心,这就使操作系统无法在作业执行期间将进程移到其他核心,从而防止在一些不利的情况下进行数据移动。但是,这样做仍可能导致获得的是次佳的解决方案,原因是所实现的 MPI 并不了解 GPU 拓扑。我们可以通过增加详细程度来研究进程固定:
mpirun -n 4 -genv I_MPI_DEBUG=4 ~/bin/vasp_gpu
查看输出,并与我们有关互连拓扑的发现进行比较,可以看到事情似乎并不理想:
...
[0] MPI startup():
Rank
Pid
Node name
Pin cpu
[0] MPI startup():
0
41587
hsw227
{16,17,18,19,20,21,22,23}
[0] MPI startup():
1
41588
hsw227
{24,25,26,27,28,29,30,31}
[0] MPI startup():
2
41589
hsw227
{0,1,2,3,4,5,6,7}
[0] MPI startup():
3
41590
hsw227
{8,9,10,11,12,13,14,15}
Using device 0 (rank 0, local rank 0, local size 4) : Tesla P100-PCIE-16GB
Using device 1 (rank 1, local rank 1, local size 4) : Tesla P100-PCIE-16GB
Using device 2 (rank 2, local rank 2, local size 4) : Tesla P100-PCIE-16GB
Using device 3 (rank 3, local rank 3, local size 4) : Tesla P100-PCIE-16GB
...
rank 0 使用 GPU0,但绑定到更远的 CPU 核心 16-23。rank 2 和 3 同样出现此问题。只有 rank 1 使用 GPU1 并固定到核心 24-31,从而提供最佳传输性能。
我们现在来看看一些实际的性能数据。如果使用我们系统中的两个 Intel® Xeon® E5-2698 v3 CPU 的所有 32 个核心,并且不进行任何 GPU 加速,则需要 607.142 秒来完成 siHugeShort 基准测试。1如果以这种默认但次佳的方式使用 4 个 GPU,执行时间将为 273.320 秒(速度提高 2.22 倍)。使用 VASP 中包含的以下指标快速知道计算的运行时间
1 如果您以前编译过 VASP 的仅限 CPU 的版本,则可以使用以下命令知道它在您的系统上要运行多长时间:mpirun -n 32 -env I_MPI_PIN_PROCESSOR_LIST=allcores:map=scatter ~/bin/vasp_std
grep Elapsed\ time OUTCAR
VASP 将 GPU 连续映射到 MPI rank 进程,同时忽略计算能力不足的 GPU(如果有的话)。通过这样做并且使用以下语法,我们可以手动控制 CPU 上的进程放置和分配 rank,让每个进程均使用具有最短内存传输路径的 GPU:
mpirun -n 4 -genv I_MPI_DEBUG=4 -env I_MPI_PIN_PROCESSOR_LIST=0,16,21,26 ~/bin/vasp_gpu
这样做并未改善系统性能(运行时间为 273.370 秒),原因可能是没有均衡地使用公共的 CPU 资源,例如内存带宽和缓存(3 个进程共享一个 CPU)。作为折衷,用户可以分配 rank,让它们在 CPU 插座之间均匀分布,但只有一个 rank 必须使用较慢的内存路径向 GPU 传输数据:
mpirun -n 4 -genv I_MPI_DEBUG=4 -env I_MPI_PIN_PROCESSOR_LIST=0,8