Lammps性能优化
Lammps(Large-scale Atomic/Molecular Massively Parallel Simulator)是一款大尺度原子分子大规模并行模拟程序。Lammps包含各种势能文件,可以用于模拟软物质(生物分子、多聚体)和固体(金属、半导体),以及粗粒化算法和介观系统的模拟。它可以在原子尺度、介观尺度、和连续介质尺度进行分子模拟。Lammps的并行处理能力很强,可以做到上万个核心的大规模分子动力学模拟。
Lammps对系统所有有着相互作用力的原子、分子做牛顿力学方程积分。为了效率考虑,Lammps使用邻近表来追踪附近的粒子。这些表对近程有排斥系统做了优化,使得局部的粒子密度不会过大。在并行机上,使用空间分解技术将仿真域划分为小的区域,分配给每个处理器。
Lammps算法分析
Lammps的计算过程可分为一下4个步骤:
- 找到一个合适的原子间势能(力场)文件,也可以去网站下载现有的势能文件。
- 编辑input输入文件。
- 计算。可以大规模GPU集群上进行后处理计算。
- 后处理。对计算结果进行后处理。
接下来基于metal算例进行测试,测试服务器搭载2*鲲鹏920 7260处理器,2*NVIDIA A100 GPU,软件栈如下所示。
项目 |
版本 |
---|---|
OS |
Kylin V10 |
内存 |
16*16GB |
MPI |
Hyper MPI |
编译器 |
毕昇2.4.0 |
MPS优化
通过性能特征分析发现GPU利用率比较低,GPU的功耗也没有达到最高,因此考虑使用MPS服务,NVIDIA多进程服务(MPS)是一种使多个CPU进程提交的计算内核能够在同一GPU上同时执行的工具。这种重叠可能实现更彻底的资源使用和更好的总体吞吐量。而且测试发现,当进程数为30时负载均衡最佳。使用MPS还可以通过更有效地重叠硬件资源利用率和更好地利用基于CPU的并行性,在多个GPU之间实现应用程序的强大扩展。
GPU编译选项参数优化
编译选项 |
优化原理 |
---|---|
-O 0 1 2 3 4 |
代码优化级别,这里选择O4。 |
-use_fast_math |
使能向量化、cache对齐、FTZ等内容。 |
--fmad |
是否使能乘加合并计算,这里设为--fmad=true。 |
跨卡优化
默认情况下两张卡都共用一个CPU,因此会抢占PCIE总线,造成不必要的资源冲突,因此需要固定CPU各使用一张卡,如下图所示。
kernel代码优化
针对热点Kernel(k_eam_fast)代码,根据采集的特征分析发现存在数据依赖(stall long scoreboard)和重复计算的问题,如下所示。
- 通过Nsight Compute工具分析发现535和536行存在数据依赖,将变量移至shared memory中处理。
优化前:
for ( ; nbor<nbor_end; nbor+=n_stride) { int j=dev_packed[nbor]; j &= NEIGHMASK;
优化后:
for ( ; nbor<nbor_end; nbor+=n_stride) { __shared__int j; j=dev_packed[nbor]; j &= NEIGHMASK;
- 减少重复计算。
f.x+=delx*force; f.y+=dely*force; f.z+=delz*force; if (EVFLAG && eflag) { energy += phi; } if (EVFLAG && vflag) { virial[0] += delx*delx*force; virial[1] += dely*dely*force; virial[2] += delz*delz*force; virial[3] += delx*dely*force; virial[4] += delx*delz*force; virial[5] += dely*delz*force; }
优化后:acctyp4 t1; t1.x=delx*force; t1.y=dely*force; t1.z=delz*force; f.x+=t1.x; f.y+=t1.y; f.z+=t1.z; if (EVFLAG && eflag) { energy += phi; } if (EVFLAG && vflag) { virial[0] += delx*t1.x; virial[1] += dely*t1.y; virial[2] += delz*t1.z; virial[3] += dely*t1.x; virial[4] += delx*t1.z; virial[5] += delz*t1.y;
经过上述优化后,鲲鹏平台性能实现大幅提升。