まず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でコンパイルしたバイナリを使うことにする。