mpif90 的信号处理和检查点

Signal handling and check pointing for mpif90

我已经编写了一个用于捕获 gfortran 的 CTRL+C 信号的代码并且它有效。

program trap  
external trap_term  
call signal(2, trap_term)  
call sleep(60)  
end program trap  

function trap_term()  
integer::trap_term  
print*,'done'  
call exit(trap_term)  
end function trap_term  

如何为 mpif90 编写完全相同的内容?此外,在并行处理器中包含检查点和重新启动(可能自动)代码(从之前离开的地方)的最佳方法是什么。

这是必需的,因为我已经在集群上分配了时间。作业在固定的小时数后被踢出,需要重新提交。

在收到来自操作系统的终止信号时将您的软件写入检查点可能远没有您希望的那么有用。假设您可以对程序进行编码,使其在被告知停止时可用的时间内编写完整的检查点。然后,您只能从之前停止的任意点重新启动程序。这是一个远非微不足道的问题。

为什么不在这个领域做我们很多人曾经做过,现在很多人还在做的事情呢?每 X 次迭代或大约 Y 分钟的时间间隔(您选择 X 和 Y)将您的代码编写到检查点?并编写例程以在先前的执行过早停止的情况下从这些检查点之一重新启动。这样你只需要从一个定义的执行状态重新启动。

您可能应该编写这些检查点并重新启动例程以防止硬件问题,随着 CPU 计数的增加和网络连接数量的增加,硬件问题只会变得更糟。

我想你可以编写代码来监视挂钟,并告诉它,在启动时,它有 N 小时的津贴,所以在 N-n 小时检查点,其中 n 足够长,可以在很小的误差范围内进行检查点设置。但是,如果 CPU 计算中途失败,这种方法将无济于事。

tl;博士;按照 High Performance Mark 和 francescalus 的建议去做。

除了 HPM 在他的回答中所说的内容之外,请记住,您可以在信号处理程序中执行的操作 非常 有限。例如,不允许分配内存,这又排除了许多其他事情,例如 Fortran(或 C stdio)I/O,因为 Fortran I/O 例程可能会分配内存供自己使用。您可以看到所谓的 'async-signal-safe' POSIX 函数列表,例如在 http://man7.org/linux/man-pages/man7/signal.7.html .

您可以在信号处理程序中可靠地做的几件事之一是设置一些标志变量,稍后您可以在主程序中检查它。例如。迭代完成后,检查标志是否检查点并退出,然后在 "normal" 上下文中执行所有 I/O 和任何操作,而不是在信号处理程序上下文中。这基本上就是 francescalus 在他对 HPM 的回答的评论中解释的内容。