我已经为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编写完全相同的内容?此外,在并行处理器中包含检查点和重新启动(可能是自动)代码(从之前的位置)的最佳方法是什么。
这是必需的,因为我已在群集上分配时间。工作在固定的小时数后被踢出,需要重新提交。
答案 0 :(得分:3)
在收到来自操作系统的终止信号时将软件编写到检查点可能远没有您希望的那么有用。假设您可以编写程序,以便在被告知停止时,在可用的时间内编写完整的检查点。然后,您将从之前停止的任意点重新启动程序。这远非琐碎的问题。
为什么不在这个领域做我们许多人以前做过的事情,而我们中的许多人仍然这样做?将您的代码写入每X次迭代的检查点或大约Y分钟的间隔(您选择X和Y)?如果先前的执行过早停止,则编写例程以从其中一个检查点重新启动。这样,您只需从单个定义的执行状态重新启动。
你可能应该编写这些检查点并重新启动例程以防止硬件问题,这些问题只会随着CPU数量的增加和网络连接数量的增加而变得更糟。
我想你可以编写你的代码来监视挂钟,并且在启动时告诉它,它在Nn小时有一个N小时的补偿,所以在nn时间检查点足够长,可以用很小的误差进行检查点。但是,如果CPU在计算中间失败,这种方法将无济于事。
答案 1 :(得分:2)
TL;博士;做高性能标记和francescalus建议。
除了HPM在回答中所说的内容之外,请记住,您在信号处理程序中允许执行的操作非常有限。例如,不允许分配内存,这反过来又排除了许多其他东西,例如Fortran(或C stdio)I / O,因为Fortran I / O例程可以为自己的用途分配内存。您可以看到所谓的“异步信号安全”列表。 POSIX功能,例如在http://man7.org/linux/man-pages/man7/signal.7.html。
在信号处理程序中可以可靠地执行的一些事情是设置一些标志变量,然后在主程序中稍后检查。例如。迭代完成后,检查标志是否检查点并退出,然后执行所有I / O以及" normal"上下文,不在信号处理程序上下文中。这基本上是francescalus在他对HPM回答的评论中所解释的。