指令層級平行與亂序執行

亂序執行(out-of-order execution)

想像一家廚房按順序接單,並對每一桌都按同一順序上菜——但在內部,廚師先做哪一張單食材先備齊就先做,並不嚴格照接單順序。客人從不會察覺內部的洗牌,因為菜還是照順序送到。亂序執行(OoO)就是 CPU 在做這件事:只要輸入一就緒,它就立刻執行就緒的指令,即使較早的指令仍卡著,卻又讓最終結果按原本的程式順序呈現。

在機制上,亂序核心有三個階段。(1) 循序前端:指令按程式順序被提取、解碼、更名,並由暫存器更名消除假相依。(2) 亂序中段:指令待在保留站/發射佇列中,一旦運算元與功能單元就緒就立刻執行,順序則隨機而定。(3) 循序後端:結果在重排序緩衝區(ROB)裡等待,並嚴格按程式順序提交——寫入可見的架構狀態。所以執行是亂序的,但提取/更名與提交是循序的。循序執行的假象因此得以維持。

這是 1990 年代中期以降每一顆高效能核心的核心把戲,也是這類核心能優雅容忍快取未命中與長延遲運算的原因:當一道指令等記憶體等上數百個週期時,排在它後面數十道獨立指令能搶先衝出去。誠實的代價很真實:更名表、保留站、ROB 與喚醒/選擇邏輯既龐大又耗電,而且——關鍵地——填滿亂序視窗的推測,正是 Spectre 一類安全漏洞的藏身之處。OoO 從不改變一支正確程式算出的結果;它只改變內部的工作何時被完成。

程式順序:(1) 慢速除法 d=a/b;(2) e=c+1;(3) f=e+2。亂序核心在 (1) 慢慢磨時先執行 (2) 與 (3),把它們的結果停放在 ROB;最終仍按 (1)、(2)、(3) 的順序提交,於是除錯器看到的是正常的循序狀態。

亂序執行以保持忙碌;循序提交以保持正確。

一個頑固的迷思是亂序執行會改變程式的結果。它不會——循序提交保證架構結果與循序執行完全相同。它真正會(透過時序)洩漏的,正是 Spectre/Meltdown 的根據。

又称
OoOOOO executiondynamic execution失序執行