處理器的亂序執行


前面介紹了亂序的概念及去相關,這里開始介紹處理器的亂序執行結構。

1. Buffer的作用去耦合

在順序執行內核中,指令依次流經各個流水線單元,不需要進行緩存,而為了要能亂序執行,首先需要一個Buffer來緩存還沒有執行的指令,然后在這個 Buffer中去調度指令的執行順序。亂序執行內核的基本模型如下:

現代處理器中有大量的 Buffer,Buffer也廣泛應用在其他技術領域及生活領域中,就拿電冰箱來說,電冰箱除了冷凍的功能外,它實際上也是個 Buffer,我們把買來的東西放進去,要吃時,再從里面拿。
Buffer有兩大功能:

  1. 去耦合;
  2. 抗波動;

如果沒有電冰箱,每次我們想吃東西時,都要去超市,用專業術語來講,這就是耦合性太強了,如果超市關門了怎么辦?如果超市太遠了怎么辦?有了電冰箱后,從超市買的食物就放在電冰箱中,我們就直接從電冰箱中取食物,而不需要關注超市的狀況了。電冰箱去除了人和超市的耦合。
正常情況下,我們是每天買每天的食物,不過有時候,我們知道明天會有事情,沒有時間買食物,因此今天就把今、明兩天的食物都買了,這樣明天就不會餓肚子了,這就是電冰箱的抗波動功能。

在上面的圖中,粗線條表示東西多,細線條表示東西少,有時候買的多,有時候買的少,有時候吃的多,有時候吃的少,電冰箱的進和出都會存在一定的波動,電冰箱起到了抗波動功能,保證了我們在想吃時都有東西吃。

2.指令調度

在前面亂序設置陷阱的例子中,如果沒有那個聰明的士兵,亂序也就無從談起。同樣,處理器的亂序執行內核也需要一個調度器,分析指令間的相關性,分析指令什么時候能開始執行。
指令什么時候能開始執行呢?
對於一條指令來說,它有操作碼和操作數,操作碼描述指令要做什么,處理器會安排個功能單元( function unit)去執行它。操作數描述指令要處理什么數據,經過寄存器重命名后,目的寄存器總是新的,因此只需要關注源操作數是否准備好即可。所以,指令能否開始執行,依賴於兩個條件:

(1) 是否有空閑的功能單元去執行這條指令。
(2) 該指令的源操作數是否已經准備好。

只要滿足這兩條要求,指令就可以去執行,而不需要等待前面的指令完成。這樣處理器就完成了亂序調度及並行調度。
以前面經過寄存器重命名的指令為例,

處理器會記錄指令源操作數的准備狀態,當指令1完成后,處理器會通知所有依賴F5的指令,F5已經准備好了,指令2需要的兩個源操作數F5和F2都已准備好,它就可以被發送到指令的執行隊列中去執行。同樣,指令3也可以准備執行,如果處理器中有多個加法單元,指令2和指令3就可以同時執行。指令2完成后,F6也准備好了,指令4就可以去執行,指令4執行完后,F8就准備好了,F5早就准備好了,指令5就可以去執行。
在這個調度的例子中,5條指令4個 Cycle就可以完成,而使用順序內核,則需要5個 Cycle。 處理器內部需要一個Buffer來緩存指令,以供亂序調度,這個Buffer就是保留站( Reservation station),完成寄存器重命名后的指令被放置在保留站中,等到操作數和功能單元都准備好時,保留站中的指令就能被分派出去執行。

3.指令的順序提交

在指令的執行過程中,通常會有中斷和異常產生,如在下面的這個例子中,

XOR指令執行完后,來了一個中斷,中斷處理一般都是將處理器的ISA寄存器壓棧執行中斷服務程序,然后再退回來執行中斷后面的指令。精確中斷( Precise Interrupt)要求中斷前的指令都執行,中斷后的指令都沒有執行,而在亂序執行內核中,MOV、INC指令有可能提前到XOR前面執行,那么怎么來實現精確中斷呢?
解決方法就是:在指令亂序執行之后,再加一個步驟:指令順序提交(In- order commit)。亂序執行后,指令的結果雖然出來了,但是這個結果並沒有立即提交到ISA寄存器中,而是先緩存起來,只有當前指令前面的指令提交后,這條指令才能提交。
指令的順序提交也能解決投機執行出錯的問題,如下圖所示:

分支預測單元預測到JNZ跳轉到XOR處執行,亂序執行讓XOR指令在ADD前面執行,不過天有不測風雲,處理器執行到JNZ時,發現分支預測單元預測錯了,實際上應該執行的是MOV這個分支,使用順序提交策略,JNz后面指令的結果都沒有提交,可以直接拋棄,重新開始執行MOV這條路徑即可。
為了實現指令的順序提交,處理器內部使用了一個Buffer,叫做重排序緩沖區(ROB Re-order Buffer),多數的學術文章都叫這個名字,龍芯把這個 buffer叫做 Reorder Queue,簡稱ROQ(總要有所區別嘛)。

每條完成寄存器重命名的指令都要送到ROB中,ROB中的指令按照初始順序存放,指令經亂序執行后,只是修改了處理器內部的物理寄存器,並沒有修改處理器的ISA寄存器(匯編指令能看到的寄存器),指令在提交時,按照ROB中的順序,順序地修改處理器的ISA寄存器。

4. 亂序執行總結

簡單來說,指令在亂序執行內核中的處理過程可分為3個步驟:

下圖為亂序執行內核的基本結構圖:

取指、譯碼、分支預測和順序執行內核一樣,譯碼后,指令經過寄存器重命名,去除偽相關,然后進入指令分派模塊,指令分派模塊決定什么時候將指令分派到什么執行單元去執行。指令同時會進入指令提交單元,它記錄了指令的原始順序,用於指令的順序提交,同時它會將分支指令的實際執行信息更新到分支預測單元。
亂序執行比順序執行需要耗費更多的處理器資源,通常只有髙端處理器才會使用。最近, ARM Cortex-A9也引入了高端處理器常用的亂序執行( Out-of-Order Execution)和投機執行( Speculative Execution)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM