Fortran中是否存在CPU_time()性能损失?

时间:2014-03-02 00:50:03

标签: performance fortran

我正在研究一些代码,这些代码会对整个CPU_time()函数进行大约200*steps次调用,以帮助提供性能统计信息。

但是 - 考虑到steps通常高达70或8千万(即可能是1500000000000 [更正15 0000 0000 ] {{1调用一次运行。)

我知道一个非常明显的方法可以解决这个问题,但我不会对此表示不满,我想要看看是否有人有这方面的经验。

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的两倍。