指令層級平行與亂序執行
保留站(reservation station)
想像每位廚師旁有一張小小的等候桌,一張訂單就擺在桌上,直到它需要的每樣食材都送到桌上為止;最後一樣食材一落桌,廚師立刻抓起訂單開工。保留站就是 CPU 裡那張等候桌:一個緩衝槽,存放一道指令、它已經拿到的運算元,以及每個還缺的運算元的一條備註,直到所有輸入都到齊才放這道指令去執行。
具體來說,一道指令發射時,會被放進某個合適功能單元(加法器、乘法器、載入單元⋯⋯)的保留站。對每個來源運算元,保留站記下實際的值(若已備妥)或一個標籤,指名最終由哪個生產者供應它。當結果在共同資料匯流排上廣播時,每個保留站盯著自己在等的標籤;一旦相符的結果出現,就把它擷取進槽裡。等每個運算元都填好、功能單元也空著,這道指令就發射執行。正是這種緩衝,讓一道停頓的指令能讓到一旁,使後面就緒的指令得以通過——這就是動態排程的核心。
保留站是在 Tomasulo 演算法中提出的,至今在現代發射佇列裡仍是觀念上的核心。它重要,是因為它把發射(按順序進入視窗)與執行(隨時就緒就離開)解耦,而這正是製造出亂序執行的關鍵。誠實的限制是大小:保留站數量有限,所以夠長的一連串停頓終究會把它們塞滿,前端仍得停頓。一顆核心能往前看的視窗,受保留站與重排序緩衝區的數量所界定。
一道乘法「mul x6 = x4 x5」發射了,但 x5 還沒就緒。它的保留站保存 x4 的值,以及 x5 生產者的一個標籤。當那個生產者廣播出結果時,保留站抓住它,這道乘法終於執行。
一個等候槽,等齊缺少的運算元後,才放指令去執行。
保留站是有限的。人們會想像一個無限的往前看視窗,但一旦保留站(或重排序緩衝區)塞滿,循序前端就會停頓,無論更前方的程式碼還有多少 ILP。
又称
另见