---
title: LAMMPS性能优化
description: "LAMMPS（Large-scale Atomic/Molecular Massively Parallel Simulator）是一款大尺度原子分子大规模并行模拟程序。LAMMPS包含各种势能文件，可以用于模拟软物质（生物分子、多聚体）和固体（金属、半导体），以及粗粒化算法和介观系统的模拟。它可以在原子尺度、介观尺度、和连续介质尺度进行分子模拟。LAMMPS的并行处理能力很强，可以做到上万个核心的大规模分子动力学模拟。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/gputuing-wp/kunpenggpu_19_0039.html
sourcePath: /source/zh/perftuning/gputuing-wp/kunpenggpu_19_0039.html
indexId: 165986afe2192e80a703a2670c8b86550190f8ffda5c4c2806babb6ce0e59c3957
---
# LAMMPS性能优化

LAMMPS（Large-scale Atomic/Molecular Massively Parallel Simulator）是一款大尺度原子分子大规模并行模拟程序。LAMMPS包含各种势能文件，可以用于模拟软物质（生物分子、多聚体）和固体（金属、半导体），以及粗粒化算法和介观系统的模拟。它可以在原子尺度、介观尺度、和连续介质尺度进行分子模拟。LAMMPS的并行处理能力很强，可以做到上万个核心的大规模分子动力学模拟。

LAMMPS对系统所有有着相互作用力的原子、分子做牛顿力学方程积分。为了效率考虑，LAMMPS使用邻近表来追踪附近的粒子。这些表对近程有排斥系统做了优化，使得局部的粒子密度不会过大。在并行机上，使用空间分解技术将仿真域划分为小的区域，分配给每个处理器。

#### LAMMPS算法分析

LAMMPS的计算过程可分为以下4个步骤：

1. 找到一个合适的原子间势能（力场）文件，也可以去网站下载现有的势能文件。
  下载链接：https://www.ctcms.nist.gov/potentials/(https://www.ctcms.nist.gov/potentials/)

2. 编辑输入文件。
3. 计算。可以在大规模GPU集群上进行计算。
4. 后处理。对计算结果进行后处理。


接下来基于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）和重复计算的问题，如下所示。

1. 通过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;
```


2. 减少重复计算。
  优化前：

```
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;
}
```


  经过上述优化后，鲲鹏平台性能实现大幅提升。
