2

私は非常に単純なコードを持っています。データ分解の問題で、ループ内で各プロセスが各サイクルで前後に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を確認しましたが、空です。

他に使用すべき方法はありますか?片側通信の方がパフォーマンスが良いと思いますか?気づいていない旗などがある気がします。

どうもありがとう。

4

2 に答える 2

5

MPIには操作の進行と呼ばれるものがあります。この標準では、適切なテスト/待機呼び出しが行われた場合にのみ、非ブロッキング操作を完了まで進めることができます。

ノンブロッキングの送信開始呼び出しは送信操作を開始しますが、完了しません。送信開始呼び出しは、メッセージが送信バッファーからコピーされる前に戻ることができます。通信を完了するには、つまり、データが送信バッファーからコピーされたことを確認するために、別の送信完了呼び出しが必要です。適切なハードウェアを使用すると、送信者のメモリからのデータの転送は、送信が開始されてから完了する前に送信者で実行される計算と同時に進行する場合があります。同様に、ノンブロッキングの受信開始呼び出しは受信操作を開始しますが、それを完了しません。メッセージが受信バッファに保存される前に、コールが戻る可能性があります。別の受信完了受信操作を完了し、データが受信バッファーに受信されたことを確認するには、呼び出しが必要です。適切なハードウェアを使用すると、受信機のメモリへのデータの転送は、受信が開始されてから完了する前に実行される計算と同時に進行する場合があります。

(太字の単語は標準テキストでも太字になっています。強調は私が追加しました)

このテキストは、ノンブロッキング通信に関するセクション(MPI-3.0の§3.7。テキストはMPI-2.2でもまったく同じです)からのものですが、永続的な通信要求にも適用されます。

私はMVAPICH2を使用していませんが、OpenMPIでどのように実装されているかについて話すことができます。非ブロッキング操作が開始されるか、永続的な通信要求が開始されるたびに、操作は保留中の操作のキューに追加され、2つの可能な方法のいずれかで進行します。

  • Open MPIが非同期進行スレッドなしでコンパイルされた場合、送信/受信または一部の待機/テスト操作の呼び出しごとに未処理の操作が進行します。
  • Open MPIが非同期進行スレッドでコンパイルされた場合、それ以上通信呼び出しが行われなくても、操作はバックグラウンドで進行します。

デフォルトの動作では、非同期進行スレッドを有効にしないでください。有効にすると、操作の待ち時間が何らかの形で増加します。

現時点ではMVAPICHサイトにアクセスできませんが、機能リストで非同期の進行状況について言及しました。おそらくそれはあなたが始めるべきところです-それを可能にする方法を探してください。

MV2_SMP_EAGERSIZEまた、共有メモリプロトコルの熱心なメッセージサイズを制御し、InfiniBandプロトコルには影響を与えないことにも注意してください。つまり、同じクラスターノードに存在するプロセス間の通信のみを改善できます。

ちなみに、隣接するランクのレディセンド操作の前に受信操作が開始される保証はありません。そのため、時間の順序付けが非常に重要であるため、期待どおりに機能しない可能性があります。

于 2012-12-20T13:00:40.210 に答える
0

MPICHの場合、MPICH_ASYNC_PROGRESS=1mpiexec/mpirunの実行時に環境変数を設定できます。これにより、「非同期進行」処理を実行するバックグラウンドプロセスが生成されます。

MPICH_ASYNC_PROGRESS-非同期進行を提供するためにスペアスレッドを開始します。これにより、ポイントツーポイント、集合、片側操作、I/Oを含むすべてのMPI操作の進行セマンティクスが向上します。この変数を設定すると、スレッドセーフレベルがMPI_THREAD_MULTIPLEに増加します。これにより進行状況のセマンティクスは改善されますが、通常のMPI操作でパフォーマンスのオーバーヘッドがわずかに発生する可能性があります。

MPICH環境変数から

MPICH-3.1.4を使用してクラスターでテストしましたが、機能しました。MVAPICHも機能すると思います。

于 2015-11-07T02:42:12.527 に答える