使用MPI_Bcast进行MPI通信


74

我正在尝试使用MPI_Bcast从根节点向所有其他节点广播消息。但是,每当我运行此程序时,它总是挂在开头。有人知道这是怎么回事吗?

Answers:


139

对于刚接触MPI的人来说,这是造成混乱的常见原因。您不习惯MPI_Recv()接收广播发送的数据。你用MPI_Bcast()

例如,您想要的是:

对于MPI集体沟通,每个人都必须参与;每个人都必须呼叫Bcast,Allreduce或您拥有的东西。(这就是Bcast例程有一个参数指定“根”或谁在进行发送的原因;如果仅发送者称为bcast,则不需要这样做。)每个人都调用广播,包括接收者;收款人不只是张贴收据。

这样做的原因是集体操作可以使每个人都参与到通信中,因此您要声明要发生的事情(每个人都获得一个进程的数据),而不是如何发生的(例如,根处理器遍历所有其他等级并执行发送),因此存在优化通信模式的范围(例如,采用log(P)步骤而不是P针对P进程的步骤的基于树的分层通信)。


感谢您这样解释。但是,对于如何使每个节点使用MPI_Recv接收消息,我仍然感到困惑。我尝试将MPI_Recv调用包装在if(rank!= 0)块中,并且没有一个,但是我的程序仍然不打印任何内容。您知道如何在每个节点上也接收消息吗?
大卫

2
你不知道 MPI_Bcast不像发送;这是一个集体操作,每个人(发送方和接收方)参与其中,并且在通话结束时,接收方具有发送方所拥有的价值。如果rank == root(此处为0),则相同的函数调用执行(类似)发送,否则执行(类似)接收。我已经更新了上面的代码,因此您可以看到每个人最终都得到相同的结果。
乔纳森·杜尔西

5
@David:如果您认为MPI_Bcast“参与广播事件”的含义可能更有意义。
休·帕金斯

2

MPI_Bcast 是集体操作,必须由所有进程调用才能完成。

MPI_Recv使用时无需调用MPI_Bcast。有一篇可能对您有帮助的帖子,请单击此处

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.