1. 程式人生 > >《大話處理器》連載——微架構(4) 史上最經典的5級流水線

《大話處理器》連載——微架構(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處理器等。