최초 게시일: 2021-05-02 / 최근 수정일: 2021-05-04
공용으로 사용하는 gmunu와 같은 리눅스 서버에서 사용자에 따른 동적인 환경변수 및 버전 변경은 매우 까다롭다. 때로는 사용자가 개발한 코드는 특정 컴파일러 혹은 소프트웨어 버전에만 작동하는 경우도 있어 시스템 전체에 대한 소프트웨어 버전 변경을 할 경우에는 많은 문제점을 줄 수 있다. 이를 해결하기 위해 환경모듈(Environment Module)을 사용한다.
환경모듈은 크게 2가지 (tcl, lmod) 방식으로 나누어진다. 현재 gmunu 서버에서 지원하는 환경모듈은 lmod로 이 방식은 계층적인 모듈 작업을 지원한다. 특히 컴파일러 종류 및 버전별, MPI 종류별로 불러야 하는 모듈이 달라지므로 계층적인 환경모듈을 이용하면 이 복잡함을 상당히 개선할 수 있다.
현재 사용할 수 있는 모듈을 알아보기 위해서는 module avail
혹은 module av
이라는 명령어를 사용한다.
이 명령어를 사용하면 아래와 같이 현재 부를 수 있는 모듈들이 표시된다.
$ module avail
------------------ /applications/x86_64/modulefiles/compiler -------------------
aocc/3.0.0 gcc/8.4.0 intel-oneapi-compilers/2021.2.0
cuda/10.2.89 gcc/9.3.0
cuda/11.2.2 (D) gcc/10.2.0 (D)
------------------ /applications/x86_64/modulefiles/software -------------------
cmake/3.20.1 ffmpeg/4.2.2 gnuplot/5.2.8 maple/2021
Where:
D: Default Module
모듈을 사용하기 위해서는 module load
라는 명령어를 사용한다.
예를들어 gcc 컴파일러 10.2.0 버전을 사용하기 위해서는
$module load gcc/10.2.0
이라고 쓰면 10.2.0 버전의 gcc를 사용할 수 있다. 확인을 위하여 gcc 버전을 체크해보면
$ gcc -v
Using built-in specs.
(중략)
gcc version 10.2.0
으로 표시된다.
이제 gcc 10.2.0 버전을 로드 한 상태로 다시 module avail
명령어를 써 보면
$ module avail
----------------- /applications/x86_64/modulefiles/gcc/10.2.0 ------------------
fftw/3.3.9 mpich/3.4.1 openmpi/4.0.5
hdf5/1.10.7 mvapich2/2.3.5
intel-oneapi-mpi/2021.2.0 netlib-lapack/3.9.1
------------------ /applications/x86_64/modulefiles/compiler -------------------
aocc/3.0.0 gcc/8.4.0 intel-oneapi-compilers/2021.2.0
cuda/10.2.89 gcc/9.3.0
cuda/11.2.2 (D) gcc/10.2.0 (L,D)
------------------ /applications/x86_64/modulefiles/software -------------------
cmake/3.20.1 ffmpeg/4.2.2 gnuplot/5.2.8 maple/2021
Where:
D: Default Module
L: Module is loaded
gcc/10.2.0 모듈이 로드되었으므로 L로 표시가 되고 gcc/10.2.0에서 사용 가능한 (gcc 10.2.0 으로 컴파일 된) 모듈 목록이 새로 생성 된 것을 볼 수 있다.
여기서 다시 수치 코드의 병렬 계산을 위하여 openmpi를 사용하기 위하여 module load openmpi/4.0.5
를 입력하고 다시 module avail
명령어를 입력하면 아래와 openmpi 버전 4.0.5에서 사용 가능한 모듈의 목록이 나타나게 된다.
$ module load openmpi/4.0.5
$ module avail
------ /applications/x86_64/modulefiles/openmpi/4.0.5-6vikzes/gcc/10.2.0 -------
fftw/3.3.9 (D) hdf5/1.10.7 (D)
----------------- /applications/x86_64/modulefiles/gcc/10.2.0 ------------------
fftw/3.3.9 mpich/3.4.1 openmpi/4.0.5 (L)
hdf5/1.10.7 mvapich2/2.3.5
intel-oneapi-mpi/2021.2.0 netlib-lapack/3.9.1
------------------ /applications/x86_64/modulefiles/compiler -------------------
aocc/3.0.0 gcc/8.4.0 intel-oneapi-compilers/2021.2.0
cuda/10.2.89 gcc/9.3.0
cuda/11.2.2 (D) gcc/10.2.0 (L,D)
------------------ /applications/x86_64/modulefiles/software -------------------
cmake/3.20.1 ffmpeg/4.2.2 gnuplot/5.2.8 maple/2021
Where:
D: Default Module
L: Module is loaded
여기서 문제는 fftw와 hdf5의 모듈은 openmpi를 부르기 전에도 존재한다. 즉 openmpi를 부르기 전 fftw와 hdf5모듈은 순차 코드에서 사용하는 모듈이고 (병렬화를 지원하지 않는 모듈) mpi 모듈을 부른 후에 나오는 것은 병렬 계산과 (fftw) 병렬 입출력이 (hdf5) 가능한 모듈이다.
이 외에도 자주쓰는 모듈 명령어는 아래와 같다.
module unload gcc/10.2.0
: gcc 10.2.0 모듈을 해제 시킨다.module switch gcc/10.2.0 gcc/9.3.0
: gcc 10.2.0 모듈을 해제 시키고 gcc/9.3.0 모듈을 불러온다. 이 경우 의존적인 모듈(위 예제에서는 openmpi 모듈)이 가능 할 경우 자동으로 불러지고 아닐 경우 해제된다.module purge
: 현재까지 로드된 모든 모듈을 해제 시킨다.module list
: 현재까지 로드된 모든 모듈 리스트를 보여준다.module whatis gcc/10.2.0
: gcc 10.2.0 모듈에 대한 설명을 출력한다.gmunu 서버에서 각종 모듈을 부르면 그 모듈이 설치된 위치에 대한 환경변수를 지정하였다.
이것은 버전을 제외한 모듈의 이름에 _ROOT
를 붙여서 사용한다 (모두 대문자임을 주의).
즉 module load hdf5/1.10.7
후 HDF5_ROOT
를 보면 아래와 같이 출력된다.
$ echo $HDF5_ROOT
/applications/x86_64/packages/gcc-10.2.0/hdf5-1.10.7/nqdp67l