2011-02-22 43 views
3

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

+0

`gprof`? `time`? – 2011-02-22 19:43:14

回答

2

如果这是一次性的事情,那么我同意larsmans,使用gprof或其他分析方法可能是一种可行的方法;但我也同意,它是很方便在您的代码中有更粗略的计时器来计算不同阶段的计算。您拥有的最佳时机信息是您实际使用的内容,并且很难击败运行代码的每一个输出内容。

耶利米威尔考克指出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 
+0

omp_get_wtime()返回秒数作为双精度数,所以亚秒分辨率肯定是可能的。借助GCC,如果平台支持高分辨率定时器,则可提供毫微秒分辨率。 – janneb 2011-02-23 06:41:19