MPI 標準 3.0 は、セクション 5.13 で次のように述べています。
最後に、マルチスレッドの実装では、1 つのプロセスで複数の同時実行の集団通信呼び出しを行うことができます。このような状況では、同じコミュニケーターが同じプロセスで 2 つの異なる集団通信呼び出しによって同時に使用されないようにするのは、ユーザーの責任です。
正しく実行されず(ただしコンパイルされ)、コアをダンプする次のプログラムを作成しました
void main(int argc, char *argv[])
{
int required = MPI_THREAD_MULTIPLE, provided, rank, size, threadID, threadProcRank ;
MPI_Comm comm = MPI_COMM_WORLD ;
MPI_Init_thread(&argc, &argv, required, &provided);
MPI_Comm_size(comm, &size);
MPI_Comm_rank(comm, &rank);
int buffer1[10000] = {0} ;
int buffer2[10000] = {0} ;
#pragma omp parallel private(threadID,threadProcRank) shared(comm, buffer1)
{
threadID = omp_get_thread_num();
MPI_Comm_rank(comm, &threadProcRank);
printf("\nMy thread ID is %d and I am in process ranked %d", threadID, threadProcRank);
if(threadID == 0)
MPI_Bcast(buffer1, 10000, MPI_INTEGER, 0, comm);
If (threadID == 1)
MPI_Bcast(buffer1, 10000, MPI_INTEGER, 0, comm);
}
MPI_Finalize();
}
私の質問は次のとおりです。スレッド ID 0 とスレッド ID 1 を持つ各プロセスの 2 つのスレッドは、ルート プロセス (プロセス 0) で MPI_Send() として取得できるブロードキャスト呼び出しをポストします。残りのプロセスが宛先である MPI_Send() の 2 つのループとして解釈しています。宛先プロセスは、スレッド ID 0 とスレッド ID 1 にも MPI_Bcast() をポストします。これらは、2 つのスレッドの各プロセスによってポストされた 2 つの MPI_Recv() と見なすことができます。MPI_Bcast() は同一であるため、プロセス 0 (ルート) から送信されたメッセージを受信する際に一致の問題は発生しないはずです。しかし、それでもプログラムは機能しません。なんで ?同じコミュニケーターの異なる/同じコレクティブでメッセージが混同される可能性があるためですか? そして、MPI(mpich2)はその可能性を見て、