2012-05-12 65 views
3

我一直在閱讀有關分支預測的知識,但我發現的唯一實現主要是在計算機的硬件方面。處理器似乎關注大部分預測。我的問題是,編譯器可以執行分支預測嗎? 我發現的唯一的事情是2種方法,函數內聯和循環展開。這些被認爲是正確的?他們還在使用嗎?編譯器級別的分支預測

回答

7

當然。編譯器可以得到預測信息是否知悉:通過儀器收集

  • 統計分支概率運行
  • 通過儀器收集運行值varible統計分佈;然後它可以預測一個條件的平均結果和因此分支
  • 程序員-斷言基於範圍循環邊界的有條件
  • 估計(或缺省爲「10」的頻率或偏壓如果未知:)
  • 知識,一個分支是向後循環的頂部(預測「採取」

使用這樣的信息,它可以預測條件句的可能結果,然後生成的分支指令傾向於通過「預測」正確地硬件

由一些編譯器完成的一組特別有趣的優化是trace scheduling,它根據順序遇到的分支的概率確定通過代碼的路徑集合。通過確定最高概率路徑,編譯器可以在整個路徑上進行優化,而不僅僅在基本塊內進行優化。

有時編譯器會生成間接使用硬件分支預測功能的分支代碼。編譯的OO語言(靜態或JIT)必須編譯方法調用,並且跳轉間接代碼很昂貴。一個便宜的技巧是在每個調用站點保留一個最近調用方法的小動態緩存,並檢查被調度的對象類型。如果相同類型的對象經常用於在呼叫站點進行分派,則高速緩存中第一個(並且稍微小於第二個)條目的比較/分支序列非常可能,並且執行的代碼因此避免誤預測。這比間接跳轉要好得多。

最後一個標準把戲:如果你可以避免做一個分支,你不必正確預測它!許多代碼序列是這個樣子:

if (exp1 relop exp2) 
     X = Y 
    endif 

現代CPU具有「斷言」指令實際上是「MOV_if_relop A到B」, 所有關係條件相等,不等於,小於等 因此而比爲上述構造生成分支,編譯器生成:

<compute exp1 and exp2> 
    CMP exp1,exp2 ; sets condition code 
    MOVif_relop X,Y