$ module add fj fjmpi fftw
$ ./install/configure LANG=C MPIF90=mpifrtpx CC=fccpx F90=frtpx BLAS_LIBS=-SSL2BLAMP FFT_LIBS="-lfftw3_omp -lfftw3" --enable-openmp
このままだと上手くいかないので、あとはmake.incを手動で書き換えるmake.inc。
特に重要なのは
FFLAGS = -Kfast -Kopenmp -X08 -Cpp
順番に、最適化、OpenMP、Fortran08仕様、Cプリプロセッサマクロ有効化。
make pw
libmbd (Many Body Dispersion)のところで一旦コケる。
これは富士通コンパイラがFortran2018の仕様の一部(c_bindとオプショナル引数の併用)をサポートしていないため。
sed -i -e "s/, bind(c)//g" -e "s/bind(c)//g" mbd_c_api.F90
スレッド並列版ZGEMMを呼ぶとスレッド数と行列サイズによっては落ちる(SSL2のバグ)。
回避するためには-KNOSVE(SVE無効化)のオプションを入れる。
$ module add nvidia nvmpi
$ ./configure --with-cuda=${NVHPC}/Linux_x86_64/22.7/cuda --with-cuda-cc=80 --with-cuda-runtime=11.7 --enable-openmp --with-cuda-mpi=yes BLAS_LIBS="-L${NVHPC}/Linux_x86_64/22.7/compilers/lib/ -lblas" LAPACK_LIBS="-L${NVHPC}/Linux_x86_64/22.7/compilers/lib/ -llapack"
$ make pw
小さい系では-nkを増やしたくなり、その場合にはGPUあたりのprocess数を増やしたくなる。
MPSを使うと良い
#!/bin/bash
export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7"
export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps
export CUDA_MPS_LOG_DIRECTORY=/tmp/nvidia-log
nvidia-cuda-mps-control -d
unset CUDA_VISIBLE_DEVICES
export OMP_NUM_THREADS=1
mpiexec -np 72 ~/program/qe/a/bin/pw.x -nk 72 -in scf_1000026.in |tee mps_72.out
echo quit | nvidia-cuda-mps-control
のようにする。
$ module add nvhpc-nompi openmpi_nvhpc
$ ./configure --with-cuda=${NVHPC}/Linux_x86_64/22.2/cuda --with-cuda-cc=80 --with-cuda-runtime=11.6 --enable-openmp --with-cuda-mpi=yes BLAS_LIBS="-L${NVHPC}/Linux_x86_64/22.2/compilers/lib/ -lblas" LAPACK_LIBS="-L${NVHPC}/Linux_x86_64/22.2/compilers/lib/ -llapack"
$ make pw
動作未確認