CADMAS-SURF MPI computing on HA8000
MPI並列計算を行う場合,data.inを以下のように編集するだけです.X方向メッシュが1000で4ノードで実行する場合を例にとりますと,
- PARALLEL X 250
- PARALLEL X 500
- PARALLEL X 750
のように分割する場所を指定するだけです.X方向を岸沖方向と仮定していますが,分割はどの方向でも可能で,複数の方向の組み合わせもできます.効率的な分割方法については不明な点が多い様ですが,各ノードのリストファイルの末尾の計算時間情報を見て,これらがほぼ同様の値となるように試行錯誤で分割するとよいようです.ノードそれぞれで計算時間が異なると,早く終わったノードは他のノードの計算が終わるまで待っている状態になり,資源の無駄使いだからです.
コンパイル with Intel Fortran
- $ mpif90 ?O3 ?ipo ?no-prec-div ?parallel source_file
ここで-O3は強い最適化,-ipoは複数の関数にまたがっての最適化,-no-prec-divは除算を逆数の乗算に変換,-parallelはノード内自動並列化を意味します.もしピュアMPIでノード内16プロセスで実行する場合は-parallelを削除します.ただし,いろいろ試した限りにおいては,ノード内は自動並列化し,ノード内2または4スレッドで実行した方が効率がよいようでした.
実行
以下のようなジョブスクリプトjob.shを作成し,
- $ qsub job.sh
により実行します.8ノードの例です.
job.sh
- #!/bin/bash
- #@$-q short # debug (<5min), short (<1h) or parallel (<24h)
- #@$-N 8 # ノード数
- #@$-J T8 # ノード当たりのMPIプロセス数
- #@$-lT 01:00:00 # 予想実行時間
- export OMP_NUM_THREADS=2 # ノード内2スレッドの自動並列化
- cd cadmas_surf/3d_test/run # ~/を起点とした実行ファイルのpath
- mpirun ./a.out
OMP_NUM_THREADSは自動並列化のスレッド数で,自動並列化する場合(-parallelでコンパイルの場合)に必須です.ピュアMPIでは削除します.-Jにはノード当たりのMPIプロセス数を指定します.例では8プロセスとなっています.ノード内2スレッドと併せて,16CPUとなります.pure MPIの場合,-Jは省略可能で,その場合T16と指定するのと同じです.
-lTで60分制限にする場合,00:60:00ではエラーになり,01:00:00と時間で指定する必要があります.さらに,ジョブスクリプトは常にホームディレクトリをカレントディレクトリとして開始するので,実行ファイルの存在するディレクトリへの移動が必要です.
mpirun には-np 8のように,-npに続けてMPIプロセス数を書けますが,このプロセス数はノード数ではなく,(ノード数)×(-Jで指定したノード内プロセス数)です.このオプションは省略して構いません.
ジョブの確認
- $ qstat
で,ジョブの状態の確認ができます.右端のSTATEがRUNNINGであれば,実行中です.QUEUEDであれば待っている状態です.この場合,
- $ qstat ?b
で他の利用者を含めた全体の状況が分かり,どのくらい待ち行列があるか調べることができます.ただし,実行の優先順位はqstatで表示されるPRI値で決まり,63が最大値(最優先)で,0が最小値です.