0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SALMON TDDFTビルドの備忘録

Last updated at Posted at 2019-01-16

SALMONの概要

ホーム | SALMON (Scalable Ab-initio Light-Matter simulator for Optics and Nanoscience)
実空間グリッドを使った物質と電磁波の相互作用を計算するコード。時間依存密度汎関数理論ベースの孤立(孤立境界条件)と固体(周期境界条件)の外場に対する実時間発展、またそれらが電磁波と結合した際の伝播が計算できる。

SALMONのビルド

デフォルトではcmakeを使ったビルドが使われている。
公式インストールインストラクションはは英語版日本語版がある。

cmakeを使ったビルド

SALMON-v.2.2.0 on fjmpi 1.2.37 fj 1.2.37

東大情報基盤センターのWisteriaでの実行用バイナリのビルドを行う。

モジュールのロード

module load odysseyでFortranとMPIの環境をロード。
例えば、module listで以下が表示される。

Currently Loaded Modulefiles:
 1) fjmpi/1.2.37   2) fj/1.2.37(default)   3) odyssey

cmake

Install and Run — SALMON software manual v.2.2.0 documentationによると、バージョンは3.14.0以降が必要とのことなので、cmake --versionで確認すると

cmake version 3.18.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

として、3.18.2なことが確認できた。

ディレクトリ${SALMON_ROOT}/buildを作り、そのディレクトリに移動してpython ../configure.py --arch=fujitsu-a64fx-ea --prefix=../ 1 を入力して以下の出力を得る(適宜改変):

    $  cmake  -D CMAKE_TOOLCHAIN_FILE=fujitsu-a64fx-ea -D CMAKE_INSTALL_PREFIX=../ -D CMAKE_BUILD_TYPE=Release -D CMAKE_VERBOSE_MAKEFILE=off ..
-- The Fortran compiler identification is Fujitsu
-- The C compiler identification is Fujitsu
-- Detecting Fortran compiler ABI info
-- Detecting Fortran compiler ABI info - done
-- Check for working Fortran compiler: /opt/FJSVxtclanga/tcsds-1.2.37/bin/mpifrtpx - skipped
-- Checking whether /opt/FJSVxtclanga/tcsds-1.2.37/bin/mpifrtpx supports Fortran 90
-- Checking whether /opt/FJSVxtclanga/tcsds-1.2.37/bin/mpifrtpx supports Fortran 90 - yes
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /opt/FJSVxtclanga/tcsds-1.2.37/bin/mpifccpx - skipped
-- user-defined FFLAGS  =
-- user-defined CFLAGS  =
-- user-defined LDFLAGS =
-- Specific OpenMP flags: -Kopenmp -Nfjomplib
-- Specific Fortran preprocessor flags: -Cpp
-- Found MPI_C: /opt/FJSVxtclanga/tcsds-1.2.37/bin/mpifccpx (found version "3.1")
-- Found MPI_Fortran: /opt/FJSVxtclanga/tcsds-1.2.37/bin/mpifrtpx (found version "3.1")
-- Found MPI: TRUE (found version "3.1")
-- SALMON will uses the optimization by MPI version 3.
-- Performing Test FORTRAN_COMPILER_HAS_2MB_ALIGNED_ALLOCATION
-- Performing Test FORTRAN_COMPILER_HAS_2MB_ALIGNED_ALLOCATION - Success
-- Looking for unistd.h
-- Looking for unistd.h - found
-- Looking for stat
-- Looking for stat - found
-- Looking for access
-- Looking for access - found
-- Looking for mkdir
-- Looking for mkdir - found
-- Looking for nftw
-- Looking for nftw - found
-- Looking for remove
-- Looking for remove - found
-- Looking for PATH_MAX
-- Looking for PATH_MAX - found
-- Looking for __FUJITSU
-- Looking for __FUJITSU - found
-- Set vendor-specific LAPACK libraries: -SSL2BLAMP
-- testing command: MPIEXEC_EXECUTABLE-NOTFOUND -n 4 /home/hogehoge/work/opt/SALMON-v.2.2.0/build/salmon
-- Target executable file  = salmon
-- CMake generated FFLAGS  =  -Kopenmp -Nfjomplib  -Cpp   -SSL2BLAMP
-- CMake generated CFLAGS  =  -Kopenmp -Nfjomplib    -SSL2BLAMP
-- CMake generated LDFLAGS =
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hogehoge/work/opt/SALMON-v.2.2.0/build

そして、makemake install${SALMON_ROOT}/bin/salmonがビルドされる。

SALMON-v.2.2.1 on Ubuntu 20.04

やっぱりGCCでビルドしたいじゃん。Makefileを直接つくのは結構面倒なことが分かってきたので、cmakeを使ってビルドする方法がキチンと公式に記述がある。--archを指定せずFC, FFLAGS, CCを指定してあげればよい。今回はUbuntu 20.04条で、cmakeのバージョンは3.16.3。
${SALMON_ROOT}$mkdir ./build & mv ./buildした後に、事前にビルドしてあった、gcc-11.4.0とそれをリンクしたopenmpi-5.0.3をenvironmental moduleでloadしてPATHを通した状態で以下のコマンドで通った。

ビルド用コマンド
python3 ../configure.py --prefix=/opt_share/SALMON/2.2.1/openmpi-5.0.3_gcc-11.4.0 FC="gfortran" FFLAGS="-O3 -fallow-argument-mismatch" CC="gcc" --enable-mpi
make 
make install

-fallow-argument-mismatchは、ここで説明した最近のGCCで引数チェックがstrictになったことによって、古いコードが続々とエラーでビルド出来なくなった問題を解決するための処方箋。(本当はコードそのものをstrictに書いた方が良いが、自分で書いているコードでもない場合はこうしてしのぐほかない)

関連して作ったmodule用のファイルは以下の通り:

#%Module -*- tcl -*-
##
## dot module file
##
proc ModulesHelp { } {
        puts stderr "\tAdds SALMON to your environment variables.\n"
}

module-whatis   "adds SALMON to your environment variables"

set          moduleversion       2.2.1
set          root                /opt_share/SALMON/2.2.1/openmpi-5.0.3_gcc-11.4.0

module load openmpi/5.0.3/gcc-11.4.0

prepend-path PATH $root/bin

GNU makeを使ったビルド

SALMON-v.1.2.0 on mpich 3.3 GCC 4.8.5

個人的な趣味でGNU makeを使ったビルドを試みた。コードはSALMON-v.1.2.0で、mpich-3.3, gnu-4.8.5(CentOS 7.3.1611のパッケージ管理で入っている物)でビルド。

gnu_makefiles/Makefile.gnuをSALMON-v.1.2.0.tar.gzを展開して出てきたフォルダ($(SALMON_ROOT)とする)の一番上の階層にコピー。

make -f ./Makefile.gnu

でビルド。$(SALMON_ROOT)/binsalmon.cpuが出来る。

うまいことビルド出来ない問題

/usr/lib/ld: cannot find -llapack
/usr/lib/ld: cannot find -lblas

ある状態では上記のエラーが出てビルド出来なかった。
ldconfig -pでライブラリを探すとliblapacke.so.3liblapack.so.3が見つかる。また、/usr/lib64/を見るとliblapack.so.3.4.2liblapacke.so.3.4.2があるが、-L/usr/lib64Makefile.gnuに追記しても、問題は解決しない。
ライブラリが足りないのかと考えて、ルートで

yum install lapack*

でdevel等も含めてインストールをした(依存関係のあるblasについてもインストールされる)ところ、ビルドが出来た。
この過程で入ったどのライブラリが本質的だったかはわからない。

SALMON-v.1.1.0 openmpi-3.1.3 intel compiler-2019.3.199

コードはSALMON-v.1.1.0で、openmpi-3.1.3, intel-2019.3.199, CentOS 7.3.1611でビルド。

gnu_makefiles/Makefile.intel-avx2をSALMON-v.1.1.0.tar.gzを展開して出てきたフォルダ($(SALMON_ROOT)とする)の一番上の階層にコピー。
このMakefileは、intel-MPIを前提に書かれているので、以下のように修正

FC = mpif90
CC = mpicc
LIBLAPACK = -mkl=sequential
LIBSCALAPACK = -mkl=sequential

make -f Makefile.intel-avx2でビルド完了。
$(SALMON_ROOT)/bin/salmon.cpuが出来る。

SALMON-v.2.0.1 on openmpi 3.1.3, intel-2019.3.199

Makefile
# intel

TARGET = salmon
#FC = mpiifort
#CC = mpiicc
FC = mpif90
CC = mpicc
FFLAGS = -O3  -ansi-alias -fno-alias -fpp -nogen-interface -std03 -warn all
CFLAGS = -O3  -ansi-alias -fno-alias -Wall -restrict -std=c99
OMPFLAG = -qopenmp
MPIFLAG = -DUSE_MPI
SIMD_SET =

#LIBLAPACK = -mkl=cluster
LIBLAPACK = -mkl=sequential
# LIBLAPACK = -llapack -lblas

# LIBXC = -DUSE_LIBXC -lxcf90 -lxc -I"libxc_installed_dir/include" -L"libxc_installed_dir/lib"

CONFIG = \
    -DSYSTEM_HAS_POSIX \
    -DSYSTEM_HAS_POSIX_STAT \
    -DSYSTEM_HAS_POSIX_ACCESS \
    -DSYSTEM_HAS_POSIX_MKDIR \
    -DSYSTEM_HAS_STDIO_REMOVE \
    -DSYSTEM_HAS_POSIX_NFTW \
    -DSYSTEM_HAS_PATH_MAX_IN_LIMITS_H \
    -DSYSTEM_HAS_PATH_MAX_IN_LINUX_LIMITS_H
#    -DFORTRAN_COMPILER_HAS_2MB_ALIGNED_ALLOCATION \
#    -DUSE_OPT_DOMAIN_IS_POW2 \
#    -DUSE_OPT_ARRAY_PADDING \
#    -DUSE_OPT_SOFTWARE_PREFETCH \
#    -DFORTRAN_COMPILER_HAS_MPI_VERSION3 \
#    -DUSE_OPT_EXPLICIT_VECTORIZATION

MODULE_SWITCH = -module

ifneq (,$(wildcard make.body))
include make.body
else
include gnu_makefiles/make.body
endif

Libxcをリンクするときは、Libxc 4.3.4をインテルでビルドしたものを/home/user/opt/libxc-4.3.4_intelにインストールしたとすると、以下のように書き換えることでビルドできた。

LIBXC = -DUSE_LIBXC -lxcf90 -lxc -I"/home/user/opt/libxc-4.3.4_intel/include" -L"/home/user/opt/libxc-4.3.4_intel/lib"

Libxcビルドの備忘録 - Qiitaにあるとおりintel-2019.3.199でビルドしようとすると、2021/05/27時点での最新盤の5.1.4ではうまくビルド出来なかった。そこで、4.3.4をここでは使うことにした。

トラブルシューティング

SALMON-v.1.1.0 openmpi-3.1.3 intel compiler-2019.3.199 がtorque-5.0.3でqsubすると走らない

標準出力で、flag_nlcc = Fと書き出したところまで進んで、forrtl: severe (174): SIGSEGV, segmentation fault occurredを吐いて、落ちる。
同じ実行を普通のbashスクリプトで実行すると、普通に走る。

MPIをmpich-3.3, openmpi-4.0.0に替えて実行しても症状は同じ。
MPIを使わずシリアル実行してみても同じなので、MPIとの相性ではなく、torqueでのジョブ実行との相性の問題の可能性が高い。

試しにtorque経由の実行とbashスクリプトでの実行で、環境変数の差分をとって、PATHの部分は同じものを含むように変更してみたが、問題は解決せず。(2019/04/20)

端末、及びshellスクリプト経由でulimit -sでスタックサイズをみるとunlimitedだったが、torque経由で投げると8192が設定されている。
torqueのジョブサブミットスクリプトにulimit -s unlimitedを追加したところ、openmpi-3.1.3については動いた。
スタックサイズが小さいので、大きな配列を宣言したところで、segmentation faultを吐いていたっぽい。
ただし、mpich-3.3では問題は解けていない。(2019/04/24)

SALMON-v.1.2.1, Oakforest-PACS で標準入力のファイルの最後の文字列の後に改行がないと動かない

SALMON-v.1.2.1をOakforest-PACSでビルド(公式のインストールに手続きでarch=intel-knlを指定)して実行したところ、以下の個所まで標準出力に表示したまま、停止せずに計算が実行されなかった。

##############################################################################
# SALMON: Scalable Ab-initio Light-Matter simulator for Optics and Nanoscience
#
#                             Version 1.2.1
##############################################################################
  Libxc: [disabled]

原因は標準入力で読み込むファイルの最後の行(具体例では、以下の/の後)に改行がないことだった。

/
&analysis
  out_dos = 'y'
/

改行を入れることで期待通りに動くようになった。

但し、この改行は手元の環境(openmpi-3.1.3, intel compiler-2019.3.199, entOS 7.3.1611)では必須ではなかった。環境によっては、これでも動くようだが、基本的には改行を入れておいた方が良さげ。

SALMON-v2.0.0でTBmBJを実行するとSCFの反復初期に大きな値が固有値に入っており、反復が進むにつれて値が大きくなっていってNaNになる

どうもデフォルト設定の初期値が悪いらしい。
以下のオプションを追加してSCFを回すとうまくいく。

&scf
method_init_wf = "random"
/

SALMON-v.2.2.0, AMD機で でAVX512のarchオプションをつけてビルドすると計算がエラーを吐いて終了する

エラーを吐く実行バイナリの作り方:

python3 ../configure.py --arch=intel-avx512 --prefix=../
makemake installでバイナリを準備する。

該当のエラー

Please verify that both the operating system and the processor support Intel(R) X87, CMOV, MMX, FXSAVE, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, MOVBE, POPCNT, AVX, F16C, FMA, BMI, LZCNT, AVX2, AVX512F, AVX512DQ, ADX, AVX512CD, AVX512BW and AVX512VL instructions.

古いコアやAMDのコアは必ずしもAVX512の命令セットを実行できないので、一段階古い命令セットのAVX2を指定してビルドを試みる
python3 ../configure.py --arch=intel-avx2 --prefix=../
がこれもダメで、実はAMD EPYCについては、もっと明確なオプションが用意されている:
python3 ../configure.py --arch=intel-avx2-epyc --prefix=../

入力ファイルテンプレート

SALMON-v1.2.1

TBmBJ
&functional
  xc = 'TBmBJ'
/
TBmBJ(c=1.0)
&functional
  xc = 'TBmBJ'
  cval = 1.0d0
/
Linear_response
&emfield
  trans_longi = 'tr'
  ae_shape1 = 'impulse'
  epdir_re1 = 0., 0., 1.
/
LASER_pulse
&emfield
  trans_longi = 'tr'
  ae_shape1 = 'Acos4'
  rlaser_int_wcm2_1 = 1d12
  pulse_tw1 = 1653.d0d0 !~ 40 fs
  omega1 = 0.05796d0    !~ 1.55 eV
  epdir_re1 = 0., 0., 1.

解析用コード

SALMON-v1.2.1

get_tAtEtJt.py
def get_tAtEtJt(fname, print_opt = False, plot_opt = True):
    f = open(fname,'r')
    lines = f.readlines()
    f.close()
    Nlen = len(lines)
    print(Nlen, ': No. of lines of the file, ',fname)
    #
    if (print_opt):
        for i in range(8):
            print(lines[i])
    #
    Nhead = 8
    Nt = Nlen - Nhead
    t = np.zeros(Nt, dtype='float64')
    At = np.zeros([Nt,3], dtype='float64')
    Et = np.zeros([Nt,3], dtype='float64')
    Jt = np.zeros([Nt,3], dtype='float64')
    for i in range(Nt):
        temp = lines[Nhead + i].split()
        t[i] = temp[0]
        At[i,0] = temp[ 7]
        At[i,1] = temp[ 8]
        At[i,2] = temp[ 9]
        Et[i,0] = temp[10]
        Et[i,1] = temp[11]
        Et[i,2] = temp[12]
        Jt[i,0] = temp[13]
        Jt[i,1] = temp[14]
        Jt[i,2] = temp[15]
    if (plot_opt):
        plt.figure()
        plt.plot(t*Atomtime,Jt[:,0],label='Jx')
        plt.plot(t*Atomtime,Jt[:,1],label='Jy')
        plt.plot(t*Atomtime,Jt[:,2],label='Jz')
        plt.legend()
        plt.grid()
        plt.show()    
    return t, At, Et, Jt
#
fname = '/home/shinohara/hoge/Ghogehoge_rt.data'
t, At, Et, Jt = get_tAtEtJt(fname)
  1. 他の環境だと、たびたびpythonpython3にエイリアスされていないケースがある。その場合はpython3 ../configure.py --arch=fujitsu-a64fx-ea --prefix=../にすれば、所望の動作が期待できる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?