1. 程式人生 > >分支預測(Branch Prediction)

分支預測(Branch Prediction)

分支預測(Branch Prediction)是現代處理器用來提高CPU執行速度的一種手段, 其對程式的分支流程進行預測, 然後預先讀取其中一個分支的指令並解碼來減少等待譯碼器的時間.維基百科上對此的解釋是"a strategy in computer architecture design for mitigating the costs usually associated with conditional branches, particularly branches to short sections of code."

分支預測的方法有 靜態預測 和 動態預測 兩類:靜態預測方法行為比較簡單,如預測永遠不轉移、預測永遠轉移(jmp)、預測後向轉移等等,它並不根據執行時的條件和歷史資訊來進行預測,因此預測的準確性不會很高;動態預測方法則根據同一條轉移指令過去的轉移情況來預測未來的轉移情況。

由於程式中的條件分支是根據程式指令在流水線處理後的結果來執行的,所以當CPU等待指令結果時,流水線的前級電路也處於等待分支指令的空閒狀態,這樣必然出現時鐘週期的浪費。如果CPU能在前條指令結果出來之前就預測到分支是否轉移,那麼就可以提前解碼並執行相應的指令,這樣就避免了流水線的空閒等待,也就相應提高了CPU的整體執行速度。但另一方面,一旦前條指令結果出來後證明分支預測是錯誤的, 也就是產生了錯誤的分支預測,那麼就必須將已經裝入流水線執行的指令和結果全部清除,然後再裝入正確的指令重新處理,這樣就比不進行分支預測而是等待結果再執行新指令有額外的週期消耗。

因此,分支預測的錯誤並不會導致結果的錯誤,而只是導致流水線的停頓,如果能夠保持較高的預測準確率,分支預測就能提高流水線的效能, 換言之, 如果在軟體開發過程中, 能夠考慮這一特性, 減少甚至移除條件分支(值得一提的是, 條件轉移不需要預測, 因此條件轉移也遠沒有產生錯誤分支的效能代價大), 就能一定程度上提供程式的整體效率.

下面是幾種常見的優化策略:

1.避免在迴圈中巢狀條件分支. 如果可能,將分支移到外部, 使用多個子迴圈.

	do 
	{
		if (condition_1){
			//branch_1
		} else if (condition_2){
			//branch_2
		} else {
			//branch_3
		} //if
	} while (true);

	//改進版本
	if (condition_1) {
		do {
			//branch_1
		} while (true);
	} else if (condition_2) {
		do {
			//branch_2
		} while (true);
	} else {
		do {
			//branch_3
		} while (true);
	} //if

2.合併分支條件. 此舉在某種情況下可以大大降低產生錯誤分支預測的概率.

	if (condition_1 == 0 || condition_2 == 0 || 
		condition_3 == 0) {
		//branch
	} //if

	//改進版本:
	if ((condition_1 | condition_2 | condition_3) == 0) {
		//branch
	} //if

3.移除明顯的條件分支, 將執行概率大的條件分支移前.這一條不僅僅有助於規避錯誤分支帶來的效能懲罰, 還減少了不必要的檢測分支條件消耗的CPU時鐘週期.

儘管現代編譯器的優化技術已經十分強大(舉個例子, 如果你的產品主要執行在Intel的核心上, 那麼使用Intel的編譯器並開啟優化, 通過VTune效能器來不斷改程序序, 你的程式效率將比編譯在Any CPU時有很大的飛躍~), 但是比起程式設計師本身終歸略遜, 因此, 程式設計師或許寄希望於compiler optimization的同時, 更不妨掌握一些優化細節, 對此, 個人認為閱讀一些CPU工作原理的書籍頗有裨益~

相關推薦

分支預測(Branch Prediction)

分支預測(Branch Prediction)是現代處理器用來提高CPU執行速度的一種手段, 其對程式的分支流程進行預測, 然後預先讀取其中一個分支的指令並解碼來減少等待譯碼器的時間.維基百科上對此的解釋是"a strategy in computer architectu

[轉]深入理解 CPU 的分支預測(Branch Prediction)模型

目錄 背景 問題的提出 分析 優化 結論 補充知識 分支預測器 引出  我寫了一篇關於static key的文章,static key 主要是優化關於指令預取的效能,本想自己搞一篇什麼是預取指令,但是這篇寫的很好,直接轉了,感謝作者的無私。

分支預測branch prediction

https ati -i 問題 href .com red dict log   記錄一個在StackOverflow上看到一個十分有趣的問題:問題。   高票答案的優化方法:   首先找到罪魁禍首: if (data[c] >= 128) sum

[Branch Prediction]處理器分支預測文獻筆記(3)

[文獻名] Fisher, Joseph A., and Stefan M. Freudenberger. “Predicting Conditional Branch Directions from Previous Runs of a Program.” In Proce

[Branch Prediction]處理器分支預測文獻筆記(2)

[文獻名] Casey, Kevin, M. Anton Ertl, and David Gregg. “Optimizing Indirect Branch Prediction Accuracy in Virtual Machine Interpreters.” ACM

分支預測器(Branch Predictor) 彙總介紹

動態分支預測是近來的處理器已經嘗試採用的的技術。最簡單的動態分支預測策略是分支預測緩衝區(Branch Prediction Buff)或分支歷史表(branch history table)。      BHT——Branch History Table,顧名思義,這是記錄分支歷史資訊的表格,用於判定一條

優化技巧:提前if判斷幫助CPU分支預測

數組 cpu 摘要: 在stackoverflow上有一個非常有名的問題:為什麽處理有序數組要比非有序數組快?,可見分支預測對代碼運行效率有非常大的影響。要提高代碼執行效率,一個重要的原則就是盡量避免CPU把流水線清空,那麽提高分支預測的成功率就非常重要。分支預測在stackoverflow上有一個非

分支預測

ati 機制 進入 方式 指針 中大 找不到 ash ret 分支預測( Branch predictor):當處理一個分支指令時,有可能會產生跳轉,從而打斷流水線指令的處理,因為處理器無法確定該指令的下一條指令,直到分支指令執行完畢。流水線越長,處理器等待時間便越長,分支

【github】github 建立新分支 git branch

git branch 一、新建分支操作程式碼示例如下: 0、倉庫克隆 github clone https://github.com/XiaoGongWei/TESTGIT 1、// 建立新分支 git branch -c xiaogongwei_v1.0 2、切換到新分支 gi

【CPU微架構設計】利用Verilog設計基於飽和計數器和BTB的分支預測

  在基於流水線(pipeline)的微處理器中,分支預測單元(Branch Predictor Unit)是一個重要的功能部件,它負責收集和分析分支/跳轉指令的引數和執行結果,當處理新的分支/跳轉指令時,BPU將根據已有的統計結果和當前分支跳轉指令的引數,預測其執行結果,為流水線取指提供決策依據,進而提高流

git推送新的獨立分支branch

問題 在專案已經上線後,有時候為了修改專案bug,我們可以建立新的分支來搞定,新的分支繼承master主分支,在bug修復之後合併到主分支即可。但是遇到專案升級版本,現有框架已不支援升級,如果在現有分支上進行修改會有很多衝突,亦或新版本使用新的框架來實現,這個時候有些人可能會想到新開一個倉庫

分支管理~建立、合併分支 git branch , git merge(九)

簡介: 分支在實際中有什麼用呢?假設你準備開發一個新功能,但是需要兩週才能完成,第一週你寫了50%的程式碼, 如果立刻提交,由於程式碼還沒寫完,不完整的程式碼庫會導致別人不能幹活了。如果等程式碼全部寫完再一次提交,又存在丟失每天進度的巨大風險。     &

理解CPU分支預測,提高程式碼效率

摘要: 技術傳播的價值,不僅僅體現在通過商業化產品和開源專案來縮短我們構建應用的路徑,加速業務的上線速率,也會體現在優秀程式設計師在工作效率提升、產品效能優化和使用者體驗改善等小技巧方面的分享,以提高我們的工作能力。 技術傳播的價值,不僅僅體現在通過商業化產品和開源專案來縮短我們構建應用的路徑,加速業務

理解CPU分支預測,提高代碼效率

href ann roc 討論 erro 用戶體驗 工作效率 現在 tde 摘要: 技術傳播的價值,不僅僅體現在通過商業化產品和開源項目來縮短我們構建應用的路徑,加速業務的上線速率,也會體現在優秀程序員在工作效率提升、產品性能優化和用戶體驗改善等小技巧方面的分享,以提高我們

【linux】Valgrind工具集詳解(十四):Cachegrind(快取和分支預測分析器)

一、概述 Cachegrind,它模擬CPU中的一級快取I1,Dl和二級快取,能夠精確地指出程式中cache的丟失和命中。如果需要,它還能夠為我們提供cache丟失次數,記憶體引用次數,以及每行程式碼,每個函式,每個模組,整個程式產生的指令數。這對優化程式有很大的幫助。 Cach

cpu 分支預測對效能的影響

cpu 分支預測對效能的影響 現在的 cpu 一般都支援分支預測功能。維基百科中有以下描述: 在計算機體系結構中,分支預測器(英語:Branch predictor)是一種數位電路,在分支指令執行結束之前猜測哪一路分支將會被執行,以提高處理器的指令流水線的效能。使用分支預

開源處理器Rocket的分支預測機制研究與效能評估(二)

3 Rocket處理器分支預測機制分析 3.1 分支預測機制設計分析 Rocket處理器除了實現BTB、BHT,還實現了RAS,都在BTB Module中實現,BTB Module的介面以及與Rocket Core的連線如圖3所示。 Rocket處理器主要在流水線的取

GitHub分支branch)合併

轉載自:http://blog.csdn.net/loadsong/article/details/51591536 侵刪 本地兩個分支合併 先從最簡單的一種情況著手。現在專案只有一個 master 分支,我來新建一個 idea 分支,實現自己的想法,commit 一

Intel Sandy Bridge/Ivy Bridge架構/微架構/流水線 (8) - 流水線前端/分支預測

Branch Prediction 分支預測機制會預先推測分支目標,讓處理器在分支指令實際計算出決斷結果之前就開始執行分支路徑上的指令。所有的分支都會利用分支預測單元BPU做預測。分支預測單元在預測分支目標時不但會基於分支的EIP,而且還會參考到達這個EIP的執行路徑。BPU可以高效的預測如

SimpleScalar中分支預測與例項原始碼

//============================================================================== //寫檔案的人: wahaha_nescafe //聯絡方式: [email protected] // //系統說明: