有没有办法检查某些进程是否在等待MPI_Recv?
我有一个root proc和一些slave进程。
Slave psedo-code:
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上,则作业完成,我需要制动循环。 现在我需要一些方法来通知从属进程完成工作。有没有办法做到这一点?我想可能有类似反向探测的东西来检查是否有人等待消息而不是检查是否有消息要接收。 Haven没有找到任何有用的东西。
编辑:更多解释。
我有一个root proc,它读取一个巨大的文件并将读取数据发送给worker(其余进程)。每个工作人员都会收到一部分数据,因此其分布均匀(每个工作人员的数据量大致相同)。 然后这些工人开始相互通信,发送部分计算。当工人收到部分计算时,它可能会产生许多新的部分结果,其中一些结果需要发送给其他工作人员。当所有工人无事可做,并且没有更多的部分结果等待接收时,工作就完成了。
答案 0 :(得分:0)
您应该能够避免出现预期接收但未发送任何内容的情况。在主从类型情况下,发送处理器应始终跟踪要发送的工作量。通常,这种主从策略可以与主控制一起使用,并在达到总数后终止奴隶......
就函数而言,与发送方的探测最接近的等价物可能是使用非阻塞发送MPI_isend
,它返回status
,可以传递给MPI_test
。 1}},这是非阻塞的,并且将成功收到消息的MPI_SUCCESS
。如果要阻止发送代码,则可以将MPI_Wait
与状态一起使用,直到收到消息为止。对每个进程的每次发送使用带有唯一标记的测试/等待将是一种执行所需操作的方法。