Fortran执行时间

时间:2018-09-11 11:09:51

标签: fortran

我是Fortran的新手,我想寻求帮助。我的代码很简单。它只是进入一个循环,然后使用系统固有过程输入带有名称代码的文件并运行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

测得的程序实际运行时间为0.5秒,但此代码实际执行时间为1.5小时!该程序已暂停或正在等待,我不知道为什么。

2 个答案:

答案 0 :(得分:3)

[1, 5, 7] [1, 5, 7] [1, 5, 7] 内在函数衡量程序本身消耗的CPU时间,不包括其子进程(1)的CPU时间。

显然,大部分时间都用在CPU_TIME中,这解释了为什么报告的挂钟时间要长得多。

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

(1)嗯,至少GFortran就是这样做的。该标准并未确切说明其含义。

答案 1 :(得分:3)

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

如Janneb所指出的,函数CPU_TIME不会必要地返回wall-clock time,这是您要执行的操作。尤其是在计时系统调用时。

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

program test_cpu_time
  real    ::  T1,T2 
  call cpu_time(T1)
  call execute_command_line("sleep 5")
  call cpu_time(T2)
  print *, T1,T2, T2-T1
end program test_cpu_time

#gfortran>]   1.68200000E-03   1.79799995E-03   1.15999952E-04
#ifort   >]  1.1980000E-03  1.3410000E-03  1.4299992E-04
#f90     >] 0.0E+0 5.00534 5.00534

在这里,您看到gfortran和ifort都排除了系统命令的时间,而solaris-studio包括了时间。

通常,应该看到两次连续调用CPU_TIME的输出之间的差异,这是CPU执行操作所花费的时间。由于系统调用,该进程实际上在执行期间处于睡眠状态,因此不花费任何CPU时间。可以通过简单的ps来看到:

$ ps -O ppid,nlwp,psr,stat $(pgrep sleep) $(pgrep a.out)
  PID  PPID NLWP PSR STAT S TTY          TIME COMMAND
27677 17146    1   2 SN+  S pts/40   00:00:00 ./a.out
27678 27677    1   1 SN+  S pts/40   00:00:00 sleep 5
  • NLWP指示正在使用多少个线程
  • PPID表示父级PID
  • STAT表示“ S”表示可中断睡眠(等待事件完成)
  • PSR是运行它的CPU /线程。

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

注意: solaris-studio是奇怪的鸭子,但是再说一遍,它是solaris工作室!


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

$ time ( for i in $(seq 1 6320); do blabla; done )

这是标准在CPU_TIME(TIME)上要说的

  

CPU_TIME(TIME)

     

说明:返回处理器时间。

     

注意:13.9:单个结果不足的处理器(例如,并行处理器)可能会选择   提供时间为数组的其他版本。

     

由于不同处理器的能力各不相同,因此时间的确切定义不准确   提供。 主要目的是比较同一处理器上的不同算法或发现哪种算法   计算的一部分是最昂贵的。

     

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

     

大多数计算机系统都有多个时间概念。一个普遍的概念是时间消耗   给定程序的处理器。这可能包括也可能不包括系统开销,并且没有明显的区别。   与过去的“挂钟”时间相关联。

     

来源:Fortran 2008 Standard, Section 13.7.42

最重要的是:

  

CPU_TIMEDATE_AND_TIMESYSTEM_CLOCK返回的结果是否取决于调用它们的图像取决于处理器。

     

注释13.8:例如,未指定CPU_TIME是否返回每个图像或每个程序的值,是否全部   图像在同一时区运行,并且SYSTEM_CLOCK中的初始计数,计数率和最大值是否对所有图像都相同。

     

来源:Fortran 2008 Standard, Section 13.5