複数の非同期転送のMPIポリシー


8

MPIでの複数の非同期非同期転送のポリシーは何ですか?

いくつかの開いている非同期irecv操作を持つプログラムがあります。発生する可能性のある転送(対応するものisendが呼び出された)が、まだ準備ができisendていない(対応するものがまだ呼び出されていない)他の転送を待機していることがわかりました。明らかに、この非効率性はネットワークの競合に起因するものではありません。ネットワークが不必要にアイドル状態になっています。

私のプログラムは次のようになります。

マシン1

call irecv(variable A from machine 2)
call irecv(variable B from machine 2)
call irecv(variable C from machine 2)
call wait(variable C from machine 2)
call do_important_work_with(variable C)
....

マシン2

call isend(variable C to machine 1)
call isend(variable B to machine 1)
call do a bunch of costly work
call isend(variable A to machine 1)
....

問題

の転送Cにより、の転送が不必要にブロックされているようですA

私はそれを見つけるwaitvariable Cマシン1には、マシン2完了にコストのかかる作業の後まで完了しません。この転送は私のプログラムの最初に開始された可能性があるため、これは残念です。の転送がA完了するのを不必要に待機しているようです。

ご質問

特に、私は次のような計算をしています。

  • これは予想されますか?
  • 複数の非同期非同期転送のポリシーは何ですか?
  • コードを再配置せずにこれを回避できますか(関連する内部設定はありますか)?
  • 複数のライブ転送に関するMPIのポリシーについて詳しく知るには、どこに行けばよいですか?

転送の大きさはどれくらいですか?同じ署名の転送を順番に行う必要があります。転送ごとに異なるタグを使用していますか?また、どのMPIスタックを使用してもかまいません。転送の順序付けのセマンティクスは、MPI標準で定義されています。
Bill Barth 2013

転送は大きく(約1MB)、同じサイズ/ソース/宛先です(これは署名ですか?)。彼らは異なるタグを持っています。
MRocklin 2013

異なるタグはそれらを任意の順序で移動できるようにする必要がありますが、ハードウェアは実際にデータを移動する必要があり、それを実際に並行して実行することはできません。したがって、それが大きなメッセージである場合、基盤となるハードウェアがAとBを内部バッファーにコピーするか、NICにDMAする(使用しているハードウェアに応じて)のを待っている可能性があります。ハードウェアに応じて、受信をポストする順序を変更し、別のスタック(MPICH、MVAPICH、Intel MPIなど)を使用することをお勧めします。また、進行状況スレッドをオンにしてみてください。
Bill Barth 2013

この種の通信パターンがあり、すでにイーサネット上にある場合は、mpiの代わりにzmqを使用することを強くお勧めします。
meawoppl 2013

回答:


6

実際にを呼び出すまで、非ブロッキング送信で何らかの処理が行われる保証はありませんMPI_WAIT。オペレーションをキューに入れるだけで完全に有効な実装であり、を呼び出すとMPI_WAIT、すべてのMPI_ISENDオペレーションが一度に完了します。実際には、通常、MPIライブラリに入るたびに進行する可能性があり、非同期進行スレッドを有効にすると、バックグラウンドで進行する可能性が高くなります。

署名の問題に関しては、MPIは同じコミュニケーター上の同じランクのメッセージが送信されたのと同じ順序で受信されることを保証します。

MPI標準バージョン3.0から:

順序メッセージは非追い越し:送信者が2つのメッセージを連続して同じ宛先に送信し、両方が同じ受信に一致する場合、最初のメッセージがまだ保留中の場合、この操作は2番目のメッセージを受信できません。受信者が2つの受信を連続してポストし、両方が同じメッセージに一致する場合、最初の受信がまだ保留中の場合、2番目の受信操作はこのメッセージで満たすことができません。

これは、実装がメッセージの送信を選択する方法については何も述べていませんが、少なくとも正しい順序で受信されます。

私のアドバイスは、まずプログレススレッドが有効になっていることを確認してから、本当にメッセージを送信する必要がある場所で待機を呼び出していることを確認することです(ただし、プログレススレッドを使用すれば、おそらく問題ないでしょう)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.