C++ C/C++;MPI:级联MPI_广播是否需要MPI_屏障?

C++ C/C++;MPI:级联MPI_广播是否需要MPI_屏障?,c++,c,mpi,C++,C,Mpi,我有一个关于级联MPI_Bcast调用的问题,我想知道当想要将不同的数据块从更改发送线程分配到所有其他线程时,是否需要记住什么 想象一下: double buff=12345; // value is not important for this example for (i=0; i<nthreads; i++) {// loop over all threads MPI_BCast(&buff, 1, MPI_DOUBLE, i, MPI_COMM_WORLD); //

我有一个关于级联MPI_Bcast调用的问题,我想知道当想要将不同的数据块从更改发送线程分配到所有其他线程时,是否需要记住什么

想象一下:

double buff=12345; // value is not important for this example
for (i=0; i<nthreads; i++) {// loop over all threads
    MPI_BCast(&buff, 1, MPI_DOUBLE, i, MPI_COMM_WORLD); // the i-th threads sends all other receive
    // some, but not all threads do something with the data
    if (threadid > i) {
        // do something that can need much more time on some threads than on others
    }
}
double buff=12345;//对于本例,值并不重要
对于(i=0;i i){
//做一些在某些线程上比在其他线程上需要更多时间的事情
}
}
我希望这个示例代码能够解释这种情况。基本上,在所有线程上都有一个for循环,在每次迭代中使用不同的发送线程,这里可能存在的问题是,每个线程再次到达MPI_Bcast需要不同的时间。当一些接收线程可能仍在接收最后一个发送者的消息时,是否可以让发送线程在那里准备就绪? 我需要一个MPI_屏障吗?或者我可以级联任意多的BCAST,只要每个线程都能访问一次,就可以了

编辑:当所有线程上都没有循环,但通过其他方式在发送线程列表中进行交互,从而可以在一行中多次使用同一个sendign线程时,会发生什么情况?
那么有没有可能混合一些东西,可能仅等待id为i的线程的信息的接收线程没有区分该线程的第一个和第二个Bcast或以下Bcast之一?

只要所有列组使用相同的根列组序列调用
MPI\u Bcast
,好的MPI实现应该不会对代码产生任何问题(就像你的代码一样)。在同一个发送线程中有多个Bcast调用时也是这样吗?我可以想象,当Bcast像“开火然后忘记”一样工作时会出现问题方法,也就是说,发送线程发送其数据,然后在其他线程仍在接收并且其中一些线程可能尚未到达Bcast调用的情况下继续。在这种情况下,发送线程可能会到达下一个Bcast,并在其他一些线程之前开始发送新数据ds甚至到达第一个bcast。广播是使用确定性算法实现的。如果MPI实现良好,即使某些进程仍在执行第一个广播,两个连续的广播也不会相互交互。请注意,Open MPI、MPICH、Intel MPI、MVAPICH和其他许多进程都属于“良好MPI”类别。谢谢,这通常是“良好MPI”方法的情况吗实现,例如MPI_allgather和MPI_reduce方法?它们可以与MPI_BCAST级联,并且彼此之间没有MPI_屏障吗?只要在所有列组中保持通过特定通信器的所有集体调用的顺序相同-是。