Quantum Espresso 6.8 with GPU support
ウェブページ
https://www.quantum-espresso.org/(6.7 まで独立していたコードがメインブランチにマージされています)

バージョン
6.8

ビルド環境
PGI 20.4
CUDA 10.1 (PGI 20.4 付属)
MKL 2020.0.2 (intel 2020 update 2)
OpenMPI 3.1.6

ビルドに必要なファイル
q-e-qe-6.8.tar.gz
patch_extlibs_makefile: ad hoc patch to enable cc70--- install/extlibs_makefile.org+++ install/extlibs_makefile2021-12-15 12:32:45.000000000 +0900
2021-12-15 12:33:50.000000000 +0900@@ -106,6 +106,7 @@--with-cuda-runtime=$(CUDA_RUNTIME) \--disable-parallel \--enable-cuda-env-check=no; \+sed -i -e "s/cc60/cc60,cc70/" make.inc include/configure.h install/make_lapack.inc; \make all
touch ../install/libcuda_devxlib # do not download and configure again

openmpi-3.1.6.tar.bz2(/local/apl/lx/pbs14 以下の PBS Pro 関連ファイル)

ビルド手順
OpenMPI 3.1.6#!/bin/sh
VERSION=6.8
FULLVER=${VERSION}
BASEDIR=/home/users/${USER}/Software/QE/${VERSION}
INSTDIR=/local/apl/lx/espresso68-gpu# nvhpc openmpi awares cuda, but not tm (PBS)...
WORKDIR=/work/users/${USER}OMPIVER=3.1.6
OMPITARBALL=/home/users/${USER}/Software/OpenMPI/${OMPIVER}/openmpi-${OMPIVER}.tar.bz2
OMPIROOT=${INSTDIR}/openmpi-${OMPIVER}PBSROOT=/local/apl/lx/pbs14
PARALLEL=12#export CUDA_HOME=/local/apl/lx/nvhpc-21.9/Linux_x86_64/21.9/cuda
export CUDA_HOME=/local/apl/lx/cuda-10.1 # dummy# ----------------------------------------------------------------------umask 0022
module purge

#module load nvhpc/21.9-nompi
module load pgi/20.4
module load mkl/2020.0.2
export LANG=C
export LC_ALL=Culimit -s unlimited# build openmpi first
cd ${WORKDIR}
if [ -d openmpi-${OMPIVER} ]; then
mv openmpi-${OMPIVER} openmpi-erase
rm -rf openmpi-erase &fitar jxf ${OMPITARBALL}
cd openmpi-${OMPIVER}
export CFLAGS="-fPIC"
export FCFLAGS="-fPIC"
export CXXFLAGS="-fPIC"
export LDFLAGS="-fPIC"
mkdir rccs && cd rccs
CC=pgcc CXX=pgc++ FC=pgf90 \../configure --prefix=${OMPIROOT} \--with-tm=${PBSROOT} \--enable-mpi-cxx \--with-cuda=${CUDA_HOME} \--with-psm2
make -j ${PARALLEL} && make install && make check■ テスト結果
atomic 関連テストに fail している

QE#!/bin/sh
VERSION=6.8
FULLVER=${VERSION}
BASEDIR=/home/users/${USER}/Software/QE/${VERSION}TARBALL=${BASEDIR}/q-e-qe-${FULLVER}.tar.gz
INSTDIR=/local/apl/lx/espresso68-gpu
PATCH0=${BASEDIR}/patch_extlibs_makefile# nvhpc openmpi awares cuda, but not tm (PBS)...
OMPIVER=3.1.6OMPIROOT=${INSTDIR}/openmpi-${OMPIVER}
PARALLEL=12#export CUDA_HOME=/local/apl/lx/nvhpc-21.9/Linux_x86_64/21.9/cuda
export CUDA_HOME=/local/apl/lx/cuda-10.1 # dummy# ----------------------------------------------------------------------umask 0022
module purge#module load nvhpc/21.9-nompi
module load pgi/20.4
module load mkl/2020.0.2

export LANG=C
export LC_ALL=C
ulimit -s unlimited# openmpi setting
export OMPI_MCA_btl_openib_allow_ib=1
export CPATH="${OMPIROOT}/include:${CPATH}"
export LIBRARY_PATH="${OMPIROOT}/lib:${LIBRARY_PATH}"
export LD_LIBRARY_PATH="${OMPIROOT}/lib:${LD_LIBRARY_PATH}"
export PATH="${OMPIROOT}/bin:${PATH}"# qe build
cd ${INSTDIR}if [ -d q-e-qe-${FULLVER} ]; then
mv q-e-qe-${FULLVER} q-e-qe-erase
rm -rf q-e-qe-erase &fitar zxf ${TARBALL}
cd q-e-qe-${FULLVER}
mv * .[a-zA-Z]* ../cd ../ && rmdir q-e-qe-${FULLVER}
export MPIF90=mpif90
patch -p0 < ${PATCH0}# complicated...
sed -i -e 's/cc$(GPU_ARCH)/cc60,cc70/' install/Makefile.lib_eigsolve./configure --enable-openmp \--enable-openacc \--with-scalapack=no \--with-cuda=${CUDA_HOME} \--with-cuda-cc=60 \--with-cuda-runtime=10.1# force to add curand to library list
sed -i -e "s/cusolver/cusolver,curand/" make.inc# add cc70 (is it really ok?)sed -i -e "s/cc60/cc60,cc70/" \make.inc \install/make_lapack.inc \install/make_wannier90.inc \include/configure.hmake -j${PARALLEL} all # neb may fail...
cd test-suite
make run-tests-serial
make clean
make run-tests-parallel
cd ..

メモ
beef.in, beef-spin.in のテストに失敗(openacc 未対応のため)。他は全てパス。シリアルでも並列でも同様です。
今回は openacc も有効にしています
V100 用のフラグ等を指定していますが、現状 V100 では動作しません。P100 でご利用ください。
原因については今のところ不明です。パッチ無しで --with-cuda-cc=70 を指定した場合ですら動作していません。
nvhpc 21.9 を使っているため、cuFFT のバグ https://gitlab.com/QEF/q-e/-/issues/315 も影響ないはずです。(リンク先にある環境変数を設定しても結果は変わりません)
CUDA のバージョンか GPU ドライバのバージョンが影響している可能性があります。ドライバが原因だった場合はバージョン更新によって動作が正常になる可能性があります。
pgi 20.4 を使うことで MPI 関連のエラーに加えてこちらの問題も解消しましたOpenMPI 4.x では OpenMPI のテストが追加でいくつか失敗するため、回避しています。
ausurf 系でのベンチマーク結果(WALL の値; -nk 1 -nb 1 -nt 1)
cpu 16 コア(small 相当): 209.05s
P100*2 (cpu 2 コア, gpu 2 枚, 同一ノード): 39.70s
P100*1 (16 GB)ではメモリ不足で動作せず。(6.7 と同様)
V100*1 (cpu 1 コア, 1 gpu): 49.88s