29

MPI で、メイン プロセス (ランク = 0) が、ルートだけが知っている変数の値を要求する他のプロセスからの要求を受信できるようにするプログラムを実装しています。MPI_Recv(...) をランク 0 で作成すると、ルートにリクエストを送信するプロセスのランクを指定する必要がありますが、プロセスが 1,2,3 の順序で実行されないため、それを制御できません。 、....どのランクからのリクエストを受け取り、発行プロセスの番号を使用して必要な情報を送信するにはどうすればよいですか?

4

2 に答える 2

57

これは、Cを使用していることを前提としています。C++とFortranにも同様の概念があります。MPI_ANY_SOURCEでソースとして指定するだけMPI_recv()です。status structには、メッセージの実際のソースが含まれています。

int buf[32];
MPI_Status status;
// receive message from any source
MPI_recv(buf, 32, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
int replybuf[];
// send reply back to sender of the message received above
MPI_send(buf, 32, MPI_INT, status.MPI_SOURCE, tag, MPI_COMM_WORLD);
于 2010-12-03T19:59:51.053 に答える
3

MPI_ANY_SOURCE は明らかな答えです。

ただし、すべてのランクがランク 0 に要求を送信する場合は、MPI_Testall と組み合わせた MPI_Irecv もパターンとして機能する可能性があります。これにより、MPI_Send 呼び出しを任意の順序で実行でき、MPI_Irecv 呼び出しが一致した順序で情報を受信して​​処理できます。

于 2010-12-04T16:29:59.697 に答える