我在 Amazon EC3 平台上进行计算,使用通过 OpenMPI 连接的多台机器。为了降低计算成本,使用了现场实例,当机器的成本超过最大预设价格时会自动关闭:http: //aws.amazon.com/ec2/spot-instances/。发生了一个奇怪的行为:当一台机器关闭时,MPI 通信器中的其他进程仍然继续运行。我认为在进程有时间向其他进程指示它已收到终止信号之前,网络接口已被静音。
我在多篇文章中读到 MPI 没有提供很多关于容错的高级资源。另一方面,我的程序的结构很简单:一个主进程被从进程查询,以获得执行部分代码的权限。主进程只跟踪它已回复的查询数量,并在达到上限时告诉从属进程停止。从站之间没有耦合。
如前所述,我希望能够检测到进程何时静默死亡。在那种情况下,我会将他所做的工作重新归因于一个还活着的奴隶。有没有简单的方法来检查是否死亡?我曾想过使用线程和套接字独立于 MPI 层的其余部分来执行此操作,但这似乎很麻烦。我还考虑在主进程(在非现场实例上启动)维护与每个进程的最后一次通信时间的列表,并指定超时,但这并不能保证我的从进程已经死了。还有一个问题是“barrier”和“finalize”函数不会看到所有的进程,并且可能会挂起。
那么我的问题是你会实施什么样的解决方案来检测进程是否静默死亡?您将如何修改其余代码以与减少的进程数兼容?