$ module add fj fjmpi fftw
$ ./install/configure LANG=C MPIF90=mpifrtpx CC=fccpx F90=frtpx BLAS_LIBS=-SSL2BLAMP --enable-openmp
このままだと上手くいかないので、あとはmake.incを手動で書き換える。
特に重要なのは以下の部分:
.f90.o:
$(MPIF90) $(F90FLAGS) -c $<
プリプロセッサの有効化オプションが正しく認識されず、他のコマンドに変わってしまっているのを直す。
DFLAGS = -D__MPI -D__FFTW -D__SCALAPACK
Wisteria-OにプリインストールされているFFTW3を使うとOpenMPと併用したときにメモリリークを起こすので、QEに付属のものを使う。
MPIF90 = mpifrtpx
F90 = frtpx
CC = fccpx
この部分に関しては、おそらく正しく設定されているはず。
FFLAGS = -Kfast -Kopenmp -X08 -Cpp -g
順番に、最適化、OpenMP、Fortran08仕様、Cプリプロセッサマクロ有効化。
LD = mpifrtpx
LDFLAGS = -Kfast -Kopenmp
リンカーおよびリンクオプション。
BLAS_LIBS = -SSL2BLAMP
これで富士通SSL2のBLASとLAPACK両方がリンクされる。この下のLAPACK_LIBSは空欄でよい。
SCALAPACK_LIBS = -SCALAPACK
富士通SSL2のScaLAPACKを使う。
FFT_LIBS =
前に挙げた理由でQEに付属のFFTWを使うため空欄にする。
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
動作未確認