1. 程式人生 > >cpu 分支預測對效能的影響

cpu 分支預測對效能的影響

cpu 分支預測對效能的影響

現在的 cpu 一般都支援分支預測功能。維基百科中有以下描述:

在計算機體系結構中,分支預測器(英語:Branch predictor)是一種數位電路,在分支指令執行結束之前猜測哪一路分支將會被執行,以提高處理器的指令流水線的效能。使用分支預測器的目的,在於改善指令管線化的流程。現代使用指令管線化處理器的效能能夠提高,分支預測器對於現今的指令流水線微處理器獲得高效能是非常關鍵的技術。

cpu 預先對將要執行的分支進行預測,預測成功的概率越大,程式的效能就越好。分支預測實際是為流水線服務的,通過分支預測可以提高流水線的效能。當沒有分支預測的情況下,cpu 只有當執行完成了當前分支指令之後才能確定要取哪一條指令來執行,也就是說在執行分支指令的同時,流水線中不能進入新的指令,這被稱為流水線停頓。

分支預測可以避免流水線停頓的發生。不過當使用分支預測時,當預測失敗後,將會帶來更多的效能損耗。預測失敗時 cpu 會放棄已經執行完成的結果,然後重新獲取正確的分支中的指令開始執行。在較長的流水線中,一次分支預測失敗可能會損失10 ~ 20 個 cpu 週期的時間。

分支預測有多種實現方式,每一種方式都有它自己的特點與適應環境。大部分情況下我們無法關閉 cpu 的分支預測功能,少部分情況下是否能夠關閉還有待研究。不過分支預測對程式設計師來說是一種黑盒,是不透明的,但程式設計師仍舊能夠通過合理的調整分支結構來提高預測成功率。

在編寫程式碼時,分支的排布將對效能造成影響。將發生概率大的分支放在前面有助於提高分支預測成功率。linux 中的 linkly 與 unlikely 就是為了提高分支預測的成功率所使用的方法,儘管它依賴 gcc 的擴充套件功能!

同時必須注意的是,流水線與分支預測在提高計算機效能的同時也給指令的執行了帶入了更多的不可控因素。指令執行不再是傳統的順序執行的方式,這樣既給問題定位帶來了更大的挑戰,也讓程式具體的執行過程變得模糊不清。