OpenSWPCの利用
OpenSWPCのダウンロードとコンパイル
OpenSWPCは https://github.com/OpenSWPC/OpenSWPC で公開されています. このURLから見られる個別のソースコードは,開発の途中で登録されている場合があり,したがって未完成だったりバグを含むこともあります. それに対して,一定のアップデートのまとまりごとに release としてバージョン番号を付与されたものがzip形式で圧縮されて https://github.com/OpenSWPC/OpenSWPC/releases から公開されています. このreleaseはZenodoによりバージョン個別のDOIが付与(たとえば こちら)されており,論文等での引用にも便利です.
ここでは,Version 25.05.2をダウンロード・コンパイルしてみます.
$ curl -OL https://github.com/OpenSWPC/OpenSWPC/archive/refs/tags/25.05.2.zip
$ unzip 25.05.2.zip
$ cd OpenSWPC-25.05.2/src
$ make arch=miyabi-Gでコンパイルできます.
Miyabi-Gでは,ライブラリや開発環境などをmodule loadコマンドで読み込んで使う仕組みが採用されています.OpenSWPCのコンパイル時にmodule load は自動的に行われますが,make 前にロードされていたモジュールはpurgeされてしまうので注意してください.
なお,read_snp.xなどの付属ツールをログインノードやインタラクティブノードで利用するためには,実行前に
$ module load nvidia netcdf netcdf-fortran hdf5によって必要なライブラリを読み込む必要があります.一度読み込めばそのシェルではずっと有効です.Miyabi-GではNVIDIAによるコンパイラのみを使う,というつもりであれば,上記module loadコマンドをシェル設定ファイル~/.bashrcに書いておけば,次回ログイン時からはこれらのモジュールが自動で読み込まれます.
データセットの準備
日本周辺のモデルとしてJIVSMを使いたい場合は,公式マニュアルの記述に沿ってデータの準備が必要です.このデータは使い回せるため,共通のディレクトリに保存しておくのが良いでしょう.
ジョブ投入の例
OpenSWPCのジョブスクリプトの例です.これはOpenSWPCに同梱されている西南日本のサンプルジョブの例です.ただし,入力パラメタに若干の修正が必要です.これについては後述します.
#!/bin/bash
#PBS -q regular-g
#PBS -l select=48:mpiprocs=1:ompthreads=36
#PBS -l walltime=01:00:00
#PBS -W group_list=GROUP
#PBS -j oe
#PBS -N SWPC_W
#PBS -m abe
#PBS -l mail_power_info=true
cd ${PBS_O_WORKDIR}
module load nvidia nv-hpcx netcdf hdf5 netcdf-fortran
mpirun ./bin/swpc_3d.x -i ./example/input_WJapan.inf基本的なジョブスクリプトの書き方は前節で説明したとおりです.ここでは主な違いについて説明します.
MPI/OpenMPハイブリッドジョブ設定
#PBS -l select=48:mpiprocs=1:ompthreads=36では,単に48ノードを確保するだけでなく,ノードあたりのMPIプロセス数をmpiprocsオプションで,1プロセスあたりのOpenMPスレッド数をompthreadsオプションで指定します.
OpenSWPCでは1ノード(1GPU)あたり1プロセスで実行することが想定されています.より細かく1ノードを複数に分割することもでき,場合によって若干の性能の変化が見られますが,実用上はあまり気にする必要はないと思われます.mpiprocs=1を常に使い,入力パラメタのnproc_xとnproc_yの積がselect=の数値と一致するように選べばよいです.
次のompthreadsのオプションを指定すると,OpenMPによる並列計算が有効となります.OpenSWPCは,Miyabi-GのようなGPUマシンにおいて,(Version25系の時点においては)主要な演算のほぼ全てをGPUで行います.一方,計算の開始前の構造や震源モデルデータの読み込みと差分グリッドへの割り当ては(GPUからはストレージのファイルを直接読めないので必然的に)CPUで行っており,そこではCPU内の複数コアを用いたOpenMP並列化が実装されています.そのため,ompthreadsをCPUのコア数以下の範囲で指定することで高速化が期待できます.
モジュールの読み込み
Miyabi-GのOpenSWPCはNVIDIA HPC-Xの環境でコンパイルされているため,そのライブラリと入出力につかうNetCDF関係のライブラリ,さらにそれが依存しているHDFライブラリを読み込む必要があります.swpc_**.xを実行するときには必ず
module load nvidia nv-hpcx netcdf hdf5 netcdf-fortranが必要です.
環境変数利用についての注意
OpenSWPCの入力パラメタファイルではexportで指定した環境変数が読み込めるようになっています.配布ファイルに同梱されている入力パラメタファイルでも,たとえば
dir_grd = '${DATASET}/vmodel/ejivsm/' !! directory for grd fileが指定されており,あらかじめ
export DATASET=/path/to/datasetという環境変数が設定されていれば,OpenSWPC内部では
dir_grd = '/path/to/dataset/vmodel/ejivsm/'に展開されます.これは特に上記データセットをいつでも共通のディレクトリにしておくのに便利な仕組みです.
ところが,Miyabiの並列実行ジョブでは,ジョブ実行ファイル内で export文により環境変数を設定しても,すべての計算ノードのうち1ノードにしか環境変数が伝わらないという問題があります.マニュアルによるとこれは仕様のようです.
mpirunのオプションを用いて,先のジョブスクリプトを以下のようにすることで環境変数を渡すこともできます.
#!/bin/bash
#PBS -q regular-g
#PBS -l select=48:mpiprocs=1:ompthreads=36
#PBS -l walltime=01:00:00
#PBS -W group_list=GROUP
#PBS -j oe
#PBS -N SWPC_W
#PBS -m abe
#PBS -l mail_power_info=true
unset OMPI_MCA_mca_base_env_list
export DATASET=/path/to/dataset
cd ${PBS_O_WORKDIR}
module load nvidia nv-hpcx netcdf hdf5 netcdf-fortran
mpirun -x PATH -x LD_LIBRARY_PATH -x DATASET \
./bin/swpc_3d.x -i ./example/input.infしかしこの方法だと${PATH}と${LD_LIBRARY_PATH}も手動で渡す必要があり,やや煩雑です.Miyabi-Gにおいてはパラメタに環境変数を使わない,ほうが簡単かもしれません.