当远程计算机死机时,MPI manager无法通过MPI_Irecv调用检测到它
我正在写一个程序来检测远程机器的突然崩溃。manager进程在机器1上运行,worker进程在机器2上运行。manager服务器通过调用当远程计算机死机时,MPI manager无法通过MPI_Irecv调用检测到它,mpi,fault-tolerance,Mpi,Fault Tolerance,我正在写一个程序来检测远程机器的突然崩溃。manager进程在机器1上运行,worker进程在机器2上运行。manager服务器通过调用MPI\u Isend向工作进程发送消息。远程工作程序通过调用MPI\U Irecv获取消息。每次调用后,我都会检查它们的返回代码,看看MPI\u COMM\u WORLD是否有问题。我还检查了在send和recv调用之后运行的MPI_Test的返回代码 不知何故,即使在我突然重新启动机器2之后,返回代码始终为0。我可以看到MPI\u Isend始终返回值0。请
MPI\u Isend
向工作进程发送消息。远程工作程序通过调用MPI\U Irecv获取消息。每次调用后,我都会检查它们的返回代码,看看MPI\u COMM\u WORLD是否有问题。我还检查了在send和recv调用之后运行的MPI_Test
的返回代码
不知何故,即使在我突然重新启动机器2之后,返回代码始终为0。我可以看到MPI\u Isend
始终返回值0。请给我一些关于如何检测远程机器故障的建议
顺便说一句,我确实使用了以下语句:
MPI_Errhandler_set(MPI_COMM_WORLD,MPI_ERRORS_RETURN);
也许早就应该把它变成一个答案,让其他人更容易找到它
正如在其他帖子中所讨论的那样,
MPI_Send
和friend的完成并不一定表示在另一端收到了消息。只有MPI\u Ssend
意味着任何类型的完成,甚至仅表示接收方已开始将消息接收到其缓冲区中
对于这个特定的问题,MPI_Ssend
可能就足够了,因为它会指示发生了故障,尽管这会减慢速度
最后,如果不在MPI中做额外的工作,就不能依赖发送方语义来告诉您发生了故障。标准中没有这样做的保证,因为这样做会很昂贵。如果您必须快速了解发送方,请使用
MPI\u Ssend
。否则,请执行一系列操作,然后稍后执行同步操作(如MPI\u send
或MPI\u屏障
,如果您希望同时验证所有进程)。您使用的是哪个MPI库?目前,容错是一种非标准功能,因此它在很大程度上取决于您使用的是MPICH还是开放MPI。我们使用的是MPICH 2还是3。我们正在尝试实现一些基本的容错功能,直到Argonne在未来推出容错功能。谢谢在这些版本中有一些容错性,您添加标志--禁用自动清理
,它将向您返回错误。另一方面,如果你根本看不到失败,这很奇怪,我也不知道发生了什么。仅供参考,阿贡正在为未来的版本开发更好的FT。希望能在几个月内完成。不能保证短发送会返回错误。消息可能是急切地发送的,而不需要往返消息。这意味着,如果您需要知道是否发生了故障,则需要采取一些措施,通过类似于MPI\u屏障的方式强制通信。