1.概要
デルフト工科大学で開発された波浪推算モデルSWANですが、MPI版で計算するとラディエーションストレスが正しく計算されません。この記事ではMPI版でシリアル版と同じ結果のラディエーションストレスを出力させる方法をご紹介します。
2.問題点と対策
MPI版ではプロセスごとに部分領域を計算しますが、隣接する部分領域間の境界部分相互通信量がラディエーションストレスの計算に足りないため、部分領域境界で欠測となっています。この境界部分相互通信量を増やすようにオリジナルソースを修正します。
3.修正箇所
修正は、swanparll.ftn に対してのみ行います。以下修正を行ってmakeするとシリアル版と同じラディエーションストレスが出力されます。
A)MAX(MXC,MYC) を MAX(MXC,MYC)*2 へ置換
通信量を増やすため通信用のバッファを大きくします。swan4145のswanparll.ftnでは
2440行目
2441行目
2787行目
2931行目
3150行目
が修正対象です
B)通信幅の変更
swan4145のswanparll.ftnでは 2498行目を変更します
【修正前】
JOFFS = RESHAPE((/0,1,0,-1,1,0,-1,0/), (/2,4/))
【修正後】
JOFFS = RESHAPE((/0,2,0,-2,2,0,-2,0/), (/2,4/))
4.結果比較時の注意点
動作確認で Intel Fortran を使う場合、浮動小数点オプションを source などとして下さい。デフォルトの浮動小数点オプションの Fast は再現性が悪いようです。 Intel Fortran 浮動小数点オプションの解説
また、最適化オプションを共通にして下さい。
【例】
FLAGS_OPT = /O2 /QaxCORE-AVX2
FLAGS_MSC = /assume:byterecl /traceback /nowarn /nologo /Qdiag-disable:8291,4217,6843,10448,6536 /fp:source
5.最後に
手持ちのサンプルではMPI版とシリアル版で全く同じラディエーションストレスとなりましたが、十分な検証を行ったとは言えません。運用にあたっては自己責任でお願いします。この記事の修正によって発生するいかなる損害に関しも当方は責任を負いません。