我有一个主节点,每隔一段时间使用MPI_Bcast广播一条消息。问题是,我有一个特定节点需要比其他节点运行慢一点,并且说,它只会在半个时间内参与bcast。就像它一样:
// -- iteration 1
Master: MPI_Bcast(msg1)
Node1: MPI_Bcast(msg1)
Node2: MPI_Bcast(msg1)
Node0: MPI_Bcast(msg1)
// -- iteration 2
Master: MPI_Bcast(msg2)
Node1: MPI_Bcast(msg2)
Node2: MPI_Bcast(msg2)
Node0: DoSomethingImportantAndDontParticipateInBcast()
// -- iteration 3
Master: MPI_Bcast(msg3)
Node1: MPI_Bcast(msg3)
Node2: MPI_Bcast(msg3)
Node0: MPI_Bcast(msg3)
这可能吗?请注意,在最后一次迭代中,我希望Node0接收msg3而不是msg2(它忽略了)。
答案 0 :(得分:3)
您建议的模式不起作用,通信器中的所有进程都参与每个广播。
如果您按原样实施计划,则会发现node0
将MPI_Bcast(msg3)
与其他进程看作MPI_Bcast(msg2)
的广播匹配mpi_comm_create
。没有单独识别广播的机制。自从我用不匹配的广播写了一个MPI程序以来,已经很长时间了,所以我不记得到底发生了什么,我不确定标准需要什么。一般来说,我希望不好的事情发生,可能所有参与更多广播的流程都比特别的流程停止等待。
你可以做的是使用node0
来定义一个 intracommunicator ,它会排除{{1}},并根据需要在全局通信器和新通信器上调用广播。