web-dev-qa-db-ja.com

MPI不明なソースからの受信

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

25
shkk

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

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);
52
KeithB

MPI_ANY_SOURCEが明白な答えです。

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

2
Stan Graves