指令層級平行與亂序執行

兩位元預測器(two-bit predictor)

想像一位通常很可靠、會說會不會下雨的朋友。如果他只要錯一次你就立刻翻轉預報,一個反常的日子就會把你弄得來回擺盪。於是你決定連續兩次出乎意料才改變主意。兩位元預測器對分支用的正是這種遲滯:它不會因為一次猜錯就翻轉預測,所以單一個不尋常的結果不會破壞一個原本一致的模式。

具體來說,每個分支對應一個 2 位元飽和計數器,持有四種狀態之一:強烈不跳(00)、微弱不跳(01)、微弱跳(10)、強烈跳(11)。預測就是最高位元:0 表示預測不跳,1 表示預測跳。每次分支解出後,若分支跳了,計數器朝「跳」遞增;若沒跳,就朝「不跳」遞減,並在兩端飽和。關鍵在於:要連續兩次誤測,才能從某個強狀態跨到相反的預測。對比之下,一位元預測器只記住上一次結果,因此在每個迴圈上會誤測兩次(開始一次、出口一次)。

兩位元方案是分支預測的經典積木,比一位元是一大躍進。對一個 99% 都跳的迴圈,唯一一次不跳的出口只把計數器推到「微弱跳」、而非翻轉它,所以下一次進入迴圈仍預測為跳——省下了一位元預測器會吃到的那次額外誤測。真實的高階預測器精巧得多(關聯式、競賽式等),但它們幾乎全都建立在這種飽和計數器之上,以分支位址與歷史來索引。

狀態從強烈跳(11)開始。迴圈出口一次:不跳把它推到微弱跳(10),預測仍是「跳」。迴圈再次進入又跳了:回到 11。淨結果:出口只有一次誤測,相較一位元方案的兩次。

兩位元的遲滯:一次意外只會削弱預測,而不會翻轉它。

兩位元計數器對交替或資料隨機的分支,仍預測不會比擲硬幣更準。它的長處在於迴圈這類穩定、重複的模式;要捕捉跨分支的關聯,就得用關聯式或競賽式預測器。

又稱
2-bit saturating counterbimodal predictor飽和計數器