我有一个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'属性?编译器是否可以解决问题取决于编译器(如果可以,是否可以,取决于编译标记)以及代码的布局。这个好处可能取决于你的架构和分支预测。等等。我建议你自己写一个完整的例子并对其进行描述。 – francescalus
变量'var'没有被定义为常量。但是从输入文件读取。整个程序中'var'的范围都没有修改。 –