競賽式預測器(tournament predictor)
想像你有兩位氣象預報員:一位擅長預測穩定的季節模式,另一位擅長捕捉「這週影響下週」的關聯。與其永遠只信一位,不如替每種日子記下哪位預報員最近比較準,然後就當下情況採用近期表現較好的那位。競賽式預測器對分支做的正是這件事:它平行跑兩個不同的預測器,再用第三個「選擇器」逐分支地挑該信哪一個。
具體來說,競賽式(混合)預測器例如把一個區域預測器——它的猜測根據這個特定分支過去的行為——與一個全域預測器——它的猜測根據所有分支近期的模式(捕捉分支之間的關聯)——結合起來。一張小型選擇表,本身也由飽和計數器構成,替每個分支追蹤兩個元件中近期哪個比較準,並把最終預測導向那個元件。當被選中的預測器錯了、另一個卻對了時,選擇器就朝另一個推一下,供下次參考。這種適應性讓預測器能在同一支程式中、面對差異極大的分支行為,取兩者之長。
競賽式預測器(由 1990 年代末的 Alpha 21264 首創)是準確率的一大躍進,至今仍是當代精巧預測器的觀念祖先。它重要,是因為真實程式混雜多種分支類型——區域預測器擅長的緊湊迴圈,以及結果彼此關聯、全域預測器能抓到的 if 連鎖——沒有單一方案對所有情況都最好。誠實的提醒是:這份準確率耗費儲存與更新邏輯,而且即使競賽式預測器也救不了真正不可預測、資料隨機的分支;它只是確保只要哪裡存在模式,總有某個元件能找到它。
分支 B 的結果取決於較早的分支 A 是否跳了。區域預測器把 B 看成隨機,但全域預測器抓到「A 之後 B」的關聯。選擇器學會在 B 上信任全域預測器,於是在單一方案會束手無策之處提高了準確率。
兩個預測器競爭;一個選擇器逐分支學會該信哪一個。
競賽式預測器不是一個更聰明的單一預測器——它是兩者之間的裁判。它的勝利在於逐分支挑對元件;它仍無法從真正隨機的分支結果中變出模式。