我正在尝试衡量一些Fortran代码的性能,目前这是使用ETIME
完成的(基本上与文档中的示例相同)。但是,TIME
值似乎不能实时测量(它与UNIX实用程序time
的'实际输出不匹配)。
CPU_TIME
是否可以更好地衡量程序的实际执行时间?我认为来自TIME
的{{1}}会给出用户和系统时间的总和,因此应该与实时相同或接近(或ETIME
)?
代码不会分叉任何子进程。
以下等效代码,基于手册中的示例。使用CPU_TIME
运行。
真实代码写入磁盘,如果几个单独的进程同时运行,则实时(由time ./program
报告)会上升。但是,time
和ETIME
都没有检测到任何变化。
来自CPU_TIME
的真实报告的时间最多可达time
或ETIME
报告时间的两倍。
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
语法?)
答案 0 :(得分:0)
这里有几次豆治疗,没有对ETIME的压力。
标准Fortran不知道任何ETIME。它是您的编译器提供的扩展,您必须阅读编译器的手册以了解它的作用。它可能因编译器而异。
在手册中,他们非常清楚地说明了ETIME为gfortran所做的事情。如果您认为存在问题,那么您应该首先向我们展示您的结果!
CPU_TIME测量CPU时间,它是所有线程花费的CPU时间的总和!它可能比并行程序执行程序的实际时间多几倍。
对于挂钟时间测量,请使用标准SYSTEM_CLOCK()
。或者,如果您使用OpenMP和MPI,则某些人(不是我)更喜欢omp_get_wtime()
和MPI_Wtime()
。结果应与测量不确定度相同。
与操作系统报告的时间real
当然还有一点差异!它测量的是程序中两点之间花费的挂钟时间。但是不要忘记在代码开始执行之前和代码开始执行之后花了一些时间。有涉及的程序运行的初始化和最终确定。
为什么推荐使用ETIME?谁知道肯定,但不纯的功能并不好。理想情况下,函数应为同一输入返回相同的答案。这显然不是。
伪随机生成器中存在非常类似的问题。它们应该是子程序,而不是函数。