# lammps hpc test
## 國網 slurm
### 提交工作檔
說明:lammps在國網編譯
2 nodes 8 cpus in total
```shell=
#!/bin/bash
# ----------------------------------------------------------------------------
#SBATCH -p gp1d
#SBATCH -A ACD110038
#SBATCH --nodes=2
#SBATCH -J lammps_test
#SBATCH --time=00:30:00
#SBATCH --exclusive
#SBATCH --nodelist=gn1103,gn1104
#SBATCH --gres=gpu:1,gpu:1
#SBATCH --cpus-per-task=4
module purge
module load nvidia/cuda/.10.0.130
module load ucx/1.5
module load openmpi/3.1.4
LMPLOC=/home/nckuhpclab04/lammps_openmpi-3.1.4_cmake/lammps/build/lmp
INPUT=/home/nckuhpclab04/in.lj
mpirun --host gn1103,gn1104 -np 8 -n 2 $LMPLOC < $INPUT
```
## 國網PBS
說明:lammps在台灣杉一號編譯(CPU)
12nodes 25ppn np300
```shell=
#!/bin/bash
#PBS -N lammps_test1
#PBS -q ct400 ##佇列名稱
#PBS -l select=12:ncpus=25:mpiprocs=25 ##12nodes 每個nodes25核 25個MPI序列
#PBS -l walltime=15:00:00 ##最大運行時間
#PBS -P ACD110038 ##計畫名稱
#PBS -j oe ##照打
#PBS -o pbsout_lammps_openmpi4=-4.0.5_12nodes_25ppn.txt ##output 名稱
module load mpi/openmpi-4.0.5/gcc930
LMPLOC=/home/nckuhpclab04/lammps/lammps/build/lmp
INPUT=/home/nckuhpclab04/lammps_job_script/in.lj
mpirun -np 300 $LMPLOC < $INPUT
```
## 測試結果
* 官方參考

啥都不改 只改核心數 input = in.lj
EX
`select=25:ncpus=40:mpiprocs=40`
`mpirun -np 1000 $LMPLOC < $INPUT`
4nodes 40 ppn-Total wall time: 27:31:36

10 nodes 30 ppn-Total wall time: 27:42:19

15 nodes 40 ppn-Total wall time: 27:31:24

25 nodes 40 ppn-Total wall time: 27:30:41

45 nodes 25 ppn
甚至跑不完
:::warning
值得注意的是 每個都只有1個 MPI task 配 ppn數的OpenMP threads
就像是沒有真的並行一樣(計算時間都差不多 表示未真的並行)
而且參考官方其實花最多時間的地方是communication
但自己測試的全都是花在計算
重點應該在MPI task
其實也是主要lammps並行計算的點
:::
:::info
看起來 procs=MPI task * OpenMP threads
:::
## kokkos test
### test 1
#### in.lj
->twcc
openmpi/4.1.0
nvidia tesla v100-sxm2
cuda/10.0
compiler/gnu/7.3.0(需要較新的compiler)
cmake/3.15.4
KISS FFT
```
cmake -D BUILD_OMP=yes -D BUILD_MPI=yes -D PKG_MOLECULE=yes -D PKG_RIGID=yes -D PKG_KSPACE=yes -D PKG_KOKKOS=yes -D Kokkos_ARCH_VOLTA70=yes -D Kokkos_ENABLE_CUDA=yes -D Kokkos_ENABLE_OPENMP=yes -D CMAKE_CXX_COMPILER=/home/nckuhpclab04/lammps_different_build/lammps_kokkos/lammps/lib/kokkos/bin/nvcc_wrapper ../cmake
```
* 4 gpu 17 threadings
`mpirun --host gn1022,gn1023,gn1024,gn1107 -np 4 --bind-to socket --map-by socket $LMP < $INPUT -k on g 4 t 17 -sf kk -pk kokkos newton off neigh full`

`mpirun --host gn1022,gn1023,gn1024,gn1107 -np 4 --bind-to socket --map-by socket $LMP < $INPUT -k on g 4 t 40 -sf kk`
4 gpu 40 threadings
:::warning
thread的警告

:::

`mpirun --host gn1022,gn1023,gn1024,gn1107 -np 4 --bind-to socket --map-by socket $LMP < $INPUT -k on g 4 t 17 -sf kk`
* 4 gpu 17 threadings

:::info
可以發現當被實體的核心數限制時,就算超過也會照實體的去計算
至於有沒有使用newton off 跟 full neigh 則沒有差別(似乎本來GPU計算這定就是這樣)
:::
### test 2
#### in.lj
->twcc
openmpi/4.1.0
nvidia tesla v100-sxm2
cuda/10.0
compiler/gnu/7.3.0
cmake/3.15.4
KISS FFT
build with --default-stream perthread
* 4GPU36threading

* 3GPU36threading

* 2GPU36threading

* 1GPU36threading

* 4gpu 36threadings(kokkos package/cuda aware/neigh half/newton off/comm device)
#### in.rhodo
##### 1
```
mpirun --host gn1103,gn1104,gn1105,gn1106 -np 4 --bind-to socket --map-by socket $LMP < $INPUT -sf kk -k on g 1 t 36 -pk kokkos neigh half comm no
```
因

4PGU36threadings

##### 2
cuda aware
```
mpirun --host gn1107,gn1108,gn1205,gn1206 -np 4 --bind-to socket --map-by socket $LMP < $INPUT -sf kk -k on g 1 t 36 -pk kokkos neigh half newton on cuda/aware on
```

### test3
->nscc
openmpi/4.0.0
nvidia tesla v100-sxm2
cuda/10.1
gcc7.4(需要較新的compiler)
cmake/3.14.4
FFTw3/3.2.1
### test4
for cpu
fftw3
mpi/openmpi-4.0.5/gcc930
gcc930
cmake 3.20.0
```
cmake -D BUILD_OMP=yes -D BUILD_MPI=yes -D PKG_MOLECULE=yes -D PKG_RIGID=yes -D PKG_KSPACE=yes -D PKG_KOKKOS=yes -D Kokkos_ARCH_SKX=yes -D Kokkos_ENABLE_OPENMP=yes ../cmake
```
## GPU package
### test1
twcc
openmpi/3.0.1
cuda/10.0
compiler/gnu/7.3.0
cmake/3.15.4
KISS FFT
```
cmake -D BUILD_OMP=yes -D BUILD_MPI=yes -D PKG_MOLECULE=yes -D PKG_RIGID=yes -D PKG_KSPACE=yes -D PKG_GPU=yes -D GPU_API=cuda -D GPU_PREC=mixed -D GPU_ARCH=sm_70 -D CUDPP_OPT=no -D CUDA_MPS_SUPPORT=yes ../cmake
```
#### in.lj
4gpu36threadings
```
mpirun --host gn1103,gn1104,gn1105,gn1106 -np 4 --bind-to socket --map-by socket $LMP < $INPUT -sf gpu -pk gpu 4
```

#### in.rhodo
4GPU36threadings
```
mpirun --host gn1103,gn1104,gn1105,gn1106 -np 4 --bind-to socket --map-by socket $LMP < $INPUT -sf gpu -pk gpu 4
```

:::info
->已經對此採用較佳的加速 只有pair用gpu加速 還是比kokkos慢,可能是因為cpu 因1:4的限制所以能用得很少 所以其他才沒有gpu快
:::
## USER-OMP package
台灣杉1號
```
cmake -D BUILD_OMP=yes -D BUILD_MPI=yes -D PKG_MOLECULE=yes -D PKG_RIGID=yes -D PKG_KSPACE=yes -D PKG_USER-OMP=yes ../cmake
```
mpi/openmpi-4.0.5/gcc930
FFTW3
cmake/3.15.4
:::warning
->mpi procs 要跟 ncups一樣

:::
4nodes 20 ppn

4nodes 15 ppn

4nodes10ppn(user_omp/no npernode)

## OPT package
```
cmake -D BUILD_OMP=yes -D BUILD_MPI=yes -D PKG_MOLECULE=yes -D PKG_RIGID=yes -D PKG_KSPACE=yes -D PKG_OPT=yes ../cmake
```
cmake/3.15.4
mpi/openmpi-4.0.5/gcc930
FFTW3
### in.lj
4nodes15ppn

4nodes12ppn

4nodes10ppn

## user_intel
->nia
cmake/3.14.5
mkl/2019u4
intel/2019u4
openmpi/4.0.1
```
cmake -D BUILD_OMP=yes -D BUILD_MPI=yes -D PKG_MOLECULE=yes -D PKG_RIGID=yes -D PKG_KSPACE=yes -D PKG_USER-OMP=yes -D PKG_USER-INTEL=yes -D INTEL_ARCH=cpu -D INTEL_LRT_MODE=c++11 -D FFT=MKL -D FFT_SINGLE=no ../cmake
```
###### tags: `lammps`