Fortran 执行时间

G.C*_*hri 5 fortran

我是 Fortran 新手,想寻求帮助。我的代码很简单。它只是进入一个循环,然后使用系统内部过程进入名称为 code 的文件并运行 evalcode.x 程序。

program subr1
  implicit none
  integer :: i,
  real    ::  T1,T2 

  call cpu_time(T1)
  do i=1,6320
    call system ("cd ~/code; ../evalcede/source/evalcode.x test ")
  enddo
  call cpu_time(T2)

  print *, T1,T2

end program subr1
Run Code Online (Sandbox Code Playgroud)

测得程序实际运行的时间是 0.5 秒,但这段代码实际执行所需的时间是 1.5 小时!程序暂停或等待,我不知道为什么。

jan*_*neb 6

内在测量CPU_TIME程序本身消耗的 CPU 时间,不包括其子进程的 CPU 时间 (1)。

显然大部分时间都花在了evalcode.x这上面,这解释了为什么报告的挂钟时间要高得多。

如果要在 Fortran 中测量挂钟时间间隔,可以使用SYSTEM_CLOCK内在函数。

(1) 嗯,至少 GFortran 就是这么做的。该标准没有具体说明其含义。


kva*_*our 6

注意:这是对Janneb帖子的详细评论,以提供更多信息。

\n\n

正如 Janneb 所指出的,该函数CPU_TIME不一定返回您想要的挂钟时间。尤其是在计时系统调用时。

\n\n

此外, 的输出CPU_TIME实际上是处理器和编译器相关的值。为了演示这一点,使用 gfortran、ifort 和Solaris-studio f90 编译以下代码:

\n\n
program test_cpu_time\n  real    ::  T1,T2 \n  call cpu_time(T1)\n  call execute_command_line("sleep 5")\n  call cpu_time(T2)\n  print *, T1,T2, T2-T1\nend program test_cpu_time\n\n#gfortran>]   1.68200000E-03   1.79799995E-03   1.15999952E-04\n#ifort   >]  1.1980000E-03  1.3410000E-03  1.4299992E-04\n#f90     >] 0.0E+0 5.00534 5.00534\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里,您可以看到 gfortran 和 ifort 都排除了系统命令的时间,而Solaris-studio 则包含了时间。

\n\n

一般来说,我们应该将两次连续调用的输出之间的差异视为CPU_TIMECPU 执行操作所花费的时间。由于系统调用,进程在执行期间实际上处于睡眠状态,因此不花费CPU时间。这可以通过一个简单的看出ps

\n\n
$ ps -O ppid,nlwp,psr,stat $(pgrep sleep) $(pgrep a.out)\n  PID  PPID NLWP PSR STAT S TTY          TIME COMMAND\n27677 17146    1   2 SN+  S pts/40   00:00:00 ./a.out\n27678 27677    1   1 SN+  S pts/40   00:00:00 sleep 5\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • NLWP表示正在使用的线程数
  • \n
  • PPID表示父PID
  • \n
  • STAT 表示“S”表示可中断睡眠(等待事件完成)
  • \n
  • PSR 是它运行的 cpu/线程。
  • \n
\n\n

您注意到主程序a.out处于睡眠状态,系统调用和主程序都在不同的内核上运行。由于主程序处于睡眠状态,所以CPU_TIME这次不会计时。

\n\n

注意: solaris-studio 很奇怪,但话又说回来,它是solaris studio!

\n\n
\n\n

总评: CPU_TIME对于确定代码段的执行时间仍然有用。它对于计时外部程序没有用处。为此还存在其他更专用的工具,例如time: OP 的程序可以简化为命令:

\n\n
$ time ( for i in $(seq 1 6320); do blabla; done )\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

这就是标准所说的CPU_TIME(TIME)

\n\n
\n

CPU_TIME(TIME)

\n\n

描述:返回处理器时间。

\n\n

注意:13.9:单个结果不足以满足要求的处理器(例如并行处理器)可能会选择\n 提供时间为数组的附加版本。

\n\n

由于不同处理器能够提供的时间存在差异,因此时间的确切定义并不精确。主要目的是比较同一处理器上的不同算法或发现计算的哪些部分最昂贵。

\n\n

开始时间不精确,因为目的是对代码段进行计时,如示例中所示。

\n\n

大多数计算机系统都有多种时间概念。一个常见的概念是处理器处理给定程序所花费的时间。这可能包括也可能不包括系统开销,并且与已用的\xe2\x80\x9c挂钟\xe2\x80\x9d时间没有明显的联系。

\n\n

来源:Fortran 2008 标准,第 13.7.42 节

\n
\n\n

最重要的是:

\n\n
\n

结果是否从 , 返回取决于处理器CPU_TIMEDATE_AND_TIME并且SYSTEM_CLOCK取决于哪个图像调用它们。

\n\n

注13.8:例如,未指定是否CPU_TIME返回每个图像或每个程序的值,所有图像是否在同一时区运行,以及所有图像的初始计数、计数率和最大值SYSTEM_CLOCK是否相同图片。

\n\n

来源:Fortran 2008 标准,第 13.5 节

\n
\n