LAMMPSは、オープンソースの分子動力学シミュレーションのソフトウェアです。
スパコン上でOpenMPI + GPU Direct対応のLAMMPSをkokkosパッケージを含めてビルドしたのでその方法を記述します。
通常のクラスター計算機でも一部の環境設定を変更すれば、同様の方法でビルドできると思います。
ビルドに使用したOpenMPI環境は下記の方法で構築しています。
実施した環境
- 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です。
下記の公式サイトからダウンロードしました。
ビルドの準備
ダウンロードと展開
$ 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で実行
#!/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