1

非同期通信を使用して MPI プログラムを高速化したいと考えています。しかし、使用時間は同じままです。ワークフローは次のとおりです。

before:
1.  MPI_send/ MPI_recv Halo           (ca. 10 Seconds) 
2.  process the whole Array           (ca. 12 Seconds)

after:
1. MPI_Isend/ MPI_Irecv Halo         (ca. 0,1 Seconds)
2. process the Array (without Halo)  (ca. 10 Seconds)
3. MPI_Wait                          (ca. 10 Seconds)  (should be ca. 0 Seconds)
4. process the Halo only             (ca. 2 Seconds)

測定では、一般的なワークロードの場合、アレイ コアの通信と処理にほぼ同じ時間がかかることが示されました。したがって、非同期性は通信時間をほとんど隠しているはずです。しかし、そうではありません。

1 つの事実 (これが問題になる可能性があると思います) は、sendbuffer が計算が行われる配列でもあるということです。通信は Halo (派生データ型を使用) のみにアクセスし、計算は配列のコア (読み取りのみ) にのみアクセスしますが、MPI がメモリアクセスをシリアル化することは可能ですか?

これが確かな理由かどうかは誰にもわかりませんか?

おそらく実装依存ですか(私はOpenMPIを使用しています)?

前もって感謝します。

4

2 に答える 2

1

MPI がユーザー コードでメモリ アクセスをシリアル化することはありません (一般に、これはライブラリの権限を超えています)。正確に何が起こるかは実装によって異なります。

しかし、実際問題として、MPI ライブラリは「バックグラウンド」で期待するほど多くの通信を行いません。これは特に、tcp + イーサネットなどのトランスポートやネットワークを使用する場合に当てはまり、通信を渡す意味のある方法がない場合に当てはまります。別のハードウェア セット。

MPI ライブラリ コードを実行している場合 (MPI 関数呼び出しなど) にのみ、MPI ライブラリが実際に何かを実行していることを確認できます。多くの場合、多数の MPI 呼び出しのいずれかを呼び出すと、進行中のメッセージを追跡してそれらを先導する実装の「進行エンジン」が微調整されます。したがって、たとえば、計算ループ内のリクエストで MPI_Test() を呼び出して、MPI_Wait() よりも前に処理が開始されるようにすることが簡単にできます。もちろん、これにはオーバーヘッドがありますが、これは簡単に測定できるものです。

もちろん、MPI ライブラリが別のメカニズムを使用してバックグラウンドで実行することも想像できます。MPICH2 と OpenMPI はどちらも、ユーザー コードとは別に実行され、バックグラウンドでこの案内を行う個別の「プログレス スレッド」で遊んでいます。しかし、計算を実行しようとしているときにプロセッサを拘束せずに、それをうまく機能させることは、本当に難しい問題です。OpenMPI のプログレス スレッドの実装は長い間実験的なものでした。実際、現在の (1.6.x) リリースでは一時的に廃止されていますが、作業は継続されています。MPICH2 のサポートについてはよくわかりません。

ネットワークハードウェアに多くのインテリジェンスがあるインフィニバンドを使用している場合、見通しは少し明るくなります. (openfabrics の場合) メモリをピン留めしたままにしておく場合、および/またはベンダー固有のモジュール (Mellanox の場合は mxm、Qlogic の場合は psm) を使用できる場合は、状況がいくぶん速く進む可能性があります。共有メモリを使用している場合、knem カーネル モジュールはノード内トランスポートにも役立ちます。

メモリが大きな問題ではない場合に実行できるもう 1 つの実装固有のアプローチは、データを直接送信するために熱心なプロトコルを使用するか、チャンクごとにより多くのデータを送信して、進行エンジンのナッジが少なくて済むようにすることです。ここで熱心なプロトコルが意味することは、最終的にメッセージの送信につながる一連のハンドシェイクを開始するのではなく、送信時にデータが自動的に送信されることです。悪いニュースは、これには通常、ライブラリ用に追加のバッファ メモリが必要になることですが、それが問題ではなく、着信メッセージの数が制限されていることがわかっている場合 (たとえば、ハロー ネイバーの数によって)、これは非常に役立ちます。 . (例) openmpi の共有メモリ トランスポートに対してこれを行う方法は、共有メモリのチューニングに関する OpenMPI ページで説明されています。ですが、他のトランスポートや他の実装にも同様のパラメータが存在します。IntelMPIが備えている優れたツールの 1 つは、最高のパフォーマンスを得るために多数のパラメーターを自動的に実行する「mpitune」ツールです。

于 2012-07-17T21:55:56.730 に答える
0

MPI 仕様には次のように記載されています。

非ブロック送信呼び出しは、システムが送信バッファーからデータのコピーを開始できることを示します。非ブロッキング送信操作が呼び出された後、送信が完了するまで、送信者は送信バッファのどの部分も変更しないでください。

そうです、最初にデータを専用の送信バッファにコピーする必要があります。

于 2012-07-17T19:20:37.007 に答える