安装LAMMPS

# 安装LAMMPS

本节教程定位到手册 (opens new window)的install & Build LAMMPS两节。

由于软件的复杂性和配置的多样性,不建议使用除linux以外的操作系统,不建议使用预编译包。本教程为了简明起见,以Ubuntu18.04 LTS 为例,若使用CentOS,请照葫芦画瓢,手动升级编译器和相关依赖。我们强烈建议选择使用cmake安装LAMMPS, 而不是去使用Makefile

源代码内容:

文件夹名 描述
README 介绍
LICENSE GPL协议
bench 基准测试相关
cmake CMake编译相关
doc 文档相关
examples 示例相关
lib 外部库相关
potential 势函数相关
python python接口相关
src 源码相关
tools 数据前后处理相关

# 从GitHub下载源代码

使用git命令直接从Github上拉取代码

git clone https://github.com/lammps/lammps.git 
1

# 从官方网站下载源代码

官方网站 (opens new window)上下载压缩包

# 使用CMake编译LAMMPS

我们强烈建议使用CMake编译。原因在于CMake可以自动检测当前环境和所依赖的库路径,还可以使用预配置文件。

同时我们将展示GPU加速包的编译,这个包并不影响正常使用,可以跳过。

# 安装依赖

apt install build-essential
apt install cmake
apt install gfortran    
apt update
apt upgrade
1
2
3
4
5

FFTW,快速傅里叶变换所需的软件包,如果没有安装其他版本,将会使用LAMMPS自带;如果有其他版本,CMake将会自动检测。

安装并行LAMMPS所需的并行框架mpich,若使用OpenMpi请举一反三。首先去官方网站 (opens new window)下载mpich3的源码,然后

tar -zxvf mpich3.tar.gz #解压缩
./configure --enable-shared=yes #--enable-shared=yes是必不可少的参数;如果安装到其他路径,注意环境变量的问题。
make
make install
1
2
3
4

# 编译LAMMPS

cd lammps #进入源码根目录
mkdir build
cd build
1
2
3

这里我们需要讨论一下如何选择需要编译的包。众所周知,巴比塔不是一伙人建成的,同样,LAMMPS开发组也不会事必躬亲,所以肯定要借助别人的代码来完善功能。由于这些代码的贡献者不同,因此很多功能不能合并到主线当中;又或者是有些包是只有少部分人会用到或者还要依赖其他的工具,因此给出了一个选项,允许各位选择什么包需要编译,什么包不需要。这个文件就叫*.cmake*。

什么是编译?

我们打开这个cmake文件,它位于根目录下的cmake文件夹的presets中:

# lammps/cmake/presets/minimal.cmake
# 预设文件只打开了少量常用的包,使得编译速度最快且大部分脚本可以使用

set(ALL_PACKAGES KSPACE MANYBODY MOLECULE RIGID)

foreach(PKG ${ALL_PACKAGES})
  set(PKG_${PKG} ON CACHE BOOL "" FORCE)
endforeach()

1
2
3
4
5
6
7
8
9

这几行代码是 不言自明 的。很显然,set()声明了一个名为ALL_PACKAGE 的集合,集合中包括了一些包的名称。然后在一个foreach循环中,将ALL_PACKAGE的包全部ON。因此如果你需要加减什么包,可以自行从这个集合中添加或者移除。presets里同时还提供了其他的预设文件可供参考。

cmake -C ../cmake/presets/minimal.cmake ../cmake 
1

# 使用Cuda加速

Author:黄诚斌

安装NVIDIA驱动 查询电脑显卡型号, 根据维基百科(https://en.wikipedia.org/wiki/CUDA#GPUs_supported) 上的信息查找自己显卡对应的架构, 以及对应的CUDA版本 GPU_ARCH

首先安装Nvidia显卡驱动 (opens new window)Nvidia CUDA Toolkit (opens new window)两个驱动, 事实上如果是Ubuntu系统, 可以直接在software&updater中选择显卡所使用的驱动. 检查是否成功:

nvidia-setting
nvidia-smi
watch -n 5 nvidia-smi #每5秒输出一次显卡状态
1
2
3

安装完成后将编译器位置添加到环境变量中. 打开.bashrc 添加export PATH=$PATH:/usr/local/cuda-10.2/bin保存文件后执行nvcc -V,如果输出正常,即代表安装成功.

如果出现"binary2txt"相关的错误一定与环境变量有关系

请在cmake的时候加上以下参数:

-D PKG_GPU=on      # include GPU package
-D GPU_API=cuda    # value = opencl (default) or cuda
-D GPU_PREC=mixed  # precision setting
                   # value = double or mixed (default) or single
-D GPU_ARCH=value  # hardware choice for GPU_API=cuda
                   # value = sm_XX, see below
                   # default is Cuda-compiler dependent, but typically sm_20
-D CUDPP_OPT=value # optimization setting for GPU_API=cuda
                   # enables CUDA Performance Primitives Optimizations
                   # yes (default) or no
1
2
3
4
5
6
7
8
9
10

例如:

cmake -C ../cmake/presets/minimal.cmake -DPKG_GPU=on -DGPU_API=cuda -DGPU_ARCH=sm_61 ../cmake
1

注意这里精度最好使用混合精度

# 调用GPU来做加速,仅需要加入-sf -pk两个flag

mpirun -np 8 lmp_gpu -sf gpu -pk gpu 1 -in in.file

# -sf指在所有支持gpu加速的脚本命令前加上gpu前缀

# 注意这里-pk gpu后跟的是节点数,几块gpu就填几
1
2
3
4
5
6
7

可以通过修改presets下的预置文件来决定哪些包需要安装。更多的参数选择请查看 (opens new window)。待配置完成后会出现配置结果详情,确认后:

make 
make install
1
2

请注意,此时cmake 文件夹下会有一个名为lmp的可执行文件,此文件就是最终编译结果。如果您看这个名字不爽可以自行重命名,以后开始计算所调用命令就以新名称替换。教程以下均使用lmp/lmp_mpi/lmp_serial/lmp_gpu代指此文件。

# 使用kokkos加速

LAMMPS中很多的style, 都没有专门的cuda加速代码. 这时我们可以使用kokkos库, 将C++代码转化为OpenMP或者CUDA代码, 在多核系统运行. 在手册中, 所有带有/kk前缀的命令都可以通过这个库跑在并行系统上, 只需要在运行时像CUDA加上-sf kk 这样的参数即可.

因为kokkos使用了大量的新特性, 因此前提是必须有C++11的编译器. 安装kokkos的方法很多, 我们从自动到手动来介绍. 在编译的过程中, 需要选择主机上是否并行和需要选择用来负责计算的设备(offload of calculations to a device). 默认这两个选项都是关闭的. 此外, 指定的硬件的架构必须要和本机匹配. 由于硬件都是向前兼容的, 所以老版本的编译出的文件可以跑在新架构上.

首先是尽量保证kokkos的GPU架构和LAMMPS的GPU包一致; 如果不一致的话, 在计算开始时的初始化阶段会有一个延迟, 为新硬件编译GPU核心. 如果GPU的大版本不对, 例如5.2和6.0这样, 就会出问题. 简而言之, 好好设置重新编译一遍不费事, 别找麻烦.

为了简化安装, 在cmake/presets下有三个预配置文件:kokkos-serial.cmake, kokkos-openmp.cmake, kokkos-cuda.cmake. 可以连用cmake中的-Cflage来叠加使用配置

cmake -C ../cmake/presets/minimal.cmake -C ../cmake/presets/kokkos-cuda.cmake ../cmake
1

编译配置完成后接着编译

make -j8
make install
1
2

This wraps an nvcc, allowing it to be treated as a real C++ compiler with all the usual flags.

# 使用传统的Make安装

使用makefiles编译需要和系统搭配的Makefile.<machine>文件, 比如说src/MAKE里的各种, 其中包含着编译时的选项和特性. Make方法是最传统的方法, 但是似乎相对于CMake没有优势.

# 要求

以下的操作都是在GNU make下进行的, 如果不是GNU make的话最好是先安装或者转到CMake方法.

  • 支持C++11的编译器. Linux下通常是GNU的编译器, 一些老的编译器可能需要-std=c++11切换到C++11模式;

# 安装

在编译之前, 你需要手动指定需要编译的包, 使用make yes-<package>来添加. 其中<package>是需要的包名. 你可以用make package查看有哪些包需要编译.

使用以下命令可以执行默认的LAMMPS编译, 在lammps/src下生成lmp_seriallmp_mpi:

cd lammps/src
make <machine> -jN    # 命令格式, -jN指用N个核编译 
make serial           # 编译串行的LAMMPS执行文件
make mpi              # 编译并行的LAMMPS执行文件
make                  # 查看make帮助
1
2
3
4
5

编译需要很长时间, 因此可以使用make <machine> -j N来并行编译. 同时, 安装ccache (opens new window)可以在,例如代码开发重复编译时节省时间.

在第一遍编译完之后, 任何时候重新编辑了LAMMPS代码, 增添或删除文件, 都需要重新编译和重新链接LAMMPS可执行文件到同样的make <machine>命令上. makefile的追踪只保证那些需要重新编译的文件呗重新编译, 因此如果你改动了makefile, 你需要重新编译整个包. 清空环境需要用make clean-<machine>.

编译之前, LAMMPS会手机配置信息, 然后编入到应用程序中. 当你第一次编译LAMMPS时, 会编译一个收集各种依赖的工具. 这可以有效地检测到有哪些模块或者源代码需要重新编译.

# 客制化编译和可选的makefiles

src/MAKE中有一些形如Makefile.<machine>的文件. 使用make example以使用Makefile.example. 因此, 以上的make serialmake mpi分别使用了src/MAKE/Makefile.serialsrc/MAKE/Makefile.mpi. 其他的makefile在这些文件夹中:

OPTIONS    # 关于可以用的特殊设置
MACHINES   # 针对特殊的机器
MINE       # 你自己的特殊设定
1
2
3

在makefile文件中, 包含了LAMMPS编译需要的参数和信息, 因此如果手动指定某些参数, 需要修改makefile.

本节教程定位到手册 (opens new window)的 Optional build settings 一节.

例如我需要指定int数据的字节数, 而不是默认的4比特(21字节). 打开需要用的makefile, 例如我将用make mpi命令编译, 就打开Makefile.mpi, 在31行找到LMP_INC关键字, 在其后加上-DLAMMPS_BIGBIG, 保存, 回到src下使用make mpi编译.