2016-07-29 47 views
0

我有一个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检查或更好的方法来实现这种情况?

+0

就目前而言,我可能会把这个问题称为“太宽泛”。两个答案都说完全相反可能是有效的:这里我们想象的太多了。例如,你说'var'不会改变,但是它是一个命名的常量,还是它有'volatile'属性?编译器是否可以解决问题取决于编译器(如果可以,是否可以,取决于编译标记)以及代码的布局。这个好处可能取决于你的架构和分支预测。等等。我建议你自己写一个完整的例子并对其进行描述。 – francescalus

+0

变量'var'没有被定义为常量。但是从输入文件读取。整个程序中'var'的范围都没有修改。 –

回答

0
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 
+0

我知道这将是合乎逻辑的解决方案。但“功能”本身很长,还有其他很多功能。 'if'检查只是'function'的一小部分。因此,编写两个函数将不必要地增加代码长度。还有其他建议吗? –

+1

@SathishKrishnan如果函数很长,没有意愿避免'if'的意思,这是无用的微优化。 –