MPI 标准 3.0 在第 5.13 节中说
最后,在多线程实现中,一个进程可以有多个并发执行的集体通信调用。在这些情况下,用户有责任确保同一个通信器不会被同一进程中的两个不同的集体通信调用同时使用。
我编写了以下程序,它不能正确执行(但可以编译)并转储一个核心
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 的两个线程发布一个广播调用,可以将其视为根进程(即进程 0)中的 MPI_Send()。我将其解释为两个 MPI_Send() 循环,其中目标是剩余进程。目标进程还在线程 ID 0 和线程 ID 1 中发布 MPI_Bcast()。这可以视为两个线程中每个进程发布的两个 MPI_Recv()。由于 MPI_Bcast() 是相同的 - 在接收进程 0(根)发送的消息时应该没有匹配问题。但是该程序仍然无法正常工作。为什么 ?是因为消息可能会在同一个通信器上的不同/相同集合中混淆吗?由于 MPI (mpich2) 看到了这种可能性,