6.2 亂序執行(Out-of-Order Execution, OoOE)與暫存器重新命名:榨乾晶片吞吐極限的聰明演算法#
程式的指令順序是給人看的。CPU 真正的執行順序,是它自己排的——只要結果一樣,順序全憑它高興。
一、資料相依:管線的隱形殺手#
考慮這段程式:
1. r1 = r2 + r3 ← 需等 r2, r3
2. r4 = r1 * r5 ← 依賴第 1 條,必須等
3. r6 = r7 - r8 ← 與前兩條無關!
按序執行時,第 3 條指令被迫排在第 2 條後面,白白等了兩條的時間。亂序執行的核心思想:在資料相依允許的範圍內,先執行任何「準備好了」的指令,填補等待的空窗。硬體在執行時動態重排,但結果必須與按序執行完全一致(退休時按原序寫回,並保證例外處理正確)。
二、暫存器重新命名:消除「假相依」#
真正的挑戰是假相依(false dependency):
1. r1 = r2 + r3
2. r1 = r4 * r5 ← 又寫 r1(架構暫存器只有幾個,不夠用)
3. r6 = r1 + r7 ← 讀的其實是第 2 條的 r1
第 3 條表面上依賴第 1 條(都碰 r1),實際上依賴第 2 條。若不處理,第 2 條必須等第 1 條寫完——根本沒有真實的資料關係,卻被迫排隊。
解法是 Tomasulo 演算法(1967,IBM System/360 Model 91,Robert Tomasulo):硬體內部準備一大堆「物理暫存器」,每條指令的目的地被動態改名到一個空閒的物理暫存器:
1. p10 = p1 + p3 (架構 r1 → 物理 p10)
2. p11 = p4 * p5 (架構 r1 → 物理 p11)——假相依消失了!
3. p12 = p11 + p7 (明確只依賴 p11)
p1、p3、p4、p5 各讀各的,三條指令可以同時執行。現代 CPU 有數百個物理暫存器,架構上只有 16 個(x86-64)——十幾個帳戶,幾百個金庫,全靠改名術調度。
flowchart LR
A[按序取指+譯碼] --> B[重新命名<br/>架構暫存器→物理暫存器]
B --> C[保留站/排程器<br/>監看運算元就緒]
C --> D[亂序執行<br/>FUs 滿負荷運轉]
D --> E[重排序緩衝 ROB]
E --> F[按序退休/寫回<br/>精確例外]「按序退休 + 重排序緩衝(ROB)」保證了精確例外(precise exceptions)——出錯時現場與按序執行一致,這是作業系統與虛擬記憶體能正常工作的前提。
三、Pentium Pro(1995):x86 的亂序革命#
亂序執行在學界與 IBM 大型機已有三十年積累,但要在 x86 上實作,難度在於先得把可變長的 CISC 指令譯碼。Pentium Pro(P6 微架構,設計者 Colwell 團隊)的路線:
- 譯碼:把 x86 指令拆成「微操作(micro-ops)」——內部其實是 RISC 式的三運算元微碼;
- 重新命名到 40 個物理暫存器;
- 保留站動態排程,多埠執行單元亂序執行;
- ROB 按序退休。
英特爾官方從不承認「x86 變成 RISC」,但 P6 之後的 x86 本質上是「CISC 前端 + RISC 亂序核心」。AMD 的 K5、K7(收購 NexGen 團隊後的設計)採用類似路線,雙雄在 1990 年代末殺得難分難捨。
四、代價與極限#
亂序執行的代價巨大:
- 電晶體與面積:ROB、保留站、改名邏輯、多埠暫存器堆,動輒占晶片 20–30% 面積;
- 功耗:排程器的搜尋邏輯每一週期都在全速運轉,是漏電與動態功耗大戶(直通第七章的功耗牆);
- 驗證地獄:亂序 + 推測 + 例外組合出的狀態空間是天文數字,Pentium FDIV 醜聞(1994,浮點除法表錯誤,召回損失 4.75 億美元)敲響了複雜性危機的警鐘;
- 資訊安全的暗面:Meltdown(2018)利用亂序執行的「例外前動作」讀取核心記憶體——效能魔法與安全之間的帳單,二十五年後才寄到。
五、為何這是「黑魔法」?#
亂序執行體現了計算機架構的深層哲學轉變:
硬體不再忠實地翻譯軟體的指令順序,而是把指令順序當成「建議」,由硬體根據當下的資源與資料狀態,即興重編一場戲——只要最後一幕的結局正確。
「只要結果等價,過程可以自由」——這個思想後來延伸出:推測執行(猜分支)、預取(猜記憶體)、值預測(猜資料)、以及 AI 加速器中的資料流架構。可以說,現代 CPU 的本質是一台「猜測機」,靠統計與冗餘把延遲藏起來。
歷史因果鏈:Tomasulo(1967)→ RISC 團隊的理論整合 → Pentium Pro 量產化 → x86/CISC 的生存利器 → 面積與功耗的代價 → 深管線撞牆(第七章)→ Spectre/Meltdown(安全債務)。管線與亂序榨乾了「單核」的潛力,下一章的問題是:當物理定律不讓你更快時,怎麼辦?