使用MPI_Bcast进行MPI通信
我试图使用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; }
这是MPI新手的常见混淆之处。 您不使用MPI_Recv()
来接收广播发送的数据; 你使用MPI_Bcast()
。
例如,你想要的是这样的:
#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步骤)。
MPI_Bcast
是一个集体操作,它必须由所有进程调用才能完成。
使用MPI_Bcast
时不需要调用MPI_Recv
。 还有另一个post可以帮助你, 点击这里