我是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小时!该程序已暂停或正在等待,我不知道为什么。
答案 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
您注意到主程序a.out
处于睡眠状态,并且系统调用和主程序都在单独的内核上运行。由于主程序处于睡眠状态,因此CPU_TIME
这次不会计时。
注意: solaris-studio是奇怪的鸭子,但是再说一遍,它是solaris工作室!
一般注释: CPU_TIME
对于确定代码段的执行时间仍然有用。它对定时外部程序没有用。还存在其他更专用的工具,例如time
:OP的程序可以简化为bash命令:
$ time ( for i in $(seq 1 6320); do blabla; done )
这是标准在CPU_TIME(TIME)
上要说的
CPU_TIME(TIME)
说明:返回处理器时间。
注意:13.9:单个结果不足的处理器(例如,并行处理器)可能会选择 提供时间为数组的其他版本。
由于不同处理器的能力各不相同,因此时间的确切定义不准确 提供。 主要目的是比较同一处理器上的不同算法或发现哪种算法 计算的一部分是最昂贵的。
如示例所示,开始时间不精确,因为其目的是对代码段进行计时。
大多数计算机系统都有多个时间概念。一个普遍的概念是时间消耗 给定程序的处理器。这可能包括也可能不包括系统开销,并且没有明显的区别。 与过去的“挂钟”时间相关联。
最重要的是:
从
CPU_TIME
,DATE_AND_TIME
和SYSTEM_CLOCK
返回的结果是否取决于调用它们的图像取决于处理器。注释13.8:例如,未指定是
CPU_TIME
是否返回每个图像或每个程序的值,是否全部 图像在同一时区运行,并且SYSTEM_CLOCK
中的初始计数,计数率和最大值是否对所有图像都相同。