我正在編寫一些代碼,它可以調用CPU_time()函數來幫助提供性能統計信息,其中調用了大約200*steps
CPU_time()函數。Fortran中是否存在CPU_time()性能損失?
然而 - 確實使這些呼叫本身有性能刑罰,鑑於steps
是經常高達70或80億美元(即也許15000億[糾錯15 0000 0000]上的單次運行CPU_time()
呼叫)。
我知道一個完全明顯的方法來解決這個問題,但我並沒有想到如果有人有這方面的經驗,我會問。
我正在編寫一些代碼,它可以調用CPU_time()函數來幫助提供性能統計信息,其中調用了大約200*steps
CPU_time()函數。Fortran中是否存在CPU_time()性能損失?
然而 - 確實使這些呼叫本身有性能刑罰,鑑於steps
是經常高達70或80億美元(即也許15000億[糾錯15 0000 0000]上的單次運行CPU_time()
呼叫)。
我知道一個完全明顯的方法來解決這個問題,但我並沒有想到如果有人有這方面的經驗,我會問。
我創造了這個短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
的兩倍。
感謝您花時間做到這一點 - 我正在衝出實驗室,但只是想把它扔掉。和偉大的解決方案 - 10/10! – Alex