我一直在閱讀有關分支預測的知識,但我發現的唯一實現主要是在計算機的硬件方面。處理器似乎關注大部分預測。我的問題是,編譯器可以執行分支預測嗎? 我發現的唯一的事情是2種方法,函數內聯和循環展開。這些被認爲是正確的?他們還在使用嗎?編譯器級別的分支預測
3
A
回答
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
相關問題
- 1. 分支預測
- 2. 分支預測
- 3. 所選JRE不支持編譯器合規性級別爲1.5
- 4. 基於概率的分支預測器
- 5. 分支預測器單元的輸入?
- 6. 從2bit分支預測器到8位預測器
- 7. Java編譯器級別不匹配
- 8. Drools - 更改Java編譯器級別
- 9. GNU編譯器調試「級別」
- 10. Matlab中的分支預測
- 11. GPU上的分支預測
- 12. 檢測使用預編譯器宏編譯了哪個目標
- 13. LESS預編譯器
- 14. Protobuf預編譯器
- 15. 分支無法通過編譯器
- 16. 預測this.map.fitBounds之前的縮放級別
- 17. 分支預測與分支目標預測之間的性能差異?
- 18. RIM編譯器支持的預處理器指令
- 19. 使用Android 4.X進行編譯但支持API級別9
- 20. Java - Eclipse編譯器符合性級別1.6未按預期工作
- 21. 編譯器支持STL容器中的有狀態分配器
- 22. Rails 3.2預編譯編譯映像,但ActionView不支持它
- 23. 使用MinGW分別編譯
- 24. 循環中分支預測的性能
- 25. Easy Python ASync。預編譯器?
- 26. Android預編譯器錯誤?
- 27. 預編譯器爲ipad
- 28. 是否有GCC的編譯器提示強制分支預測總是以某種方式進行?
- 29. 降級C++編譯器specesfications
- 30. 編譯器支持C11