【问题标题】:Decreasing runtime by using index variables in fortran/MPI通过在 fortran/MPI 中使用索引变量来减少运行时间
【发布时间】:2015-11-27 11:44:38
【问题描述】:

我在一些 CFD 代码中看到他们使用索引变量来访问不同的数组条目。下面是一个简短的例子:

integer :: i,j
integer :: im,ip
real,dimension(0:200,0:200) :: array

do i=1,199
   ip = i+1
   im = i-1
   do j=0:200
      var1(i) = 0.5 * ( array(ip,j) - array(i ,j) )
      var2(i) = 0.5 * ( array(i ,j) - array(im,j) )
   enddo
enddo

这样做有什么好处吗?关于运行时,如果我使用array(i+1,j) 而不是array(ip,j),会有区别吗?

【问题讨论】:

  • 嗯,不确定——你的测量结果显示了什么?
  • @HighPerformanceMark 我不会在实际代码上尝试它,因为它有点长:),因此我想在更改之前先问一下。我会尝试一个虚拟程序,看看是否有改进!
  • 我认为这只是为了让用户更清楚代码。查看代码的格式(所有内容如何对齐),这可能是唯一的目标

标签: arrays performance fortran mpi


【解决方案1】:

理论上,您不必进行 200 次加法,而只需在循环之前执行一次

  do j=0,200

实际上,优化编译器无论如何都应该能够为您优化这种用法。

【讨论】:

  • 你知道英特尔 ifort 是否这样做吗?还是 gnu gfortran?
  • 他们可以做更多的事情,比如矢量化循环。最终的代码会有很大的不同,并且不必看起来像一个循环。尝试自己在 gfortran 中使用 -fdump-tree-original-fdump-tree-optimized
  • 谢谢!我会试试的!
猜你喜欢
  • 1970-01-01
  • 2016-12-30
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2021-11-28
  • 2017-01-16
相关资源
最近更新 更多