中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

Lammps性能优化

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

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

Lammps算法分析

Lammps的计算过程可分为一下4个步骤:

  1. 找到一个合适的原子间势能(力场)文件,也可以去网站下载现有的势能文件。

    下载链接:https://www.ctcms.nist.gov/potentials/

  2. 编辑input输入文件。
  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;

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

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词