九州大学のスーパーコンピュータITOサブシステムAにおいて,FVCOM4.1MPI用にIntelコンパイラを用いてビルド・実行する方法の備忘録です.Series用のビルドはこちらを参照ください.Series用のビルド環境が整っていることを前提とします.ソースコードはFVCOM4.1/FVCOM_sourceに存在し,実行のテストケースとして,FVCOM4.1/Examples/Estuaryを想定します.

Intelコンパイラ利用の準備

Series用と同じですが,以下のようにloadします.

$ module load intel/2018

さらに,Intel Cコンパイラ用の環境変数を設定しておきます.一時的に,~/.bashrcで設定しておくとよいでしょう.最適化オプションはスパコン納入業者推奨値です.ただし,最適化オプションはMETISmakefileで設定する必要がありますので,ここではCFLAGSは本来不要です.

$ export CC=icc
$ export CFLAGS="-O3 -no-prec-div -fp-model fast=2 -xHost"
$ export CPP="icc -E"

METISライブラリの準備

Seriesでは不要だった,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

makefileFVCOM4.1make.incを読み込みます(インストール先のディレクトリ等指定している).Series用に設定したmake.incFLAGは何でもよい)を使います.ただし,以下のようにディレクトリを修正する必要があります.

include ../../FVCOM_source/make.inc

METISのビルド

以下のようにします.

$ make install

make.incの編集

先に作成した(こちらを参照)Series用のmake.incをベースに編集します.Seriesとの違いは,FLAG_4RANLIBのコメントを外すだけです.

            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.1MPI用にビルドします.

$ make

かなり時間がかかりますが,実行形式のfvcomができていれば成功です.

テストケースEstuaryのバッチジョブでの実行

インタラクティブジョブではMPI実行ができないようですので,バッチジョブとして実行します.最も基本的なテストケースである,Estuaryをバッチジョブで実行します.Estuarytst_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コマンドを入力します.バッチ処理関連の詳細は,こちらの最後部分やこちらを参照ください.