CP2K@物性研ohtaka 2023

古いintelコンパイラが突然使えなくなったので、コンパイルし直し。

色々試したがintelではうまくいかず、最終的には

CP2K 2023.1 gcc10.1.0 openmpi4.0.4

の組み合わせ。分子研のページに示されている3つのパッチをあて、toolchainオプションは下記。

–mpi-mode=openmpi –math-mode=openblas –with-gcc=system –with-cmake=system –with-openmpi=system –with-mpich=no –with-intelmpi=no –with-libxc=install –with-libint=install –with-fftw=install –with-acml=no –with-mkl=no –with-openblas=install –with-scalapack=install –with-libxsmm=install –with-elpa=install –with-ptscotch=install –with-superlu=install –with-pexsi=install –with-quip=install –with-plumed=install –with-sirius=install –with-gsl=install –with-libvdwxc=install –with-spglib=install –with-hdf5=install –with-spfft=install –with-spla=install –with-cosma=install –with-libvori=install –with-libtorch=install

make途中で

・libint_f.modが見つからないとエラー → fortranディレクトリにあったのをincludeにコピーして解決

・src/core_ppl.f で 下記のエラー

Error: ‘deltaR’ not specified in enclosing ‘parallel’

ちゃんと定義されてるんだが… DEFAULT(NONE)をDEFAULT(SHARED)にして解決

これでひとまず過去のDFTMDの続きを回すことができた。intelより10%くらい遅いが仕方なし。


CP2K@物性研ohtaka

toolchain/scripts/install_fftw.sh の ./configure の直前に

sed -i -e “s/-no-gcc//g” configure

を追加。-no-gccが残っているとエラーが出て、fftw3がコンパイルできない。

今年から導入されるアーキテクチャは基本的に /usr/bin/python は存在しないため、CP2K本体のmake時、/usr/bin/env pythonがエラーになる。pythonをpython2.7に変換する必要がある。特に、隠しフォルダ /exts/dbcsr/.cp2k の中のスクリプトは普通にgrepで検索すると引っかからない。

ファイルの一括操作

遅ればせながらfindの使い方がわかってきた。

すべてのepsファイル(Mac時代の名残り)をpngに一括変換するスクリプト

#!/bin/sh
for file in `find . -maxdepth 1 -name \*.eps -type f`;
do
echo $file
convert -rotate 90 $file `basename $file .eps`.png
done
exit

 

 

SIESTA@Cray

gfortran.makeに並列化のオプションをつけ足せばコンパイルできる。

intelも試したが、難しいので一旦諦める。普通にやるとmpi_siestaに必要なライブラリが見つからないと言われるので、Objディレクトリをincludeパスに追加。そのエラーは消えたが、今度はMPI_BCastが見つからないと言われる。これはちょっとわからない。

SIEASTA-3.2も試みたが、こちらはconfigure中のa.out実行のところで止まる。全部tssrunに変更すればよいのかもしれないが、ひとまずGNU-compilerで良しとする。

 

.SUFFIXES:
.SUFFIXES: .f .F .o .c .a .f90 .F90

SIESTA_ARCH = unknown

CC = cc
FPP = $(FC) -E -P -x c
FC = ftn
FC_SERIAL = ftn

FFLAGS = -O2 -fPIC -ftree-vectorize

AR = ar
RANLIB = ranlib

SYS = nag

SP_KIND = 4
DP_KIND = 8
KINDS = $(SP_KIND) $(DP_KIND)

LDFLAGS =

COMP_LIBS = libsiestaLAPACK.a libsiestaBLAS.a

FPPFLAGS = $(DEFS_PREFIX)-DFC_HAVE_ABORT -DMPI -DFC_HAVE_FLUSH
MPI_INTERFACE=libmpi_f90.a
MPI_INCLUDE=.

LIBS =

# Dependency rules ———

FFLAGS_DEBUG = -g -O1 # your appropriate flags here…

# The atom.f code is very vulnerable. Particularly the Intel compiler
# will make an erroneous compilation of atom.f with high optimization
# levels.
atom.o: atom.F
$(FC) -c $(FFLAGS_DEBUG) $(INCFLAGS) $(FPPFLAGS) $(FPPFLAGS_fixed_F) $<

.c.o:
$(CC) -c $(CFLAGS) $(INCFLAGS) $(CPPFLAGS) $<
.F.o:
$(FC) -c $(FFLAGS) $(INCFLAGS) $(FPPFLAGS) $(FPPFLAGS_fixed_F) $<
.F90.o:
$(FC) -c $(FFLAGS) $(INCFLAGS) $(FPPFLAGS) $(FPPFLAGS_free_F90) $<
.f.o:
$(FC) -c $(FFLAGS) $(INCFLAGS) $(FCFLAGS_fixed_f) $<
.f90.o:
$(FC) -c $(FFLAGS) $(INCFLAGS) $(FCFLAGS_free_f90) $<

CP2Kの速度比較

あくまでも自分が流す第一原理計算 with CP2K ver5.1 での比較だが、計算時間は

物性研システムB  1728 並列 (72 nodes) ≂ 阪大OCTOPUS 768 並列(32 nodes)x 5.5 < 京大CRAY 544 cores (8 nodes)

物性研がこれまで圧倒的に早かったが、OCTOPUSがちょっとだけ抜いてきて、京大CRAYはこの二つより5.5倍ほど遅く、何もしないよりはマシ、というところ。

物性研は、1728 coresはちょっとやりすぎというか、864→1728は1.15倍速程度にしかならないのだが、F36キュー(最大864並列)はかなり混雑しており、待ち時間が長すぎて使い物にならない。多少ポイントは浪費するが、F144キュー(最大3456並列)の1728並列の方が逆に空いていて、シームレスにjobが入る。

OCTOPUSでは、今のところ32 nodesなら切れ目なく投入でき、物性研並みに使える印象。

京大CRAY 544 coresは96万円で最低限保証されるcore数で、それ以上core数を増やすと、切れ目なく投入されるかどうかは混み具合に依存する。すぐ入るときもあるし、1日以上待つときもある。どちらかというとプロパティの1点計算やその他のプログラムを回すのに主に使い、出張中や、雑務or書き物であまり頻回にjob更新をできない時に第一原理MDを少しでも進めておく感じで使う。ただ、ポイント消費制でなく、空いてさえいればjobがいくらでも投入できるのは大きな魅力。最低544 cores、最大4352 coresあれば、一人で使う分にはストレスなく使えるが、今後もし学生が増えたら予算確保できるだろうか…と思うところはないでもない。

CP2K@京大CRAY

まずGNUコンパイラを準備。

module swap PrgEnv-cray PrgEnv-gnu
module load fftw

ライブラリ類は基本的に

./configure FC=ftn CC=cc CXX=CC –prefix=/somewhere/somepath

make

でビルドできる。

libsmmも、付属のpbs.wlmをオプションだけ変えて使ってバッチジョブでビルドできる。

ちょっとだけ問題だったのはlibint。ビルドの途中でバイナリを実行するのだが、このシステムでは基本的にログインノードで負荷の高いバイナリを実行できない(Illegal Instructionと出て止まる。何か条件はあるんだろうが、具体的には不明で、負荷の高いという表現がよいのかわからない。例えばcp2k.popt等は実行できないが、Hello Worldは動く。今回もbuild~やvrr~の処理が完了し、hrr1~の処理に突入した段階で止まる。makeはsingle coreで実行しているし、serial/parallelの問題というわけでもなさそうだし、ulimit -s unlimitedを実行すればよいというわけでもなかった)。そこで、build_libintが異常終了したタイミングで

cd ~/src/libint-1.1.4/src/lib/libint/src

tssrun /home/b/bxxxxx/src/libint-1.1.4/src/lib/libint/../../../src/bin/libint/build_libint

と会話処理でbuild_libintを実行したのち(要するにMakefileの動きに従って、止まった処理をtssrunで実行)、makeを再開するとビルドできた。

コンパイルを4通りほど試してわかったのは、

・-O3は-O2より30%ほど高速化する

・libsmmとlibxsmmでは速度には違いが無い

 

ひとまず使おうと思うバイナリのコンパイルオプションは以下のとおり。

CC = cc
CPP =
FC = ftn
LD = ftn
AR = ar -r

LIBINT_DIR = /home/b/bxxxxx/src/libint-1.1.4
LIBSMM_DIR = /home/b/bxxxxx/src/cp2k-5.1/tools/build_libsmm
LIBGRID_DIR = /home/b/bxxxxx/src/cp2k-5.1/tools/autotune_grid

CPPFLAGS =
DFLAGS = -D__FFTW3 -D__parallel -D__SCALAPACK -D__HAS_NO_SHARED_GLIBC -D__LIBINT -D__LIBSMM -D__HAS_LIBGRID
CFLAGS = $(DFLAGS)
FCFLAGS = $(DFLAGS) -O3 \
-mavx -funroll-loops -ffast-math -ftree-vectorize \
-ffree-form -ffree-line-length-512 -fno-omit-frame-pointer
LDFLAGS = $(FCFLAGS)
LIBS = -L$(LIBGRID_DIR) -lgrid \
$(LIBINT_DIR)/lib/libderiv.a $(LIBINT_DIR)/lib/libint.a -lstdc++ \
$(LIBSMM_DIR)/lib/libsmm_dnn_cray.gnu.a \
-lfftw3 -lz -ldl

 

テストするとCO.inp、multipole_ch_qu.dbg_f_real.inp、UO2-4x4x4-cs-fixd-npt.inpの3つにWRONGが出る。前二つはほぼteleranceに近い値なので良いとして、UO2-4x4x4-cs-fixd-nptは完全に間違っている。同様のエラーは報告があり、そこでは放っておくということになっている…

-O2にすると、前二つはそのままだがUO2-4x4x4-cs-fixd-nptのWRONGは消えるので、NPTを計算することがあれば大事を取って-O2でコンパイルしたバイナリを使うことにする。

 

CP2K@物性研システムB

ver5.1をビルドするためにはコンパイラのバージョンを変える必要がある。

(. /etc/profile.d/modules.sh)←バッチジョブスクリプトでmoduleコマンドを実行するのに必要
module purge
module load intel/17.0.4.196
module load intel-mpi/5.1.3.258

まずlibint、fftw、libxc-4.0.4、autotune_gridはログインノードでビルド完了。

次にlibsmmは、ログインノードで実行するとデータ集めの最中に切れてしまい不可、またインタラクティブモードでも60分の制限があるため、ジョブを100個自動で生成してビルドするしかない。pbs.wlmを書き換える。

batch_cmd() {
cat <<EOF > ${test_name}.sh
#!/bin/sh
#QSUB -queue F4cpu
#QSUB -node 1
#QSUB -omp 1
#QSUB -place pack
#QSUB -over false
#PBS -l walltime=${wtime}
#PBS -N ${test_name}
cd \$PBS_O_WORKDIR
. /etc/profile.d/modules.sh
module purge
module load intel/17.0.4.196
${aprun_cmd} $@
EOF
}

もとのpbs.wlmではqsubとセットになっているのだが、システムBではワンライナーでqsubができないのでヒアドキュメントを使う。これに実はqsubも組み合わせようとしたのだが、うまくいかなかった。パイプでqsubとか、2段に分けてqsub ${test_name}.shとか試みたが、いずれもEOFが見つからないと怒られる。仕方がないのでqsubは自分で別に実行するようにした。どのみち、システムBにjobは100個しか投入できないので、何か走っていると最後の方が無理だから、様子を見て逐次投入して行くのでちょうどよかったかも。残りのプロセスも同様にして完遂し、libsmmをビルド。

OCTOPUSと同様のarchファイルでコンパイル。

regtestだが、これもシステムBではログインノードでmpijobが実行できず、インタラクティブモードでも時間が足りないので、jobを投げて実行する。do_regtestファイルのmpiexecをmpijobに換えて、-np 2も-mpi 2にする。

テストしたところ、TMCで6件のWRONGが出て、残りはすべてCORRECTだった。

TMC_ana_density.inp 0.711367119328203 WRONG RESULT TEST 39
TMC_ana_G_R.inp 0.711367119328203 WRONG RESULT TEST 39
TMC_ana_dip_cl.inp 0.711367119328203 WRONG RESULT TEST 39
TMC_ana_deviation.inp 0.711367119328203 WRONG RESULT TEST 39
TMC_ana_create_traj_without_ana.inp – OK ( 0.27 sec)
TMC_ana_start_with_exist_traj.inp 5.905896245601220E-003 WRONG RESULT TEST 39
TMC_ana_restart.inp 5.905896245601220E-003 WRONG RESULT TEST 39

シングルコアでテストするとTMCダメと言われているが、そこは2core並列でテストしている。まあシステムBでモンテカルロを計算しなければよいのですね。

 

CP2K@OCTOPUS

阪大サイバーメディアセンターに新しいクラスターOCTOPUSが導入され、Intel Compilerがver2017しかないということで、これを機に最新版のCP2Kを主要なライブラリも全部つけてコンパイルすることにした。こういうビルドの情報って、イギリスとかだと公開してくれるのだが、日本だとあまり共有されない。そこそこ時間を要したので貼ることにする。

OSはRHEL7.3、コンパイラ・ライブラリは
intel compiler & libraries 2017.5.239
のコンパイラ、mkl、intel mpi。これしか選べない。

libint-1.1.4
libxc-2.2.3 or 4.0.4を解凍し、ビルドする。
configure時に FC=ifort、CC=icc、CXX=icpcをつけるのと、prefixを指定する。

またcp2k-5.1/toolsにあるautotune_grid/でlibgrid.aを、build_libsmmでlinux_libsmm.aをそれぞれ指示に従ってビルドする。これらはいずれも1晩くらいかかる。

それでarchファイルはlibxcが2.2.3の場合、

CC = icc
CPP =
FC = mpiifort
LD = mpiifort
AR = ar -r

LIBXC_DIR = /somewhere/somepath/libxc-2.2.3
LIBINT_DIR = /somewhere/somepath/libint-1.1.4
LIBSMM_DIR = /somewhere/somepath/cp2k-5.1/tools/build_libsmm
LIBGRID_DIR = /somewhere/somepath/cp2k-5.1/tools/autotune_grid

CPPFLAGS =
DFLAGS = -D__MKL -D__FFTW3 -D__LIBINT -D__LIBXC -D__parallel \
-D__SCALAPACK -D__HAS_smm_dnn -D__HAS_LIBGRID \
-I$(LIBXC_DIR)/include
CFLAGS = $(DFLAGS)
FCFLAGS = $(DFLAGS) -O2 -g -traceback -fpp -free \
-I$(MKLROOT)/include -I/somewhere/somepath/fftw-3.3.7/include
FCFLAGS2 = $(DFLAGS) -O1 -g -traceback -fpp -free \
-I$(MKLROOT)/include -I//somewhere/somepath/fftw-3.3.7/include
FCFLAGS3 = $(DFLAGS) -O0 -g -traceback -fpp -free \
-I$(MKLROOT)/include -I//somewhere/somepath/fftw-3.3.7/include
LDFLAGS = $(FCFLAGS) -static-intel
LDFLAGS_C = $(FCFLAGS) -static-intel -nofor_main
LIBS = $(MKLROOT)/lib/intel64/libmkl_scalapack_lp64.a \
-Wl,–start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a \
$(MKLROOT)/lib/intel64/libmkl_sequential.a \
$(MKLROOT)/lib/intel64/libmkl_core.a \
$(MKLROOT)/lib/intel64/libmkl_blacs_intelmpi_lp64.a -Wl,–end-group \
-lpthread -lm \
//somewhere/somepath/fftw-3.3.7/lib/libfftw3.a \
$(LIBINT_DIR)/lib/libderiv.a $(LIBINT_DIR)/lib/libint.a -lstdc++ \
-L$(LIBXC_DIR)/lib -lxcf90 -lxc \
$(LIBSMM_DIR)/lib/libsmm_dnn.a $(LIBGRID_DIR)/libgrid.a

# Required due to memory leak that occurs if high optimisations are used
mp2_optimize_ri_basis.o: mp2_optimize_ri_basis.F
../../../tools/build_utils/fypp -n $< $*.F90
$(FC) -c $(FCFLAGS3) -I’$(dir $<)’ $*.F90

libxc-4.0.4の場合は、リンクに記されているようにパッチを当て、libxc-2.2.3→libxc-4.0.4、-lxcf90→-lxcf03と変更。

これで

make ARCH=OCTOPUS VERSION=popt

でビルドしてエラーが出なければ

make ARCH=OCTOPUS VERSION=popt test

を実行するとテストが実行され、すべて成功した!なお、ulimit -s unlimitedをつけておかないとかなりのテストが失敗する。このマシン、デフォルトのスタックサイズが異様に小さい。バッチジョブを投げるときも必要。

Number of FAILED tests 0
Number of WRONG tests 0
Number of CORRECT tests 3011
Number of NEW tests 0
Total number of tests 3011

なお、旧バージョンのCP2Kのリスタートファイルを流すときは、BASIS SET、POTENTIALの詳細情報を消さないと流れない。

また、libxc-3.0.1はコンパイルがうまくいかなかった。