我尝试使用MPI_Bcast从根节点向所有其他节点广播一条消息。然而,每当我运行这个程序时,它总是在开始时挂起。有人知道它出了什么问题吗?
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
int rank;
int buf;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank == 0) {
buf = 777;
MPI_Bcast(&buf, 1, MPI_INT, 0, MPI_COMM_WORLD);
}
else {
MPI_Recv(&buf, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
printf("rank %d receiving received %d\n", rank, buf);
}
MPI_Finalize();
return 0;
}发布于 2011-10-24 01:22:37
对于刚接触MPI的人来说,这是一个常见的困惑来源。您可以使用MPI_Bcast(),而不是使用MPI_Recv()来接收广播发送的数据。
例如,你想要的是:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
int rank;
int buf;
const int root=0;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank == root) {
buf = 777;
}
printf("[%d]: Before Bcast, buf is %d\n", rank, buf);
/* everyone calls bcast, data is taken from root and ends up in everyone's buf */
MPI_Bcast(&buf, 1, MPI_INT, root, MPI_COMM_WORLD);
printf("[%d]: After Bcast, buf is %d\n", rank, buf);
MPI_Finalize();
return 0;
}对于MPI集体通信,每个人都必须参与;每个人都必须称为Bcast,或Allreduce,或您拥有的任何东西。(这就是为什么Bcast例程有一个参数来指定"root",或者谁在做发送;如果发送者调用bcast,您就不需要这个参数了。)每个人都调用广播,包括接收器;接收器不只是发布接收。
这样做的原因是,集体操作可以涉及通信中的每个人,因此您可以声明您希望发生什么(每个人都获得一个进程的数据),而不是它如何发生(例如,根处理器在所有其他级别上循环并进行发送),因此存在优化通信模式的空间(例如,基于树的分层通信采用log(P)步骤,而不是P个进程的P步骤)。
发布于 2016-08-19 23:34:47
MPI_Bcast是一个集合操作,它必须被所有进程调用才能完成。
并且在使用MPI_Bcast时不需要调用MPI_Recv。有一篇文章可能会对你有所帮助,click here
https://stackoverflow.com/questions/7864075
复制相似问题