GPGPU HPC로 LAMMPS 응용환경 구축하기
목차.
1. GPGPU HPC 구축하기
2. Lammps 설치하기
3. Lammps input file 수정하기
4. Lammps 실행하기
5. Lammps 결과 분석하기
1. GPGPU HPC 구축하기
Lammps + GPU/User-CUDA 연동을 위해서는 일단 사전에 nvidia driver 설치 및 cuda 라이브러리가 설치되어 있어야 한다. 또한 작업 제출한 내용에 대하여 모니터링이 가능해야 정상적으로 작업 제출이 되었는지, 리소스를 얼마나 사용하는지 확인이 용이하기 때문에, 반드시 관련 패키지 구성이 되어 있어야 한다. 구성 방법 관련해서는 수석님께서 작성하신
2012년 Teragon GPGPU(CUDA) HPC 구축 매뉴얼
을 참고하기 바란다. 다만 약간의 오타가 있기 떄문에, 그대로 하면 안되니 참고하기 바랍니다..^^ㅋㅋ
2. Lammps 설치하기
Lammps에 GPU/User-CUDA 패키지가 추가된지는 오래되었지만, 지금도 관련 버그들이 픽스되어지고 있는 것으로 확인된다. 그렇기 떄문에, Lammps의 가장 최신 버전을 아래 사이트에서 다운로드 받아 설치해야 정신 건강에 이로울 듯 하다.
http://lammps.sandia.gov/download.html#tar
Lammps를 설치 하기 위해서는 추가로 fftw-2.1.5 버전이 필요하다.
http://www.fftw.org/download.html
해당 버전을 다운 받도록 한다.
인텔 컴파일러 설치는 기본 테라곤 구축 메뉴얼대로 설치를 하고, openmpi의 경우 수석님께서 작성하신 메뉴얼대로 패치 적용 후 설치한다.
2-1. fftw 라이브러리 설치
]# tar zxvf fftw-2.1.5.tar.gz
]# cd fftw-2.1.5
]# ./configure –enable-mpi –enable-threads –enable-mpi CC=icc FCC=ifort \
–prefix=/APP/fftw-2.1.5
]# make
]# make install
2.2 lammps 설치
]# tar zxvf lammps.tar.gz
]# cd lammps-xxxxx/src
]# make package-status # 설치할 패키지 리스트 체크 상태를 확인
Installed NO: package ASPHERE
Installed NO: package CLASS2
Installed NO: package COLLOID
Installed NO: package DIPOLE
Installed NO: package FLD
Installed NO: package GPU
Installed NO: package GRANULAR
Installed NO: package KIM
Installed NO: package KSPACE
Installed NO: package MANYBODY
Installed NO: package MC
Installed NO: package MEAM
Installed NO: package MOLECULE
Installed NO: package OPT
Installed NO: package PERI
Installed NO: package POEMS
Installed NO: package REAX
Installed NO: package REPLICA
Installed NO: package RIGID
Installed NO: package SHOCK
Installed NO: package SRD
Installed NO: package XTC
Installed NO: package USER-MISC
Installed NO: package USER-ATC
Installed NO: package USER-AWPMD
Installed NO: package USER-CG-CMM
Installed NO: package USER-COLVARS
Installed NO: package USER-CUDA
Installed NO: package USER-EFF
Installed NO: package USER-OMP
Installed NO: package USER-MOLFILE
Installed NO: package USER-REAXC
Installed NO: package USER-SPH
Lammps의 경우 크게 standard 패키지와 user 패키지로 구분된다.
별도의 요청이 없을 경우, standard 패키지 중 KIM`s 라이브러리를 제외한 모든 패키지를 선택하고, user 패키지의 USER-CUDA 패키지를 선택하도록 한다.
]# make yes-standard
]# make yes-USER-CUDA
]# make no-KIM
]# make package-status
Installed YES: package ASPHERE
Installed YES: package CLASS2
Installed YES: package COLLOID
Installed YES: package DIPOLE
Installed YES: package FLD
Installed YES: package GPU
src/pair_dipole_sf_gpu.cpp does not exist
src/pair_lj_sdk_coul_long_gpu.cpp does not exist
src/pair_lj_sdk_gpu.cpp does not exist
src/pair_dipole_sf_gpu.h does not exist
src/pair_lj_sdk_coul_long_gpu.h does not exist
src/pair_lj_sdk_gpu.h does not exist
Installed YES: package GRANULAR
Installed NO: package KIM
Installed YES: package KSPACE
Installed YES: package MANYBODY
Installed YES: package MC
Installed YES: package MEAM
Installed YES: package MOLECULE
Installed YES: package OPT
Installed YES: package PERI
Installed YES: package POEMS
Installed YES: package REAX
Installed YES: package REPLICA
Installed YES: package RIGID
Installed YES: package SHOCK
Installed YES: package SRD
Installed YES: package XTC
Installed NO: package USER-MISC
Installed NO: package USER-ATC
Installed NO: package USER-AWPMD
Installed NO: package USER-CG-CMM
Installed NO: package USER-COLVARS
Installed YES: package USER-CUDA
src/pair_lj_sdk_coul_long_cuda.cpp does not exist
src/pair_lj_sdk_cuda.cpp does not exist
src/pair_lj_sdk_coul_long_cuda.h does not exist
src/pair_lj_sdk_cuda.h does not exist
Installed NO: package USER-EFF
Installed NO: package USER-OMP
Installed NO: package USER-MOLFILE
Installed NO: package USER-REAXC
Installed NO: package USER-SPH
GPU와 USER-CUDA 패키지에 몇몇 헤더 파일이 없는 메세지를 출력하는데, USER-OMP를 사용하지 않으면 전혀 문제되지 않으므로 무시하도록 한다.
설치 패키지 설정이 완료되었으면, 관련 라이브러리들을 설치하도록 한다.
]# cd ../lib
]# ls
atc colvars gpu meam README
awpmd cuda linalg poems reax
atc / colvars / awpmd 라입브러리의 경우, 이번 패키지에 해당되지 않으므로 컴파일 할 필요가 없다.
다만, gpu / meam / cuda / linalg / poems / reax는 설치를 위해 반드시 필요한 라이브러리이므로, 설치 하도록 한다.
]# cd gpu
]# make -f Makefile.linux
]# cd..
]# cd meam
]# make -f Makefile.ifort
]# vi Makefile.lammps.ifort
# 인텔 컴파일러의 경로와 버전이 바뀌면서 참조해야할 라이브러리 명도 변경되었다.
meam_SYSINC =
meam_SYSLIB = -lifcore -lsvml -liompstubs5 -limf
meam_SYSPATH = -L/APP/enhpc/compiler/intel/v11.7/256/compiler/lib/intel64
위의 내용으로 바꿔주자.
]# cd ..
]# cd cuda
]# make
]# cd ..
]# cd linalg
]# make -f Makefile.gfortran # ifort를 이용해서 컴파일하도록 변경해도 상관없다.
]# cd ..
]# cd poems
]# make -f Makefile.icc
]# cd ..
]# cd reax
]# make -f Makefile.ifort
]# vi Makefile.lammps.ifort
# 위와 같이 컴파일러의 경로와 버전이 바뀌면서 참조해야할 라이브러리 명도 변경되었다.
meam_SYSINC =
meam_SYSLIB = -lifcore -lsvml -liompstubs5 -limf
meam_SYSPATH = -L/APP/enhpc/compiler/intel/v11.7/256/compiler/lib/intel64
]# cd ../../src/MAKE
]# vi Makefile.linux
마지막으로 lammps 바이너리 파일 생성을 위한 Makefile 수정을 한다.
아래의 항목들을 수정하도록 한다.
CC = icc
LINK = icc
MPI_INC = -I/APP/enhpc/mpi/openmpi-intel/include
MPI_PATH = -L/APP/enhpc/mpi/openmpi-intel/lib
MPI_LIB = -lmpi -lpthread
FFT_INC = -I/APP/fftw/include -DFFT_FFTW
FFT_PATH = -L/APP/fftw/lib
FFT_LIB = -lfftw
# 변경을 완료하였으면, 바이너리 파일을 생성하도록 한다.
]# cd ..
]# make linux
컴파일이 끝나게 되면, lmp_linux 파일이 생성된다.
이 파일이 실행 파일이며, 적당한 곳에 복사하여 PATH 설정을 하게 되면 설치가 마무리 된다.
]# mkdir /APP/lammps/bin
]# cp lmp_linux /APP/lammps/bin
]# vi lammps.sh
#!/bin/bash
export PATH=/APP/lammps/bin:$PATH
]# cp /etc/profile.d/
]# source /etc/profile.d/lammps.sh
3. Lammps input file 수정하기
lammps는 USER-CUDA / GPU 패키지를 사용하기 위해서는 input 파일을 수정해야 한다.
또한, 위으 방법으로 컴파일한 실행 파일은 기본적으로 USER-CUDA 방식으로 동작하기 때문에, cpu만으로 동작시키거나 gpu 패키지로 동작시키기 위해서는 실행 옵션을 변경해 주어야 한다. 자세한건 4장에서 설명하도록 한다.
3.1 input file 수정하기
수정을 위해서 lammps에서 제공하는 간단한 예제를 이용하도록 한다.
사용된 예제 파일은 아래의 경로에 있다.
/home/lammps-8Jan13/examples/gpu/in.gpu.melt.5.0
USER-CUDA로 동작 시키기 위해서는 위의 내용에서 아래에 해당하는 내용을 변경하도록 한다.
+ package cuda gpu/node/special 4 0 1 2 3
+ newton off
일반적으로 USER-CUDA package나 GPU 패키지를 사용할 경우, newton은 off 상태로 두어야 한다.
newton의 제 3법칙을 on 하거나 off 한다는 의미인데, 시스템적으로 on한 것과 off한것의 차이점은 어떤 두 atom의 상호 작용 계산을, 두개의 프로세서 실행 할 때 on일 경우 계산 결과를 communication한다는 점과 off일 경우, 각 프로세서에서 각각 계산한다는 차이라고 한다. gpu나 cuda 패키지를 사용할 경우에는 gpu내에서 실행되는 프로세스간 메모리 공유가 안되기 때문에 newton을 off로 두어야 하는 듯 하다.
3.2 GPU 선택하기
이번 테스트 장비는 1노드에 4개의 GPU가 장착된 서버이다.
그렇기 때문에, 계산을 돌릴 때, 사용할 GPU 선택이 가능해야 하는데 이것 또한 input file에서 지정이 가능하다.
GPU 패키지를 사용할 때와, CUDA 패키지를 사용할 때의 지정 방식이 조금은 다르기 때문에 확실하게 알아두도록 한다.
GPU 패키지의 경우
package gpu force/neigh 0 3 -10 threads_per_atom 8
0 : GPU의 첫번째 ID
3 : GPU의 마지막 ID
-10 : 프로세서간 로드 밸런싱에 관련된 변수인 듯 하다. 이 값이 적절치 않을 경우, 에러메세지를 뿌리며 적당한 값을 알려주기 때문에, 크게 신경쓰지 않아도 된다.
threads_per_atom 8 : 말그대로 쓰레드 별 atom수를 지정하는 arg이다.
CUDA 패키지의 경우
package cuda gpu/node/special 4 0 1 2 3
4 : 총 사용할 GPU의 개수
0 1 2 3 : 사용할 개수에 해당하는 GPU ID
4. Lammps 실행하기
앞서 짧게 설명한데로, 위의 설치 방법대로 컴파일된 실행 파일은 기본적으로 USER-CUDA방식으로 동작한다. 위의 실행 파일을 가지고 GPU패키지를 사용하거나 CPU만을 이용하여 사용하고 싶을 경우 아래의 방법을 이용하면 된다.
해당 패키지를 이용할 수 있도록 input file을 생성한 후,
GPU 패키지 이용시
mpirun -np 4 lmp_linux -sf gpu < inputfile
CPU 패키지 이용시
mpirun -np 4 lmp_linux -sf cpu < inputfile
USER-CUDA 패키지 이용시
mpirun -np 4 lmp_linux < inputfile
5. Lammps 결과 분석하기
벤치 마크 자료를 첨부 한다. 자세한 내용은 첨부 파일을 참고하기 바란다.
덧붙이자면, GPU > USER-CUDA > CPU의 순의 퍼포먼스를 나타난다.
lammps_with_gpu.pdf
이 예제 파일은 기본적으로 gpu 패키지로만 동작하며 이를 CPU를 이용하여 동작시키기 위해서는 아래와 같이 변경한다.
# 3d Lennard-Jones melt
– newton off
– package gpu force/neigh 0 3 -10 threads_per_atom 8
variable x index 2
variable y index 2
variable z index 2
variable xx equal 20*$x
variable yy equal 20*$y
variable zz equal 20*$z
units lj
atom_style atomic
lattice fcc 0.8442
region box block 0 ${xx} 0 ${yy} 0 ${zz}
create_box 1 box
create_atoms 1 box
mass 1 1.0
velocity all create 1.44 87287 loop geom
– pair_style lj/cut/gpu 5.0
+ pair_style lj/cut 5.0
pair_coeff 1 1 1.0 1.0 5.0
neighbor 0.3 bin
neigh_modify delay 0 every 20 check no
fix 1 all nve
dump id all atom 50 dump.melt
thermo 100
run 5000
################################################################################