3

我有一个调用多线程例程的 Fortran 90 程序。我想从调用例程中计时这个程序。如果我使用cpu_time(),我最终会将所有线程(在我的情况下为 8 个)的 cpu_time 加在一起,而不是程序运行所需的实际时间。etime()例程似乎也是如此。关于如何为这个程序计时(不使用秒表)的任何想法?

4

2 回答 2

5

试试omp_get_wtime();有关签名,请参见http://gcc.gnu.org/onlinedocs/libgomp/omp_005fget_005fwtime.html

于 2011-02-22T19:54:15.780 回答
3

如果这是一次性的事情,那么我同意 larsmans 的观点,即使用 gprof 或其他一些分析可能是要走的路;但我也同意在你的代码中使用更粗略的计时器来计时计算的不同阶段是非常方便的。你拥有的最好的时间信息是你实际使用的东西,而且很难打败你运行代码的每一个 tiem 输出的东西。

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
于 2011-02-22T21:44:35.503 回答