COMMONブロックを使用してコードのどこでも使用されている配列を格納するmpiバージョンのプログラムがあります。残念ながら、COMMONブロックサイズの配列を宣言する方法はありませんが、実行時にしか認識されません。そこで、回避策として、配列内のALLOCATABLE配列を受け付けるモジュールで配列を移動することに決めました。つまり、COMMONブロックのすべての配列が消失し、代わりにALLOCATEが使用されました。だから、これが私のプログラムで変更された唯一のものでした。残念ながら、プログラムのパフォーマンスは(COMMONブロックの実現と比較して)ひどいものでした。 mpi設定に関しては、各計算ノードには1つのmpiプロセスがあり、各mpiプロセスには1つのスレッドがあります。 私はsimilar質問をここに尋ねたが、私の場合(各プロセスが単一のスレッドを持っている)にどのように適用できるかは考えていない(分からない:))。私はどんな助けにも感謝します。ご覧の通り、ゼロセットは、()は、並列を持っていない割り当て可能な配列の性能
SUBROUTINE ZEROSET()
INCLUDE 'FILE_1.INC'
INCLUDE 'FILE_2.INC'
INCLUDE 'FILE_3.INC'
....
INCLUDE 'FILE_N.INC'
ARRAY_1 = 0.0
ARRAY_2 = 0.0
ARRAY_3 = 0.0
ARRAY_4 = 0.0
...
ARRAY_N = 0.0
END SUBROUTINE
:
「ソースファイル」:ここでは
は、私は(下記の擬似コードで)話していたものを示して簡単な例ですまたはMPIのもの。 FILE_1.INC、FILE_2、...、FILE_N.INCは、ARRAY_1、ARRAY_2、...、ARRAY_NがCOMMONブロックで定義されているファイルです。そのようなもの
REAL ARRAY_1
COMMON /ARRAY_1/ ARRAY_1(NX, NY, NZ)
NX、NY、NZは、PARAMETER指令の助けを借りて記述された明確なパラメータです。 私はモジュールを使用する場合FILE_I.INCが
REAL, ALLOCATABLE:: ARRAY_I(:,:,:)
のように見え、そしてちょうど「を使用FILE_I」に上記のステートメント「『FILE_I.INC』を含める」に変更。ので、私は、すべてのCOMMONブロックを破壊実際には、並列プログラムが実行されると、ある特定のプロセスは全体の(NX、NY、NZ)ドメインを必要としないので、パラメータを計算してからARRAY_I(1回のみ!)を割り当てます。
サブルーチンZEROSET()は、COMMONブロックで0.18秒、モジュールで0.36(配列の次元が実行時に計算されるとき)実行されます。したがって、パフォーマンスは2倍悪化しました。
今はすべてが明確になることを願っています。私はあなたに非常に助けていただければ幸いです。
どのようにこれは並列実行に関連する必要がありますか?パフォーマンスの低下は、シリアル実行ではまだ確認できませんか?あなたはどのくらいの頻度で割り振りますか?仮引数には割り当て可能な属性がありますか? – haraldkl
mpi関連の問題ではないようです。共有メモリまたは分散メモリを使用していますか?メモリのボトルネックが発生している可能性がありますが、すべてを正しく実行した場合は、コードのCOMMONブロック版がうまく動作するため、これは当てはまりません。どのように割り当てたのかのサンプルコードを含めてください。配列を1回(プログラムの開始と終了)に一度だけ割り当てたり割り当てを解除したりすると、パフォーマンスが低下することはありません。 – milancurcic
パフォーマンスは「ひどい」非常に定量的ではなく、どれくらい遅いですか?先に述べたように、最初にシリアルランで問題を確認してください。 – steabert