《大話處理器》連載——微架構(4) 史上最經典的5級流水線
處理器內部有很多通用暫存器,這些暫存器用來儲存指令的運算元,它對程式設計師可見,如x86有8個通用暫存器,RISC處理器則更多,常有32個或64個等等。這一堆暫存器也被叫做Register file(暫存器堆)。
在流水線設計中,為了確保不同流水線節拍不會相互影響,在每個階段引入了流水線暫存器來分隔各個流水線節拍:
流水線暫存器
暫存器就像是紅燈,訊號只在固定的時間才會將左端節拍的值傳遞給右端節拍,這樣各個節拍的工作就不會出現紊亂。
在組合語言中,ALU(算術邏輯單元)單元直接訪問通用暫存器進行運算,在硬體實現時,通用暫存器中的資料先被讀到流水線暫存器中,也即ALU的輸入暫存器中,ALU運算結束後,資料會儲存在ALU的輸出暫存器中,最後再送回到通用暫存器中。下圖為ALU、通用暫存器、ALU輸入輸出暫存器的結構圖:
ALU、ALU輸入輸出暫存器、暫存器堆的關係
流水線暫存器是對程式設計師不可見的,ALU指令的執行節拍可以進一步細分為3個子節拍:
1. 從暫存器堆中讀取暫存器的值
2. 進行運算
3. 將運算結果寫回到暫存器堆中
根據這個分析,處理器的流水線可以進一步細分。MIPS處理器在設計時,將處理器的執行過程劃分為5個階段:
5級流水線
在MIPS的5級流水線中,從暫存器堆中讀資料到ALU輸入暫存器這個步驟被放在了ID階段,將運算結果寫回到暫存器堆被作為一個獨立的階段。
到目前為止,我們都認為資料已經存放在暫存器中,事實上,資料被存放在記憶體(Memory)中,在RISC處器中,資料要先從記憶體load(匯入)到暫存器中,然後再參與運算,然後將運算結果store(匯出)到儲存器中去。因此,MIPS的5級流水線增加了一個MEM階段。
對於運算指令,在MEM階段空閒。對於load指令,在EX階段計算要訪問的地址,在MEM階段從記憶體中將資料讀入到MEM register(MEM和WB之間的流水線暫存器)中,在WB階段,將MEM register的資料寫回到Register file中。對於store指令,在EX階段計算要訪問的地址,在MEM階段將暫存器中的資料寫回到儲存器中。
下圖是MIPS 5級流水線的執行順序圖:
MIPS 5級流水線
這5級流水線可以說是史上最經典的流水線,早期的MIPS、ARM9等處理器使用這種流水線,以後的處理器也都能看到它的影子,包括x86處理器等。