如何在Fortran程序中设置内部挂钟?

如何在Fortran程序中设置内部挂钟?,fortran,clock,hpc,nul,Fortran,Clock,Hpc,Nul,我用Fortran做一些科学计算。我使用HPC。正如我们所知,当我们在HPC作业调度器中提交作业时,我们还指定了作业的挂钟时间限制。但是,当时间结束时,如果作业仍在写入输出数据,它将被终止,并将导致数据中出现一些“NUL”值,从而给后处理带来麻烦: 那么,我们能否建立一个内部机制,使我们的工作能够在HPC津贴时间结束前的某个时间平静地停止 相关问题:了解您的问题后,我发现我最近在程序中实现了类似的功能(提交)。但我仍然需要手动设置时间限制 最重要的部分是: time\u stepping%cl

我用Fortran做一些科学计算。我使用HPC。正如我们所知,当我们在HPC作业调度器中提交作业时,我们还指定了作业的挂钟时间限制。但是,当时间结束时,如果作业仍在写入输出数据,它将被终止,并将导致数据中出现一些“NUL”值,从而给后处理带来麻烦:

那么,我们能否建立一个内部机制,使我们的工作能够在HPC津贴时间结束前的某个时间平静地停止


相关问题:

了解您的问题后,我发现我最近在程序中实现了类似的功能(提交)。但我仍然需要手动设置时间限制

最重要的部分是:

time\u stepping%clock\u time\u 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\u 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\u WALLTIME
。请参阅但检查您的计划程序手册


您可以使用

读取此变量。在了解您的要求后,我发现我最近在程序中实现了类似的功能(commit)。但我仍然需要手动设置时间限制

最重要的部分是:

time\u stepping%clock\u time\u 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\u 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\u WALLTIME
。请参阅但检查您的计划程序手册


您可以使用

读取此变量,也可以使用system_clock()读取,但我不太明白会发生什么,为什么会出现NULL以及您想做什么。我正在猜测您的意思,请发表评论。如果您想自动检测批处理作业的时间限制,并在达到该限制后自动关闭,那么没有标准方法。首先,你必须阅读批处理系统的文档,了解如何找出限制或你的作业,然后找到一种合适的方法将其传递给你的Fortran(注意拼写,25年来一直是小写),然后如何检测你接近该限制,以及如何“干净地”关闭。哦,我很惊讶,当工作崩溃时,你会得到上述信息,当然,任何事情都是可能的。我唯一一次看到类似的情况是,当多个进程访问Cray上Lustre文件系统上的直接访问文件时,实际上,文件中出现奇怪的NUL,这可能是由于文件缓存变得混乱(当然,多个进程通过Fortran I/O机制访问文件是非法的)谢谢Ian,现在我明白了重点。你可以使用system_clock(),但我真的不明白会发生什么,为什么会有NULL,以及你想做什么。我猜你的意思是什么。如果您想自动检测批处理作业的时间限制,并在达到该限制后自动关闭,那么没有标准方法。首先,你必须阅读批处理系统的文档,了解如何找出限制或你的作业,然后找到一种合适的方法将其传递给你的Fortran(注意拼写,25年来一直是小写),然后如何检测你接近该限制,以及如何“干净地”关闭。哦,我很惊讶,当工作崩溃时,你会得到上述信息,当然,任何事情都是可能的。我唯一一次看到类似的情况是,当多个进程访问Cray上Lustre文件系统上的直接访问文件时,实际上,文件中出现奇怪的NUL,这可能是由于文件缓存变得混乱(当然,多个进程通过Fortran I/O机制访问文件是非法的)谢谢Ian,现在我明白了重点。