LAMMPS (OpenMPI + GPUDirect対応)をビルドする

LAMMPSは、オープンソースの分子動力学シミュレーションのソフトウェアです。
スパコン上でOpenMPI + GPU Direct対応のLAMMPSをkokkosパッケージを含めてビルドしたのでその方法を記述します。
通常のクラスター計算機でも一部の環境設定を変更すれば、同様の方法でビルドできると思います。

ビルドに使用したOpenMPI環境は下記の方法で構築しています。

https://qiita.com/tarako1889/items/c3d014881e1fa285ca01

## 実施した環境
- Cray CS-Storm
- CPU: Xeon Gold 6150 x2 (36core)
- Mem: 768 GiB
- GPU: NVIDIA V100(PCIE) x10
- I/F: Infiniband 
- OS: CentOS 7系

スパコン上では下記の環境設定コマンドを実行しました。
通常のクラスターであれば、cuda 10.2とgcc 6.1.0の環境と同等です。

```
$ module switch cudatoolkit/9.0.176 cudatoolkit/10.2.89
$ module switch intel/17.0.4 gcc/6.1.0
```

また、上記OpenMPIの環境構築の実行し、下記の環境設定を行っています。

```
# CS-Storm環境の場合のCUDA, GCC設定
module switch cudatoolkit/9.0.176 cudatoolkit/10.2.89
module switch intel/17.0.4 gcc/6.1.0

# UCX環境設定
export PATH=${HOME}/OpenMPI/ucx-1.10.0/bin:$PATH
export LD_LIBRARY_PATH=${HOME}/OpenMPI/ucx-1.10.0/lib:$LD_LIBRARY_PATH

# OpenMPI環境設定
export MPIROOT=${HOME}/OpenMPI/openmpi-4.1.0
export PATH=$MPIROOT/bin:$PATH
export LD_LIBRARY_PATH=$MPIROOT/lib:$LD_LIBRARY_PATH

# Infiniband環境設定
export OMPI_MCA_btl_openib_allow_ib=1
export OMPI_MCA_btl_openib_if_include="mlx5_0:1"
```

## LAMMPSのビルド
今回、ビルドしたバージョンは、現時点でStableリリースの29 Oct 2020です。
下記の公式サイトからダウンロードしました。

https://www.lammps.org/download.html

### ビルドの準備
ダウンロードと展開

```
$ wget https://download.lammps.org/tars/lammps-stable.tar.gz
$ tar xvfz lammps-stable.tar.gz
$ cd lammps-stable
```

lib/kokkos/bin/nvcc_wrapperを環境に合わせて修正しました。

```
default_arch="sm_70"
host_compiler="g++"
```

### Makefileの作成
MAKE/OPTIONS/Makefile.kokkos_cuda_mpiをベースに下記のように変更を加えました。

```
$ cp MAKE/OPTIONS/Makefile.kokkos_cuda_mpi MAKE/MINE/Makefile.kokkos_cuda_ompi
$ vi MAKE/MINE/Makefile.kokkos_cuda_ompi 
$ diff MAKE/MINE/Makefile.kokkos_cuda_ompi MAKE/OPTIONS/Makefile.kokkos_cuda_mpi
10c10
< #export MPICH_CXX = $(KOKKOS_ABSOLUTE_PATH)/bin/nvcc_wrapper
---
> export MPICH_CXX = $(KOKKOS_ABSOLUTE_PATH)/bin/nvcc_wrapper
26,27c26
< KOKKOS_ARCH = SKX,VOLTA70
< KOKKOS_CUDA_OPTIONS = "enable_lambda"
---
> KOKKOS_ARCH = Kepler35
48,50c47,49
< MPI_INC =     -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX=1 -I${HOME}/OpenMPI/openmpi-4.1.0-fix1/include
< MPI_PATH =    
< MPI_LIB =     -L${HOME}/OpenMPI/openmpi-4.1.0-fix1/lib -lmpi
---
> MPI_INC =       -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX=1
> MPI_PATH =
> MPI_LIB =
```

### インストールするパッケージの選択
今回は下記のパッケージをビルドしました。
srcディレクトリで下記のコマンドでパッケージを追加していきます。

```
$ cd src
$ make yes-class2
$ make yes-kokkos
$ make yes-kspace
$ make yes-manybody
$ make yes-mc
$ make yes-molecule
$ make yes-opt
$ make yes-qeq
$ make yes-rigid
$ make yes-user-misc
$ make yes-user-omp
$ make yes-user-reaction
$ make yes-user-reaxc
$ make kokkos_ompi_cs
```

### ビルドの実行
srcディレクトリでmakeを実行します。

```
$ make kokkos_cuda_ompi
```

## PBS実行スクリプトの例

2 node, 2 MPI, 3 thread, 2 GPUで実行する場合の例を示します。

指定している並列数の内容　
- -np：全体のMPI並列数
- -ppn：ノードあたりの並列数
- g 2: ノードあたりGPU2つ実行
- t 3: 3 threadで実行

``` run.sh
#!/bin/sh
#PBS -q workq
#PBS -l nodes=2,ncpus=6
#PBS -N lammps

# CS-Storm環境の場合のCUDA, GCC設定
module switch cudatoolkit/9.0.176 cudatoolkit/10.2.89
module switch intel/17.0.4 gcc/6.1.0

# UCX環境設定
export PATH=${HOME}/OpenMPI/ucx-1.10.0/bin:$PATH
export LD_LIBRARY_PATH=${HOME}/OpenMPI/ucx-1.10.0/lib:$LD_LIBRARY_PATH

# OpenMPI環境設定
export MPIROOT=${HOME}/OpenMPI/openmpi-4.1.0
export PATH=$MPIROOT/bin:$PATH
export LD_LIBRARY_PATH=$MPIROOT/lib:$LD_LIBRARY_PATH

# Infiniband環境設定
export OMPI_MCA_btl_openib_allow_ib=1
export OMPI_MCA_btl_openib_if_include="mlx5_0:1"

cd  $PBS_O_WORKDIR


mpirun -np 4 -N 2 -hostfile $PBS_NODEFILE --oversubscribe ${HOME}/LAMMPS/lammps-29Oct20/src/lmp_kokkos_ompi_cs -in lj.in -k on g 2 t 3 -sf kk
```