MPI标准3.0表示在第5.13节该MPI_Bcast使用线程(OpenMP的)在MPI
最后,在多线程实现中,一个可以在一个过程中多于一个, 同时执行,集体通信呼叫。在 这些情况下,用户有责任确保在同一进程中通过两个不同的集体 通信调用同时使用相同的通信器。
我写了下面的程序不正确地执行(但编译)和转储芯
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)认为这种可能性,它不允许同一个通信器上的两个集体同时等待吗?
谢谢您抽出时间详细回答。 –
第一:我检查了提供的值,它是MPI_THREAD_MULTIPLE。第二:我故意看到哪个线程在哪个进程中THIRD:再次故意,因为我想MPI_Bcast()看起来相同。第四:你对二进制和二叉树的实现是正确的,但我期望2进程只有他们会直接去做一个简单的SEND和RECV。您对碎片做了一个很好的说明 - 我已经将它添加到了我的想法中:) FIFTH:某处MPI_Bcast()使用标记,因为我可以通过MPI_ANY_TAG发布MPI_Back()和MPI_Recv()。非常感谢! –