メッセージの受信をMPIプロセスに通知する効率的な方法は何ですか?


8

ではMPI、他のプロセスからメッセージを受信する必要があることをプロセスのグループに通知するための組み込みメカニズムはありますか?

私のアプリケーションでは、すべてのプロセスが既知のランクID(各反復で変更される可能性がある)を持つプロセスのグループにデータを送信する必要がありますが、メッセージを受信するプロセスのランクはわかりません。ありとあらゆるプロセスに問い合わせることなくこれを実現するポータブルな、できれば組み込みの方法はありますか?

回答:


7

あなたは、すべてのプロセッサが使用した試みることができるMPI_IProbeまたはMPI_Probeを与えられたタグを持つすべての受取メッセージがあるかどうかを確認するためにMPI_ANY_SOURCEで。一致するメッセージがある場合は、返されたステータスから送信者のランクを抽出し、すぐにMPI_Recvを呼び出すことができます。


通話はMPI_Probe基本的に安いですMPI_Recvか?
mmirzadeh 2013

@GradGuy MPI_IProbeとMPI_Probeを使用すると、実際にはメッセージを受信しません(受信可能なメッセージがあるかどうかを確認するためにMPIにクエリを実行しているだけです)。その意味で、MPI_Recvよりも安いと思います。
マシューエメット2013

@MatthewEmmettレシーバMPI_IProbeは、ポストするコールの数、またはプローブを継続する時間をどのようにして知っていますか?
Shibli

12

他の人はすでにさまざまなMPI_Probeバリアントを提案していますが、1つ指摘したいことがあります。MPIはリモートプロシージャコールではありません。つまり、メッセージを受信したことをプロセスに通知する方法はありません(たとえば、シグナルを発生させることによって) )。メッセージは送信されますが、受信プロセスが実際にそれらを探しに行かなければ、何も起こりません。そのため、あなたの質問に対する答えは「いいえ」ですが、メッセージが送信されたかどうかをプロセスが積極的に把握できます。


理論的には、MPI_Probeは、使用されるまでパッシブになるようにカーネルによってスケジュール解除できます。これは、IBMがBlue Geneに実際のRPCを実装する方法(OSとHWが連携して呼び出し可能な非常に効率的なネットワーク起動割り込みを実装する方法)とあまり変わらない任意のユーザー定義のコールバック)。もちろん、私が知っている実装では、MPI呼び出しをブロックすることでこれを実際に行っていません...
Jeff

1
私が言いたかったのは、実際にどのように実装されるかではなく、MPIについて考えるときに必要なメンタルモデルについてです。MPIは純粋にパッシブな概念です。別のプロセスからデータにアクセスすることはできません。着信メッセージが到着した場合にシグナルが発生することは期待できません。あなたが積極的に1が入って来たかどうかのメッセージを見て送信する場合、すべてがしか起こります。
ヴォルフガングBangerth

シグナルは正しいですが、RMAはリモートデータへのアクセスを提供し、実装は受動的な進歩を提供することになっています。
ジェフ

1
はい、MPI 3が「片側通信」と呼んでいるものについて話しています。これはかなり最近の追加で、おそらくほとんど使用されません。しかし、私が上にレイアウトしたメンタルモデルからそれを取り除くことはないと思います。
Wolfgang Bangerth 2013

MPI 2.0には10年前のRMAがあり、それらの機能を使用してput_with_notifyなどを実装できます。MPIにはリモートプロシージャコール(アクティブなメッセージ)が(まだ)ないことに同意しますが、IBM以外のマシンはそれらをポーリングなしで実装しないため、ポーリングの必要性を批判している場合は、MPIについてこれ以上話しません。
ジェフ


1

送信者が送信先を知っていても、受信者が送信者を知らない場合は、MPI_ANY_SOURCEから受信者を投稿してください。これは、受信とメッセージを送信する任意のプロセスを一致させます。

受信者が実際には何も受信しない可能性がある場合は、iRecvを投稿できます。プロセスがメッセージの送信を完了すると、いつでもIbarrierにポストできます。すべてのプロセスがIbarrierに入力して(そして要求オブジェクトでMPI_WAITを呼び出して)Ibarrierが完了すると、誰もが通信が完了し、以前のIrecvをキャンセルできることを知っています。


メッセージはどの順序で受信されますか?いくつかの計算の結果を送信者に送り返す必要があります...
mmirzadeh

受信は送信プロセスごとに順番になります。ランク1がメッセージA-B-Cをこの順序で送信すると、メッセージはその順序で到着します。プロセス間の順序の保証はありません。
ウェズリーブランド2013

わかりました...しかし、プロセスからのメッセージが混在していないことが保証されていますか?
mmirzadeh 2013

いいえ。プロセス間のメッセージは任意の順序で到着できます。
ウェズリーブランド2013

3
MPI_Cancelは恐ろしい関数であり、できるだけ頻繁に使用しないでください。代わりに、プローブのバリアントを強く推奨しています。
ジェフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.