【发布时间】: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