这篇文章记录使用Cmake安装Lammps过程

目标编译的包

  • mpi并行
  • kokkos
  • GPU
  • Voronoi
  • Reaxff

系统信息

  • win11下的wsl2,ubuntu 22.04

更新

  • sudo apt update
  • sudo apt upgrade

安装基础依赖

1
2
3
sudo apt install cmake build-essential \
ccache gfortran openmpi-bin libopenmpi-dev \
libfftw3-dev libblas-dev liblapack-dev

安装lammps

  • 此处我们下载stable版本

    1
    wget https://download.lammps.org/tars/lammps-stable.tar.gz
  • 解压

    1
    tar xvf lammps-stable.tar.gz
  • 进入lammps目录,建立build文件夹

    1
    cd lammps-2Aug2023/ && mkdir build && cd build

编译Lammps

  • 首先我们测试编译最基础的部分

    1
    cmake -C ../cmake/presets/basic.cmake ../cmake
  • 生成makefile
    Alt text
    这里有几个重点可以看见,比如FFMPEG这个依赖我们没有安装,所以没有找到,这个依赖主要适用于一些图片,动画的处理,对于我们来说是不需要的,所以不需要安装,下面显示我们需要安装的有openmpi, MPI, FFTW。这些都是计算相关的,是我们需要注意的。

  • 编译

    1
    make -j 8

    这一步是实际编译过程,-j 8代表使用8个核来编译。

  • 测试
    编译完成以后文件夹下就会生成一个可执行文件 lmp,使用这个便可以进行计算。

    1
    2
    cp ../examples/melt/in.melt .
    mpirun -np 8 ./lmp -in in.melt

    瞬间就完成了计算
    Alt text

个别库的安装

实际上到这里并行版本的lammps安装已经完成了,但是lammps包含了很多额外的库,很多是需要手动安装的,接下来我们来安装几个常用的库。

  • 使用cmake编译不要和老版本的make安装混用,如果之前使用过make machine这样的方式,需要使用make no-all purge来卸载掉所有文件,需要保持src目录干净。

安装GPU驱动

  • 在windows环境更新显卡驱动,不要在wsl2环境再次安装驱动
  • 使用nvidia-smi检查显卡驱动版本
    Alt text
  • 在wsl2中安装cudatool-kit,和驱动版本保持一致,我这里是12.1

    1
    2
    3
    wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run 

    sudo sh cuda_12.1.0_530.30.02_linux.run
  • 添加环境变量

    1
    2
    export PATH="/usr/local/cuda-12.1/bin:$PATH"
    export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
  • 检查是否安装成功

    1
    nvcc -V

    Alt text

  • 编译GPU,Kokkos,Reaxff,VORONOI

    修改../cmake/kokkos-cuda.cmake中的ARCH为ADA89 (40系列显卡都是这个架构)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # preset that enables KOKKOS and selects CUDA compilation with OpenMP
    # enabled as well. This preselects CC 5.0 as default GPU arch, since
    # that is compatible with all higher CC, but not the default CC 3.5
    set(PKG_KOKKOS ON CACHE BOOL "" FORCE)
    set(Kokkos_ENABLE_SERIAL ON CACHE BOOL "" FORCE)
    set(Kokkos_ENABLE_CUDA ON CACHE BOOL "" FORCE)
    set(Kokkos_ARCH_ADA89 ON CACHE BOOL "" FORCE)
    set(BUILD_OMP ON CACHE BOOL "" FORCE)

    # hide deprecation warnings temporarily for stable release
    set(Kokkos_ENABLE_DEPRECATION_WARNINGS OFF CACHE BOOL "" FORCE)

    Cmake命令如下:
    这里GPU_ARCH数字可以在这里查看,我是4060,对应就是sm_89.

    1
    cmake -C ../cmake/presets/basic.cmake -C ../cmake/presets/kokkos-cuda.cmake -D PKG_GPU=on -D GPU_API=cuda -D GPU_ARCH=sm_89 -D PKG_VORONOI=on -D DOWNLOAD_VORO=yes -D PKG_REAXFF=on -D PKG_OPENMP=yes ../cmake

    简单解释一下cmake命令,lammps中包含了很多的库,对于不需要额外依赖或者设置的库,比如REAXFF,只需要添加 -D PKG_REAXFF=on 就行了,对于其他的库,则可能需要添加不同的输入参数,具体可以在这里查看

    接下来就是很尴尬的一点,因为笔记本内存只有16G,且wsl2似乎内存管理很不好,我只能单核编译,需要很久,内存小,没办法,只能等着。
    如果你内存32G往上,可以尝试make -j 4,我在另外一台ubuntu (124 G内存)上编译,开启-j 8,很快就编译好了。当然,如果不编译kokkos包的话,编译其他的还是可以随便-j 8 跑的,这样速度就很快了,从我测试结果来看,笔记本是很不适合安装kokkos的。

    还有一个很大的坑,如果现在直接编译,经过漫长的等待以后,会显示报错:

    Alt text

    这个问题和kokkos包编译直接相关,我一开始看见网上说把第一个-C去掉,就不会显示这个报错了,我就测试了一下,经过漫长的编译以后,确实不报错了,但是基础的包比如MANYBODY也没有编译呀,当你再想编译的时候,又会继续报错。

    然后我就想着应该是cufft这个lib没有找到,我一开始尝试把路径添加进去:

    1
    export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH

    逻辑上感觉是可以的,但是还是不行。

    然后我尝试了一下软连接:

    1
    sudo ln -s /usr/local/cuda-12.1/lib64/libcufft.so /usr/lib/libcufft.so

    再次编译,这下终于OK了

    但是,我还要说但是,我在我原生的UBUNTU电脑上测试,根本不需要这个步骤,直接make -j 8很快就OK了,所以这wsl2????算了,接下来简单跑跑测试。

    1
    make

性能测试

  • 这里跑一个eam的例子。

    1
    cp ../potentials/Cu_zhou.eam.alloy .
  • gpu.in文件内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    dimension 3
    boundary p p p
    atom_style atomic
    units metal

    lattice fcc 3.615
    region 1 block 0 50 0 50 0 50
    create_box 1 1
    create_atoms 1 box

    pair_style eam/alloy
    pair_coeff * * Cu_zhou.eam.alloy Cu

    thermo 100

    fix 1 all nve

    run 500
  • 测试了mpi并行和GPU加速和kokkos-GPU加速,计算命令如下:

    MPI并行 16 cores

    1
    mpirun -np 16 ./lmp -in gpu.in

    OpenMP并行 32 threads

    1
    ./lmp -in gpu.in -sf omp -pk omp 32

    GPU加速

    1
    ./lmp -in gpu.in -sf gpu -pk gpu 1

    kokkos-GPU

    1
    ./lmp -in gpu.in -k on g 1 -sf kk

    对于这个50w铜原子体系,16核CPU并行速度为0.545 ns/day;要知道7945hx已经是笔记本上最强的CPU了。GPU包加速跑出了2.95 ns/day的成绩;GPU包果然名不虚传,4060这计算性能也不错。而且实际上如果把thermo的频率降低的话还能计算更快,让更多的数据跑在GPU上,减少和CPU的数据传输就能提高计算速度。可是kokkos-GPU加速就很拉跨了,才0.579 ns/day, 有可能因为4060的双精度计算能力太拉了,kokkos只支持双精度目前,GPU则是在混合精度跑的。

    当体系增大到200w原子后,kokkos-GPU显存占用5.4G,速度为0.145 ns/day。此时GPU包直接使用则会爆显存 (4060 显存8G还是不够看呀),于是我额外设置了neigh no,这样neighbor list就会在CPU端完成,当需要频繁更新邻域时候这样会降低计算效率,但是好处是可以节约显存,对于这个案例由于不需要更新邻域,所以在设置neigh no以后,显存占用降低到5.2G,计算速度依然保持在很高的0.61 ns/day, 吊打kokkos,遥遥领先!还有一点,在输出时候,kokkos中的Modify这一项居然高达60%,这应该是很不合理的,但是还没有找到在哪里设置。32线程的openmp速度为0.153 ns/day, 16核MPI并行速度为0.134 ns/day,确实弟中弟。

总结

最近LAMMPS一直在推Cmake安装,确实简单了许多,很多库的安装也会流程化,虽然可能会遇见一些bug,但是这条路远比之前的make安装方便了许多。