私は非常に単純なコードを持っています。データ分解の問題で、ループ内で各プロセスが各サイクルで前後に2つの大きなメッセージをランクに送信します。このコードをSMPノードのクラスターで実行します(AMD Magnyコア、ノードあたり32コア、ソケットあたり8コア)。このコードを最適化する過程にあるのはしばらくの間です。私はプロファイリングにpgprofとtauを使用しましたが、ボトルネックはコミュニケーションであるように見えます。通信をコード内の計算とオーバーラップさせようとしましたが、実際の通信は計算が終了したときに開始されるようです:(
レディモード(MPI_Rsend_init)で永続的な通信を使用し、MPI_Start_allとMPI_Wait_allの間で計算の大部分が実行されます。コードは次のようになります。
void main(int argc, char *argv[])
{
some definitions;
some initializations;
MPI_Init(&argc, &argv);
MPI_Rsend_init( channel to the rank before );
MPI_Rsend_init( channel to the rank after );
MPI_Recv_init( channel to the rank before );
MPI_Recv_init( channel to the rank after );
for (timestep=0; temstep<Time; timestep++)
{
prepare data for send;
MPI_Start_all();
do computations;
MPI_Wait_all();
do work on the received data;
}
MPI_Finalize();
}
残念ながら、実際のデータ転送は計算が完了するまで開始されません。理由はわかりません。ネットワークはQDRInfiniBandInterconnectとmvapich2を使用します。各メッセージサイズは23MBです(合計46 MBのメッセージが送信されます)。システムのメモリが十分に大きいため、メッセージパッシングをイーガーモードに変更しようとしました。ジョブスクリプトで次のフラグを使用します。MV2_SMP_EAGERSIZE=
46MMV2_CPU_BINDING_LEVEL = socket
MV2_CPU_BINDING_POLICY = batch
これにより、おそらくSMPノード内のランクの配置が改善されたため、約8%の改善が得られますが、それでも通信の問題は残っています。私の質問は、なぜ通信と計算を効果的にオーバーラップできないのかということです。使用すべきフラグがありますが、それがありませんか?私は何かが間違っていることを知っていますが、私がしたことは何でも十分ではありません。
SMPノード内のランクの順序により、ノード間の実際のメッセージサイズも46MB(2x23MB)であり、ランクはループ内にあります。手伝ってくれませんか?他のユーザーが使用するフラグを確認するために、/ etc / mvapich2.confを確認しましたが、空です。
他に使用すべき方法はありますか?片側通信の方がパフォーマンスが良いと思いますか?気づいていない旗などがある気がします。
どうもありがとう。