如何在 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 程序中设置内部挂钟?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hibernate 中设置内部查询的限制?

如何在SharePoint 2010中设置SPField的内部名称?

37如何在函数中设置一个全局变量 ?

如何在本地网络中设置每个人都可以看到的本地域?

如何在子组件中设置状态?

如何使用 C# 和 LibreOffice/OpenOffice 在电子表格单元格中设置粗体文本?