ETIME和CPU_TIME之间有什么关系?

时间:2016-11-14 14:50:24

标签: performance gcc fortran gfortran

我正在尝试衡量一些Fortran代码的性能,目前这是使用ETIME完成的(基本上与文档中的示例相同)。但是,TIME值似乎不能实时测量(它与UNIX实用程序time的'实际输出不匹配)。

CPU_TIME是否可以更好地衡量程序的实际执行时间?我认为来自TIME的{​​{1}}会给出用户和系统时间的总和,因此应该与实时相同或接近(或ETIME)?

代码不会分叉任何子进程。

以下等效代码,基于手册中的示例。使用CPU_TIME运行。

真实代码写入磁盘,如果几个单独的进程同时运行,则实时(由time ./program报告)会上升。但是,timeETIME都没有检测到任何变化。

来自CPU_TIME的真实报告的时间最多可达timeETIME报告时间的两倍。

CPU_TIME

(偷偷进入最后一个;为什么建议使用 program test_etime integer(8) :: i, j real, dimension(2) :: tarray real :: result real :: start, finish ! ! Comment out relevant part ! print *, "TESTING ETIME" call ETIME(tarray, result) print *, result print *, tarray(1) print *, tarray(2) do i=1,100000000 ! Just a delay j = i * i - i end do call ETIME(tarray, result) print *, result print *, tarray(1) print *, tarray(2) !print *, "TESTING CPU_TIME" !call cpu_time(start) !do i=1,100000000 ! Just a delay ! j = i * i - i !end do !call cpu_time(finish) !print '("Time = ",f6.3," seconds.")',finish-start end program test_etime 语法?)

1 个答案:

答案 0 :(得分:0)

这里有几次豆治疗,没有对ETIME的压力。

标准Fortran不知道任何ETIME。它是您的编译器提供的扩展,您必须阅读编译器的手册以了解它的作用。它可能因编译器而异。

在手册中,他们非常清楚地说明了ETIME为gfortran所做的事情。如果您认为存在问题,那么您应该首先向我们展示您的结果!

CPU_TIME测量CPU时间,它是所有线程花费的CPU时间的总和!它可能比并行程序执行程序的实际时间多几倍。

对于挂钟时间测量,请使用标准SYSTEM_CLOCK()。或者,如果您使用OpenMP和MPI,则某些人(不是我)更喜欢omp_get_wtime()MPI_Wtime()。结果应与测量不确定度相同。

与操作系统报告的时间real当然还有一点差异!它测量的是程序中两点之间花费的挂钟时间。但是不要忘记在代码开始执行之前和代码开始执行之后花了一些时间。有涉及的程序运行的初始化和最终确定。

为什么推荐使用ETIME?谁知道肯定,但不纯的功能并不好。理想情况下,函数应为同一输入返回相同的答案。这显然不是。

伪随机生成器中存在非常类似的问题。它们应该是子程序,而不是函数。