我正在编写一个程序来检测远程机器的突然崩溃。 manager 进程在机器 1 上运行,worker 进程在机器 2 上运行。 manager 服务器通过调用 MPI_Isend
向工作进程发送消息。 .远程 worker 通过调用 MPI_Irecv
获取消息.每次通话后,我总是检查他们的返回码,看看 MPI_COMM_WORLD
是否有问题。 .我还检查了 MPI_Test
的返回码在 send 和 recv 调用之后运行。
不知何故,即使在我突然重新启动机器 2 之后,返回码也始终为 0。我可以看到 MPI_Isend
总是返回值 0。请给我一些关于如何检测远程机器故障的建议。
顺便说一句,我确实使用了以下语句:
MPI_Errhandler_set(MPI_COMM_WORLD,MPI_ERRORS_RETURN);
最佳答案
可能早就应该把它变成一个答案,以便其他人更容易追踪到这一点。
正如其他帖子中所讨论的,MPI_Send
而 friend 的完成并不一定表示对方已经收到消息。只有 MPI_Ssend
意味着任何类型的完成,甚至仅表示接收方已开始将消息接收到其缓冲区中。
对于这个特殊问题,MPI_Ssend
可能就足够了,因为它表明发生了故障,尽管它会减慢速度。
最后,您不能依靠发送方的语义来告诉您发生了故障,而无需在 MPI 中做额外的工作。标准中没有内置的保证来这样做,因为它们会很昂贵。如果您必须快速了解发送方,请使用 MPI_Ssend
.否则,先做一堆操作,然后再做一些同步(比如 MPI_Ssend
或 MPI_Barrier
,如果你想一次验证所有进程)。
关于mpi - 当远程机器死机时,MPI 管理器无法通过 MPI_Irecv 调用检测到它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23421735/