2014-03-02 56 views
0

我正在編寫一些代碼,它可以調用CPU_time()函數來幫助提供性能統計信息,其中調用了大約200*steps CPU_time()函數。Fortran中是否存在CPU_time()性能損失?

然而 - 確實使這些呼叫本身有性能刑罰,鑑於steps是經常高達70或80億美元(即也許15000億[糾錯15 0000 0000]上的單次運行CPU_time()呼叫)。

我知道一個完全明顯的方法來解決這個問題,但我並沒有想到如果有人有這方面的經驗,我會問。

回答

4

我創造了這個短FORTRAN程序來測試這一點:

program cputimer 
    implicit none 
    integer :: i 
    integer, parameter :: n = 1000000 
    real(8) :: t1, t2, t 
    call cpu_time(t1) 
    do i = 1, n 
    call cpu_time(t) 
    end do 
    call cpu_time(t2) 
    write(*,*) (t2-t1)/n 
end program 

我跑它用在我的筆記本電腦gfortran。輸出是440納秒。環路本身的開銷應該比這少得多(用t=1代替循環中的call cpu_time並關閉優化,以便循環沒有被優化掉,我發現每次迭代3納秒,所以幾乎所有的時間都花在cpu_time ),所以我認爲這是對執行一次cpu_time調用所需時間的合理估計。這有多重要取決於代碼的其餘部分需要多長時間。 1500000000000 * 440ns = 7.6天,所以聽起來可能非常重要。但是1.5萬億的通話量與上面給出的數字不一致(7500萬步,每步200個呼叫給出150億個呼叫,然後需要1.8個小時,仍然相當多)。然而,經常這樣做的一個簡單方法就是在迭代過程中每隔N步調用一次,這會使系統加速到N倍。我也會建議使用mpi_wtime,它的速度很快,一個比cpu_time更高質量的時鐘,但結果幾乎是cpu_time的兩倍。

+0

感謝您花時間做到這一點 - 我正在衝出實驗室,但只是想把它扔掉。和偉大的解決方案 - 10/10! – Alex

相關問題