【问题标题】:Compiler optimization on loop independent variables循环自变量的编译器优化
【发布时间】:2016-07-29 14:05:19
【问题描述】:

我有一个 Fortran 程序。伪代码如下:

do x=1,nx
  do y=1,ny
    do z=1,nz
      function(x,y,z)
    end do
  end do
end do

function(x,y,z)
  if(var==1)
    ! do something
  else if(var==2)
    ! do something else
  end if
end

这里的变量var是在程序开始时从输入文件中读取的,在执行过程中不会改变。我读到if 检查在for/do 循环的深处,它可以通过忽略“缓存效果”来破坏性能。既然变量不会随着过程而改变,那么编译器是否可以对代码进行重新排序,从而可以看到缓存效果的好处?

如果不是这样,如何避免if检查或更好的方法来实现这种场景?

【问题讨论】:

  • 就目前而言,我可能会称这个问题“过于宽泛”。两个都说完全相反的答案可能是正确的:我们的想象力太多了。例如,您说var 没有改变,但它是命名常量还是具有volatile 属性?您的编译器是否可以解决问题取决于编译器(如果可以,是否可以,取决于编译标志)以及代码的布局方式。好处可能取决于您的架构和分支预测。等等。我建议您编写自己的完整示例并对其进行概要分析。
  • 变量var 未定义为常量。但是从输入文件中读取。并且var 的范围在整个程序中没有被修改。

标签: optimization fortran compiler-optimization


【解决方案1】:
do x=1,nx
  do y=1,ny
    if (var == 1)
      do z=1,nz
        function1(x,y,z)
      end do
    else if (var == 2)
      do z=1,nz
        function2(x,y,z)
      end do
    endif
  end do
end do

【讨论】:

  • 我知道这是合乎逻辑的解决方案。但是function 本身很长,并且具有许多其他功能。 if 检查只是function 的一小部分。因此,编写两个函数会不必要地增加代码长度。还有其他建议吗?
  • @SathishKrishnan 如果函数很长,没有必要避开if,这是一个无用的微优化。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多