MPI 2のMPI_Barrierのノンブロッキングバージョン


8

要求メッセージをやり取りするMPIプロセスがたくさんあります。プロセスは、他のどのプロセスがメッセージを送信するのか、またはその数を知りません。このような状況で、他のすべてのプロセスが自分自身がメッセージの送信を完了したと見なしているかどうかを効率的に知る方法が欲しいのです。

これは、MPI_Barrierの次の非ブロッキングバージョンによって完全に達成されます。これをMPI_Ibarrierと呼びます。

int MPI_Ibarrier(MPI_Comm comm, MPI_Request* request);

MPI_Ibarrier すぐに戻り、リクエストオブジェクトに対する標準操作により、全員がバリアに到達したことが通知されます。

MPI 2でこの動作を効率的にシミュレートする方法はありますか(つまり、公式のノンブロッキングコレクティブなし)。


そして、確かに、MPI_IbarrierはMPI 3ワーキンググループに関連してGoogle全体に広がっています。今、私たちは未来が必要です...
ジェフリー・アーヴィング

これがどのように機能するかわかりません。おそらく、このイテレーションのメッセージが処理されたときにプロセスでMPI_Ibarrierを呼び出し、次にMPI_Waitを呼び出すことを計画していますか?タスクがMPI_Ibarrierの後に続行される場合、MPI_Waitを呼び出す必要があるまでに、タスクはどのくらいの距離で許可されますか?すべてのプロシージャが完了したことを知る必要がある前に、彼らがどれだけ遠くまで行くことが許可されているのなら、なぜその時点でMPI_Barrierを配置しないのですか?IME、MPI_Barrierは、デバッグの目的を除いて、ほとんどの場合、コードに含めるのは誤りです。ほとんどの場合、コードを構造化するより効率的な方法があります。
Bill Barth

この場合、MPI_Ibarrierが最適な方法だと思います。次の通信エポックからのメッセージは、非常に大きなメモリチャンクの割り当てを解除して新しいチャンクを再割り当てしないと開始できないためです。バリアは、このメモリをいつ割り当て解除できるかを知るために必要であり、将来のメッセージを送信できるときに直接知る必要はありません。
ジェフリーアーヴィング

回答:


11

驚くべきことに、MPI_Ibarrierは非常に便利なルーチンです。たとえば、送信して受信するメッセージ数がわからないランクにメッセージの非構造化ラウンドを配信しMPI_Issend(そう、同期送信のまれな使用法)、次に交互のループに入るMPI_Testall(送信が完了したかどうかを確認する)およびMPI_Iprobe(着信メッセージを処理するため)。送信が完了したらMPI_Ibarrier、バリアを投稿および代替テストして、着信メッセージのプローブを行います。Torsten Hoeflerがこれに関する論文を書いており、通信の最適性を証明しています。アルゴリズム2を参照してください。http//unixer.de/publications/img/hoefler-dsde-protocols.pdf

バリアは、バリアが完了する前にポイントツーポイントメッセージまたは他の非ブロック化コレクティブがポストされることを保証しないことに注意してください。それらを完了させたい場合は、バリアを送信する前にそれらが完了していることを確認する必要があります。ビルが言うように、(ブロッキング)MPI_Barrierはほとんどの場合不正確/不要です。例外は、ファイルシステムなどのサイドチャネルを介した通信です。

MPI_IbarrierMPI-2でシミュレーションするための同様のパフォーマンスの方法はありませんが、MPICH2はMPIX_Ibarrier1.5ブランチ(current)で提供します。ベンダーネットワークは一般にこれらの操作をサポートしているため、ベンダーの実装(通常MPICH2から派生)にはインターフェースが必要です。パッチが1.5に移動するとすぐにMPI_Ibarrier、他の非ブロッキングコレクティブがサポートされます。Open MPI開発ブランチには、MPI_IbarrierlibNBC に基づくの実装があります。


フラグメッセージ/特別なタグを使用して、あらゆるバリアよりも効率的に実装できると思います。Hoeflerの論文へのリンクはありますか?
Bill Barth

@BillBarthこれは構造化されておらず、受信する必要があるメッセージの数がわからないことに注意してください。誰が誰にタグを送信しますか?ポイントツーポイントで独自のIbarrierを実装することになります。これは、ネイティブ実装よりも遅くなります。論文はおそらく彼のウェブサイトにあります。数か月前にそれについて話しました。
ジェドブラウン

ポイントツーポイントで独自のツリー削減を実装することは、まさに私がやったことです。プログラム全体でバリアコールは36しか存在しないため、スローダウンが問題になることはありません。
ジェフリーアーヴィング

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