Fortran mpif90的信号处理和检查点

Fortran mpif90的信号处理和检查点,fortran,signals,mpi,restart,signal-handling,Fortran,Signals,Mpi,Restart,Signal Handling,我已经为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 如

我已经为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在计算过程中出现故障,这种方法将毫无帮助。

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

为什么不在这个领域做我们许多人过去做过的,现在仍然做的事情呢?每X次迭代或每隔大约Y分钟(您选择X和Y)将代码写入检查点?并编写例程,以便在先前的执行被提前停止时从这些检查点之一重新启动。这样,您只需从单个定义的执行状态重新启动

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


我想您可以编写代码来监视挂钟,就像它一样,并在启动时告诉它,它有一个N小时的余量,以便在N-N小时进行检查点,其中N的长度足以以较小的误差进行检查点。但是,如果CPU在计算过程中出现故障,这种方法将毫无帮助。

tl;博士按照高性能马克和弗朗西斯卡勒斯的建议去做

除了HPM在他的回答中所说的之外,请记住,在信号处理器中允许您执行的操作是非常有限的。例如,不允许分配内存,这反过来排除了许多其他事情,例如Fortran(或C stdio)I/O,因为Fortran I/O例程可能会分配内存供自己使用。您可以看到所谓的“异步信号安全”POSIX函数列表,例如at


在信号处理程序中,您可以可靠地执行的几件事情之一是设置一些标志变量,然后在主程序中检查这些变量。例如,迭代完成后,检查标志是否要检查点和退出,然后在“正常”上下文中执行所有I/O操作,而不是在信号处理程序上下文中。这基本上就是弗朗西斯卡勒斯在对HPM回答的评论中所解释的;博士按照高性能马克和弗朗西斯卡勒斯的建议去做

除了HPM在他的回答中所说的之外,请记住,在信号处理器中允许您执行的操作是非常有限的。例如,不允许分配内存,这反过来排除了许多其他事情,例如Fortran(或C stdio)I/O,因为Fortran I/O例程可能会分配内存供自己使用。您可以看到所谓的“异步信号安全”POSIX函数列表,例如at


在信号处理程序中,您可以可靠地执行的几件事情之一是设置一些标志变量,然后在主程序中检查这些变量。例如,迭代完成后,检查标志是否要检查点和退出,然后在“正常”上下文中执行所有I/O操作,而不是在信号处理程序上下文中。这基本上就是francescalus在对HPM答案的评论中解释的。mpif90通常是一个编译器包装器,它通过mpi安装和运行时的链接来增强编译程序的调用。尝试将选项
-show
添加到对
mpif90
的调用中,并观察输出。
mpif90
通常是一个编译器包装器,它通过mpi安装和运行时的链接来增强编译程序的调用。尝试将选项
-show
添加到对
mpif90
的调用中,并观察输出。我有时(仍然很少)为您的第一段做的是捕捉信号,然后在下一个合适的点(迭代结束等)执行检查点。这仍然适用于“每X次迭代”,但提供了一点额外的灵活性。在你的第一段中,我有时(仍然,很少)做的是捕捉一个信号,然后做这个动作