2011-02-22 46 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