3

マスター/スレーブのセットアップがあるプログラムがあり、さまざまな種類のデータをスレーブに送信するマスター用にいくつかの機能が実装されています。一部の関数は個々のスレーブに送信しますが、一部の関数はMPI_Bcastを介してすべてのスレーブに情報をブロードキャストします。

スレーブで受信機能を1つだけにしたいので、メッセージをプローブして、メッセージがブロードキャストされたのか、通常のブロッキングメッセージとして送信されたのかを知りたいのです。これは、ブロードキャストされたものと何を受信するかが異なるためです。正常に送信されました。

4

1 に答える 1

5

いいえ、プローブ呼び出しに基づいてBcastとRecvのどちらを呼び出すかを決定することはできません。

MPI_Bcast呼び出しは集合的な操作であり、すべてのMPIタスクが参加する必要があります。結果として、これらはポイントツーポイント通信のようなものではありません。それらは、すべてのプロセスが高次の最適化を行うために関与しているという事実を利用しています。

集合操作は非常に多くの同期を意味するため、他のタスクが集合への参加を開始する必要があるかどうかを確認できるようにすることは意味がありません。これは、プログラムのロジックに組み込む必要があるものです。

  • ブロードキャストでのルートプロセスの役割は、送信とは異なります。一般に、MPI_Bcastを呼び出して続行することはできません。他のいくつかのプロセスがブロードキャストに参加するまで、実装はほぼ確実にブロックされます。と

  • ブロードキャストにおける他のプロセスの役割は、メッセージの受信とは異なります。一般的には、情報の受信と送信の両方になります。したがって、ブロードキャストに参加することは、単純なRecv呼び出しを行うこととは異なります。

したがって、プローブは機能しません。MPI_Probeのドキュメントは、次のMPI_Recvで何が起こるかについての情報を返すことをかなり明確に示しており、RecvはBcastとは異なる操作です。

現在完成しているMPI3.0で必要なものの一部を取得できる場合があります。これにより、非ブロッキング集合体(MPI_Ibcastなど)が可能になります。その場合、ブロードキャストを開始し、MPI_Testを呼び出して、要求のステータスを確認できます。ただし、ここでも、最初にMPI_Ibcastを呼び出す必要があります。これにより、集合的およびポイントツーポイント通信のインターリーブが容易になります。

于 2012-06-13T11:55:54.930 に答える