是否有方法检查某些进程是否正在等待MPI_Recv?
我有根进程和一些从进程。
从psedo代码:
while (1) {
do_some_stuff; // calls MPI_Test and clear unused buffers
MPI_Recv(buf, ...);
do_something_with_buf;
MPI_Isend(buf2, ...); // possibly many sends depending on what was in buf
}
如果所有从进程都挂在MPI_Recv上,那么工作就完成了,我需要停止循环。
现在我需要一些方法来通知从属进程任务已经完成。有办法吗?我想可能有类似反向探测的东西来检查是否有人在等待消息,而不是检查是否有消息要接收。没有发现有用的东西。
编辑:再解释一下。
我有一个根proc,它读取一个巨大的文件并将读取的数据发送给workers(其余进程)。每个工人接收一部分数据,因此其分布良好(每个工人存储的数据量大致相同)。
然后,这些工作人员开始相互通信,发送部分计算结果。当一个工人接收到一个部分计算时,它可能会产生很多新的部分结果,其中一些需要发送到其他工作。当所有的工人都无事可做,并且没有更多的部分结果等待接收时,工作就完成了。
最佳答案
你应该能够避免这样的情况,即有一个预期的接收,但没有发送。在主从式情况下,发送处理器应该始终跟踪要发送的工作量。通常,这种主从策略会与主保持跟踪和杀死奴隶一旦总数达到。。。
就功能而言,与发送端的探测最接近的等价物可能是使用非阻塞发送MPI_isend
,它返回一个status
,该MPI_test
可以传递给类似于MPI_SUCCESS
的对象,该MPI_Wait
是非阻塞的,并且将返回,因为消息已成功接收。如果要在收到消息之前阻止发送代码,也可以将与状态一起使用。对每个发送到每个进程的每个进程使用带有唯一标记的test/wait将是执行所需操作的一种方法。