4

我正在编写一个程序来检测远程机器的突然崩溃。manager 进程在机器 1 上运行,worker 进程在机器 2 上运行。 manager 服务器通过调用 向 worker 进程发送消息MPI_Isend。远程工作者通过调用MPI_Irecv. 每次通话后,我总是检查他们的返回码,看看是否有问题MPI_COMM_WORLD。我还检查MPI_Test了在 send 和 recv 调用之后运行的返回码。

不知何故,即使在我突然重新启动机器 2 后,返回码也始终为 0。我可以看到MPI_Isend总是返回值 0。请给我一些关于如何检测远程机器故障的建议。

顺便说一句,我确实使用了以下语句:

MPI_Errhandler_set(MPI_COMM_WORLD,MPI_ERRORS_RETURN);
4

1 回答 1

0

可能早就应该把它变成一个答案,以便其他人更容易找到它。


正如在其他帖子中所讨论的那样,MPI_Send朋友的完成并不一定表示另一端已收到消息。仅MPI_Ssend表示任何类型的完成,甚至仅表示接收者已开始将消息接收到其缓冲区中。

对于这个特定问题,MPI_Ssend可能就足够了,因为它表明发生了故障,尽管它会减慢速度。

最后,您不能依靠发送方语义来告诉您发生了故障而不在 MPI 中做额外的工作。标准中没有保证这样做,因为它们会很昂贵。如果您必须在发送方快速了解,请使用MPI_Ssend. 否则,做一堆操作,然后做一些同步的事情(比如一个MPI_Ssend或一个MPI_Barrier如果你想一次验证所有进程)。

于 2015-05-08T17:22:50.500 回答