我正在研究一些代码,这些代码会对整个CPU_time()函数进行大约200*steps
次调用,以帮助提供性能统计信息。
但是 - 考虑到steps
通常高达70或8千万(即可能是1500000000000 [更正15 0000 0000 ] {{1调用一次运行。)
我知道一个非常明显的方法可以解决这个问题,但我不会对此表示不满,我想要看看是否有人有这方面的经验。
答案 0 :(得分: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 ns。循环本身的开销应该远小于此(用call cpu_time
替换循环中的t=1
并关闭优化以使循环不被优化,我发现每次迭代3 ns,所以实际上所有的时间都用在cpu_time
),所以我认为这是对执行一次cpu_time调用所花费的时间的合理估计。这有多重要取决于代码的其余部分需要多长时间。 1500000000000 * 440ns = 7.6天,所以听起来可能非常重要。但是1.5万亿次通话与你上面给出的数字不一致(每步有500个步骤,每步拨打200个电话,拨打150亿个电话,然后需要1.8个小时。还是相当多。
但是,您可能不需要经常调用cpu_time
。加快这一步的一个简单方法是只在迭代中每N步调用一次,这将为你提供一个N因子的加速。我还建议使用mpi_wtime
,这很快并且有一个时钟质量高于cpu_time
,但速度几乎是cpu_time
的两倍。