1

有没有办法检查某些进程是否正在等待 MPI_Recv?

我有一个根进程和一些从属进程。

从属伪代码:

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,它读取一个巨大的文件并将读取的数据发送给工作人员(其余进程)。每个工作人员接收一部分数据,因此其分布良好(每个工作人员存储的数据量大致相同)。然后这些工作人员开始相互通信,发送部分计算。当一个工作人员收到一个部分计算时,它可能会产生很多新的部分结果,其中一些需要发送到其他工作。当所有工人无事可做并且没有更多的部分结果等待接收时,工作就完成了。

4

1 回答 1

0

您应该能够避免出现预期接收但没有发送的情况。在主从类型的情况下,发送处理器应始终跟踪要发送的工作量。通常,这种主从策略将与主控一起工作,一旦达到总数,主控就会跟踪并杀死从属......

在功能方面,最接近发送端探测的可能是使用非阻塞发送MPI_isend,它返回一个status可以传递给类似的东西MPI_test,它是非阻塞的,将返回MPI_SUCCESS已收到消息成功地。MPI_Wait如果您想在收到消息之前阻止发送代码,您也可以使用状态。使用带有唯一标签的测试/等待每次发送到每个进程将是一种执行您想要的方法。

于 2015-06-13T19:26:36.503 回答