Build FVCOM4.1 (MPI) on ITO Subsystem-A using Intel Compilers
九州大学のスーパーコンピュータITOサブシステムAにおいて,FVCOM4.1 を MPI 用に Intel コンパイラを用いてビルド・実行する方法の備忘録です.Series 用のビルドは こちら を参照ください.Series 用のビルド環境が整っていることを前提とします.ソースコードは FVCOM4.1/FVCOM_source/
に存在し,実行のテストケースとして,FVCOM4.1/Examples/Estuary/
を想定します.
Intelコンパイラ利用の準備
Series 用と同じですが,以下のように load します.
module load intel/2018
さらに,Intel Cコンパイラ用の環境変数を設定しておきます.一時的に,~/.bashrc
で設定しておくとよいでしょう.最適化オプションはスパコン納入業者推奨値です.ただし,最適化オプションは METIS の makefile で設定する必要がありますので,ここではCFLAGSは本来不要です.
export CC=icc
export CFLAGS="-O3 -no-prec-div -fp-model fast=2 -xHost"
export CPP="icc -E"
METISライブラリの準備
Series[/cci] では不要だった,METIS ライブラリを準備します.METIS のソースコードが存在する FVCOM4.1/METIS_source
に移動し,metis.tgz を展開して,ビルドを進めて行きます.
tar xf metis.tgz
makefile を開き,12行目のMOPTを以下のように推奨値に設定します.デフォルト値の -O3 のみでも問題はありません.なお,環境変数とは異なり,オプションをクォーテーションで囲んではいけません.
MOPT = -O3 -no-prec-div -fp-model fast=2 -xHost
makefile は FVCOM4.1 のmake.inc を読み込みます(インストール先のディレクトリ等指定している).Series 用に設定した make.inc (FLAGは何でもよい)を使います.ただし,以下のようにディレクトリを修正する必要があります.
include ../../FVCOM_source/make.inc
METISのビルド
以下のようにします.
make install
make.incの編集
先に作成した(こちらを参照)Series 用の make.inc をベースに編集します.Series との違いは,FLAG_4 と RANLIB のコメントを外すだけです.
FLAG_1 = -DDOUBLE_PRECISION
FLAG_3 = -DWET_DRY
FLAG_4 = -DMULTIPROCESSOR
PARLIB = -lmetis #-L/usr/local/lib -lmetis
FLAG_8 = -DLIMITED_NO
FLAG_10 = -DGCN
FLAG_14 = -DRIVER_FLOAT
make.inc のIntelコンパイラ Series 用をコメントアウトし,MPI 用を以下のように編集します.Flat MPI とし,最適化オプションは推奨値としておきます.
#--------------------------------------------------------------------------
# Intel/MPI Compiler Definitions (ITO-A@kyushu-u)
#--------------------------------------------------------------------------
CPP = icc -E
COMPILER = -DIFORT
CC = mpiicc
CXX = mpiicpc
CFLAGS = -O3 -no-prec-div -fp-model fast=2 -xHost
FC = mpiifort
DEBFLGS = #-check all -traceback
OPT = -O3 -no-prec-div -fp-model fast=2 -xHost
#--------------------------------------------------------------------------
makefileの修正
Seriesではリンクエラーを避けるため,mod_esmf_nesting.F をmakefileから削除しました.MPI では削除したままでも問題ありませんし,削除しなくても問題はありません.よって,オリジナルのままでも大丈夫です.
ソースファイルの微修正
Series のときと同様に(こちらを参照)コンパイル時の Warning を抑制するため,wreal.F の131行目
# endif !!ice_embedding yding
のコメント部分を削除します.# endif
の後にコメントを付けるのは規約違反のようです.
FVCOM4.1のMPIビルド
準備が整ったので,FVCOM_sourceにおいて,FVCOM4.1 を MPI 用にビルドします.
make
かなり時間がかかりますが,実行形式の fvcom ができていれば成功です.
テストケースEstuaryのバッチジョブでの実行
インタラクティブジョブではMPI実行ができないようですので,バッチジョブとして実行します.最も基本的なテストケースである,Estuary をバッチジョブで実行します.Estuary のtst_run.nml にはバグがあります.../Examples/Estuary/run
へ移動し,tst_run.nml をエディタで開き,以下のように河川数を 0 に修正しておきます(元は3になっていました).
&NML_RIVER_TYPE
RIVER_NUMBER = 0,
実行形式 fvcom を../Examples/Estuary/run
にコピーします(あるいは,linkを張ります).../Examples/Estuary/run
で,以下のスクリプト(mpi.sh)を作成します.1ノード36コアの全36プロセスによるFLAT MPIを想定しています.NUM_CORES にはノード当たりのコア数を,NUM_PROCS には ノード数×ノード当たりコア数 を指定します.詳細は こちら を参照ください.
#!/bin/bash
#PJM -L "rscunit=ito-a"
#PJM -L "rscgrp=ito-ss-dbg"
#PJM -L "vnode=1"
#PJM -L "vnode-core=36"
#PJM -L "elapse=10:00"
#PJM -j
#PJM -X
module load intel/2018
NUM_NODES=${PJM_VNODES}
NUM_CORES=36
NUM_PROCS=36
export I_MPI_PERHOST=$NUM_CORES
export I_MPI_FABRICS=shm:ofa
export I_MPI_HYDRA_BOOTSTRAP=rsh
export I_MPI_HYDRA_BOOTSTRAP_EXEC=/bin/pjrsh
export I_MPI_HYDRA_HOST_FILE=${PJM_O_NODEINF}
mpiexec.hydra -n $NUM_PROCS ./fvcom --casename=tst
ジョブの投入は以下のようにします.Series と比べ,劇的に速くなりました.
pjsub mpi.sh
ジョブの状況を調べるには,ターミナルでpjstat コマンドを入力します.バッチ処理関連の詳細は,こちら の最後部分や こちら を参照ください.
For the mpi run, the 'module intel/2017' is necessary. Otherwise, mpiicc, mpiifort and mpiicpc cannot be found.