動態分支預測技術用於處理控制冒險。其基本思想是,在遇到控制冒險時,預測轉移方向,並執行該方向的指令,猜對時繼續執行后續指令,猜錯時回頭執行另一方向的指令。
分支預測算法分為靜態和動態兩種。靜態預測算法直接進行固定的猜測或按指令能容進行猜測,其常見時機則分別為IF段和ID段。動態預測算法根據轉移歷史來預測新的轉移方向,其主要類型有飽和計數預測、相關預測、自適應預測等,均可以用於IF段預測。
基本預測器即飽和計數預測器通常將分支歷史用兩個二進制位表示,根據高位來預測,根據結果來更新,其本質是一個具有4各狀態的DFA。它只根據當前分支的分支歷史來預測,在連續兩次錯誤預測時改變預測方向,用於循環時性能較好。實現上,需要用分支歷史表來記錄各分支指令地址對應的分支歷史信息,設置查找更新機構來實現數據的更新。
相關預測器使用其它分支的行為來預測當前分支,(m,n)預測器包含m位全局歷史和n*2^m位模式歷史,根據前m個分支的行為去選一個預測器,根據這個預測器內的分支歷史來預測當前方向。其性能遠好於基本預測器。在此基礎上再做改進,有錦標賽預測器,即全局/局部自適應預測器,由自適應選擇器來決定是使用全局預測器還是局部預測器。錦標賽預測器是目前最好的預測器。
預測時應當可以獲得分支目標地址,否則預測是沒有意義的,因此,僅有分支歷史表BHT的信息不足以進行動態分支預測的實現,我們通常需要分支目標緩沖器BTB來實現轉移歷史的管理。BTB是一個類似Cache的結構。查找時,用PC查BTB,當標記與PC內容相等時命中。當BTB缺失且執行結果為轉移時建立新行。當BTB命中時根據執行結果更新對應行的轉移歷史。
在設置BTB后,IF段時查BTB,命中時寫入PC,否則PC正常自增。ID段判斷是否為BTB缺失的分支指令,此處可以進行靜態預測。EX段根據執行結果更新BTB。當出現錯誤預測時,需要清空流水線以恢復現場,並重置PC。
采取動態分支預測的MIPS流水線,若在IF段預測,則預測正確時停頓0拍,錯誤時比阻塞法多停頓一拍。若在ID段預測,則預測正確時停頓1拍,錯誤時比阻塞法多停頓一拍。當然,如果沒有BTB只有BHT,那么預測應當在轉移目標地址產生時進行預測,通常為ID段。