【发布时间】:2017-01-27 13:45:37
【问题描述】:
考虑一个网格,其 bin 在进程之间分解。图中的数字是进程的等级。
在每个时间步,一些点会发生位移,因此需要将它们发送到新的目的地。该点发送由具有位移点的所有进程完成。图中仅以左下角 bin 的点为例。
我不知道一个进程应该持续监听接收消息多长时间?问题是接收者甚至不知道消息是否会到达,因为没有点可能传递到它的区域。
另请注意,点的来源和目的地可能与蓝点相同。
编辑:下面是表达问题的不完整代码。
void transfer_points()
{
world.isend(dest, ...);
while (true)
{
mpi::status msg = world.iprobe(any_source, any_tag);
if (msg.count() != 0)
{
world.irecv(any_source, ...);
}
// but how long keep probing?
if (???) {break;}
}
}
【问题讨论】:
-
你基本上必须发送一个特殊的停止消息。
-
首先使用
MPI_Alltoall()来判断每个进程要发送多少条消息? -
我建议始终向所有邻居发送消息,即使没有要转移的点,这意味着每次接收都将始终完成。要表明这是一条空消息,您可以使用特殊标记,或者使用 MPI_Get_count 找出传入消息的长度。