2016-07-29 48 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'的意思,這是無用的微優化。 –