我有一個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'的範圍都沒有修改。 –