Arrays 在fortran/MPI中使用索引变量减少运行时间

Arrays 在fortran/MPI中使用索引变量减少运行时间,arrays,performance,fortran,mpi,Arrays,Performance,Fortran,Mpi,我在一些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)

我在一些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)
,有什么区别吗?

理论上,你不必做200次加法,只需在循环之前做一次

  do j=0,200

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

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

  do j=0,200

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

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

  do j=0,200

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

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

  do j=0,200


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

Hmmm,不确定——您的测量结果显示了什么?@HighPerformanceMark我不会在实际代码上尝试它,因为它有点长:),因此我想在更改所有内容之前先问一下。我将尝试一个虚拟例程,看看是否有改进!我认为这只是为了让代码对用户更清晰。查看代码的格式(所有内容是如何对齐的),这可能是唯一的目标hmmm,不确定--您的测量结果显示了什么?@HighPerformanceMark我不会在实际代码上尝试它,因为它有点长:),因此我想在更改所有内容之前先问一下。我将尝试一个虚拟例程,看看是否有改进!我认为这只是为了让代码对用户更清晰。查看代码的格式(所有内容是如何对齐的),这可能是唯一的目标hmmm,不确定--您的测量结果显示了什么?@HighPerformanceMark我不会在实际代码上尝试它,因为它有点长:),因此我想在更改所有内容之前先问一下。我将尝试一个虚拟例程,看看是否有改进!我认为这只是为了让代码对用户更清晰。查看代码的格式(所有内容是如何对齐的),这可能是唯一的目标hmmm,不确定--您的测量结果显示了什么?@HighPerformanceMark我不会在实际代码上尝试它,因为它有点长:),因此我想在更改所有内容之前先问一下。我将尝试一个虚拟例程,看看是否有改进!我认为这只是为了让代码对用户更清晰。查看代码的格式(所有内容是如何对齐的),这可能是任何更改的唯一目标,您知道intel ifort是否会这样做吗?或者gnu gfortran?他们可以做更多的事情,比如矢量化循环。最终的代码将大不相同,不必看起来像一个循环。尝试在gfortran中使用
-fdump tree original
-fdump tree optimized
。谢谢!我会试试的!您是否知道intel ifort是否会这样做?或者gnu gfortran?他们可以做更多的事情,比如矢量化循环。最终的代码将大不相同,不必看起来像一个循环。尝试在gfortran中使用
-fdump tree original
-fdump tree optimized
。谢谢!我会试试的!您是否知道intel ifort是否会这样做?或者gnu gfortran?他们可以做更多的事情,比如矢量化循环。最终的代码将大不相同,不必看起来像一个循环。尝试在gfortran中使用
-fdump tree original
-fdump tree optimized
。谢谢!我会试试的!您是否知道intel ifort是否会这样做?或者gnu gfortran?他们可以做更多的事情,比如矢量化循环。最终的代码将大不相同,不必看起来像一个循环。尝试在gfortran中使用
-fdump tree original
-fdump tree optimized
。谢谢!我会试试的!