指令層級平行與亂序執行
重排序緩衝區(reorder buffer, ROB)
想像一家熟食店,廚師可以用任意順序做完三明治,但包好的三明治會被放上一條編號輸送帶,嚴格按取餐號交給顧客。提早做好的三明治只是在帶上等它的順位;絕不會搶在較早的訂單前面被交出去。重排序緩衝區(ROB)就是亂序 CPU 裡那條編號輸送帶:一個佇列,存放已執行但尚未正式生效的指令結果,並按原本的程式順序把它們釋放——也就是提交。
在機制上,一道指令發射時,也會在 ROB 的尾端配置一個項目,以保存程式順序。指令接著亂序執行;每道把結果寫進自己的 ROB 項目並標記為完成。提交只從 ROB 的頭端、按順序發生:最老的指令一旦完成,就把結果寫進架構暫存器檔或記憶體並釋放它的項目,接著下一個,依此類推。如果頭端的指令引發了例外,或它前方的分支被誤測,機器就丟棄該項目以及所有更年輕的項目——它們從不正式生效。推測的工作就這樣從 ROB 蒸發,完全不碰可見狀態。
重排序緩衝區把激進的亂序、推測執行,與「程式必須表現得像循序執行」這個嚴格要求調和起來。它一次帶來兩件事:循序提交(可見狀態按程式順序改變)與精確例外(回報錯誤時,正好是它之前的指令都已完成、之後的都沒有)。沒有 ROB,你可以亂序執行,但無法乾淨地從誤測中復原,也無法在正確的指令上回報例外。它的大小也界定了核心能往前推測多遠。
指令 A、B、C 按此順序發射。C 最先完成、B 次之、A 最後。它們的結果停在 ROB 項目裡;提交仍按 A、再 B、再 C 進行。若 A 出錯,B 與 C 在生效之前就被壓掉——這是發生在 A 的一個精確例外。
亂序執行寫入 ROB;循序提交把它排空。
ROB 並不重排執行——它把提交重排回程式順序。人們常把兩者混為一談;打亂執行發生在保留站,而 ROB 的工作是把可見的結果重新理順。
又称
另见