我有一个Fortran 90程序调用多线程例程。我想从调用例程中计算这个程序。如果我使用cpu_time()
,我最终会将所有线程(在我的情况下为8)的cpu_time加在一起,而不是程序运行所需的实际时间。 etime()
例程似乎也是如此。关于如何计算这个程序(不使用秒表)的任何想法?
答案 0 :(得分:5)
尝试omp_get_wtime()
;请参阅http://gcc.gnu.org/onlinedocs/libgomp/omp_005fget_005fwtime.html签名。
答案 1 :(得分:2)
如果这是一次性的事情,那么我同意larsmans,使用gprof或其他一些分析可能是要走的路;但我也同意,在你的代码中有更粗略的计时器来计算不同的计算阶段是非常非常方便的。你拥有的最佳计时信息就是你实际使用的东西,而且你运行代码的每一个输出都很难输出。
Jeremia Wilcock指出omp_get_wtime()
非常有用;它符合标准所以应该适用于任何OpenMP编译器 - 但它只有第二个分辨率,这可能是也可能不够,取决于你正在做什么。的被修改强>;以上是完全错误的。
Fortran90定义system_clock()
,它也可用于任何符合标准的编译器;标准没有指定时间分辨率,但gfortran似乎是毫秒,而ifort似乎是微秒。我通常用这样的东西:
subroutine tick(t)
integer, intent(OUT) :: t
call system_clock(t)
end subroutine tick
! returns time in seconds from now to time described by t
real function tock(t)
integer, intent(in) :: t
integer :: now, clock_rate
call system_clock(now,clock_rate)
tock = real(now - t)/real(clock_rate)
end function tock
使用它们:
call tick(calc)
! do big calculation
calctime = tock(calc)
print *,'Timing summary'
print *,'Calc: ', calctime