如何在 Fortran 程序中设置内部挂钟?
Posted
技术标签:
【中文标题】如何在 Fortran 程序中设置内部挂钟?【英文标题】:How to set internal wall clock in a Fortran program? 【发布时间】:2017-03-27 23:18:32 【问题描述】:我使用 Fortran 进行一些科学计算。我使用高性能计算。众所周知,当我们在 HPC 作业调度程序中提交作业时,我们还会为我们的作业指定挂钟时间限制。但是到了时间到了,如果作业还在写输出数据,就会终止,会导致数据中出现一些'NUL'值,给后期处理带来麻烦:
那么,我们是否可以设置一个内部机制,让我们的工作可以在 HPC 津贴时间结束前的某个时间自动停止?
相关问题:How to skip reading "NUL" value in MATLAB's textscan function?
【问题讨论】:
gcc.gnu.org/onlinedocs/gcc-4.5.2/gfortran/… 你可以 system_clock() 但我真的不明白会发生什么,为什么会有 NULL 以及你想要做什么。 我猜你的意思的评论。如果您想自动检测您在批处理作业中的时间限制是多少,并在您接近时自动关闭,那么没有标准方法。您首先必须阅读批处理系统的文档,以了解如何找出限制或您的工作,然后找出合适的方法将其传递给您的 Fortran(注意拼写,小写字母已经超过 25 年了),然后如何检测你是否接近那个限制以及如何“干净地”关闭。 哦,我很惊讶当工作崩溃时你得到上述结果,当然一切皆有可能。我唯一见过类似的情况是当多个进程正在访问 Cray 上的 Lustre 文件系统上的直接访问文件时,实际上我们在文件中得到了奇怪的 NUL,大概是由于文件缓存变得混乱(当然是多个进程访问通过 Fortran I/O 机制的文件是非法的) 谢谢伊恩,现在我明白了重点。 【参考方案1】:在意识到你在问什么后,我发现我最近在我的程序中实现了类似的功能(提交https://bitbucket.org/LadaF/elmm/commits/f10a1b3421a3dd14fdcbe165aa70bf5c5001413f)。但是我还是要手动设置时间限制。
最重要的部分:
time_stepping%clock_time_limit
是以秒为单位的时间限制。计算对应的系统时钟滴答数:
call system_clock(count_rate = timer_rate)
call system_clock(count_max = timer_max_count)
timer_count_time_limit = int( min(time_stepping%clock_time_limit &
* real(timer_rate, knd), &
real(timer_max_count, knd) * 0.999_dbl) &
, dbl)
启动计时器
call system_clock(count = time_steps_timer_count_start)
检查计时器并退出主循环,如果时间到了,将error_exit
设置为.true.
if (mod(time_step,time_stepping%check_period)==0) then
if (master) then
error_exit = time_steps_timer_count_2 - time_steps_timer_count_start > timer_count_time_limit
if (error_exit) write(*,*) "Maximum clock time exceeded."
end if
MPI_Bcast the error exit to other processes
if (error_exit) exit
end if
现在,您可能希望自动从调度程序获取时间限制。这将在不同的作业调度软件之间有所不同。会有一个像$PBS_WALLTIME
这样的环境变量。请参阅Get walltime in a PBS job script,但请查看您的调度程序手册。
你可以使用GET_ENVIRONMENT_VARIABLE()读取这个变量
【讨论】:
以上是关于如何在 Fortran 程序中设置内部挂钟?的主要内容,如果未能解决你的问题,请参考以下文章