超标量处理器设计——第七章_寄存器重命名
超標量處理器設計——第七章_寄存器重命名
參考《超標量處理器》姚永斌著
文章目錄
- 超標量處理器設計——第七章_寄存器重命名
-
- 7.1 簡述
- 7.2 寄存器重命名方式
-
- 7.2.1 用ROB進行寄存器重命名
- 7.2.2 擴展ARF進行寄存器重命名
- 7.2.3 使用統一的PRF進行寄存器重命名
- 7.3 重命名映射表(RAT)
-
- 7.3.1基于SRAM的重命名映射表
- 7.3.2 基于CAM的重命名映射表
- 7.4 超標量處理器的寄存器重命名
-
- 7.4.1 解決RAW相關性
- 7.4.2 解決WAW相關性
- 7.5 寄存器重命名過程的恢復
-
- 7.5.1 Checkpoint
- 7.5.2 使用WALK
- 7.5.3 使用Architecture State
- 7.6 分發
7.1 簡述
程序中存在很多相關性。可以分為:
-
數據相關性:
-
存儲器數據相關性:
- load/store的相關,也可以分為WAW,WAR和RAW三種類型。
-
控制相關性:
- 分支指令引起的相關性,可以用分支預測解決。
-
結構相關性:
- 指令必須等到某些部件空閑時才能使用。例如發射隊列和重排序緩存,或者功能單元FU為空閑時才能繼續執行。
只有RAW是真相關性。WAW是先寫再寫,可以通過重命名讓兩條指令先寫到不同的寄存器;WAR是先讀后寫,可以通過重命名讓寫指令寫到另一個寄存器,就不會對讀產生干擾。而先寫后讀,讀指令必須讀到新寫進去的值,所以只有RAW才是真的數據相關。
例子:
之所以會有上述相關性,主要原因還是:
- 寄存器個數有限。
- 程序中循環體會重復像同一個變量賦值
- 代碼重用。某些函數在一段時間被頻繁調用。
解決辦法:寄存器重命名(Register Renaming)
- 指令集定義的寄存器為邏輯寄存器(Logical Register 或 Architecture Register)。
- 處理器內部實際存在的寄存器為物理寄存器(Physical Register)。
- 將邏輯寄存器映射到物理寄存器:重命名映射表(Register Renaming Table) ,Intel也將其稱為Register Alias Table, RAT
7.2 寄存器重命名方式
三種方式:
- 將邏輯寄存器(Architechure Register File, ARF)擴展來實現重命名。
- 使用統一的物理寄存器(PRF)來實現重命名。
- 使用ROB來實現重命名。
實現時,需要考慮:
- 何時占用一個物理寄存器,這個物理寄存器來自哪里?
- 何時釋放這個物理寄存器,這個物理寄存器去往哪里?
- 發生分支預測失敗時,如何處理?
- 發生異常時,如何處理?
7.2.1 用ROB進行寄存器重命名
??在超標量處理器中,每條指令都會將自身的信息按照程序中原始的順序存儲到ROB中,當一條指令將結果計算出來之后,會將其寫到ROB中,但是由于分支預測失敗(mis-prediction)和異常(exception)等原因,這些結果未必就是正確的,它們的狀態被稱為推測的(speculative). 在一條指令離開流水線之前(也就是退休之前),它都會一直待在ROB中,只有當指令變為流水線中最舊的指令,并且被驗證為正確的時候,才會離開ROB,并使用它的結果對處理器的狀態進行更新,例如將結果寫到ARF中。
??下面展示了ROB進行寄存器重命名的過程:
??指令被寫到ROB中的一個表項時,該表項在ROB中的編號就是指令的目的寄存器對應的物理寄存器號。這樣相當于將邏輯寄存器對應到了物理寄存器。
- 指令離開流水線后(退休)會將結果從ROB中更新到ARF中。
- ARF和ROB中存儲了兩份邏輯寄存器的值。某條指令還在流水線中,那么該指令所用的邏輯寄存器的值還在ROB中,ARF的存儲內容就不是這個邏輯寄存器的最新值。
- 需要一個重命名映射表來指示每個邏輯寄存器的值是在ROB還是ARF,如下圖所示。圖中的重命名寄存器表里每個表項表示了該邏輯寄存器是在哪里,以及對應的ROB地址。
- 指令退休后,結果會從ROB中搬移到ARF中,這個信息也需要更新到重命名映射表中。
該方法的缺點:
- 不是所有指令都有目的寄存器,但是ROB中都會統一為每個表項分配物理寄存器的字段。
- 對于一條指令,既可以從ROB中取源操作數,也可以從ARF中取。ROB和ARF都需要支持最壞的情況。比如對4路超標量處理器來說,如果一條指令的源寄存器有兩個,那就要支持8個讀端口。
該方法的優點:
- 容易實現,復雜度不高,性能不錯。
7.2.2 擴展ARF進行寄存器重命名
??對ROB方案進行升級,既然有些指令沒有目的寄存器,那就只保存那些有目的寄存器的指令。
??可以使用一個獨立的存儲部件,用來存儲流水線中所有指令的結果, 只有那些存在目的寄存器的指令才會占據這個存儲部件當中的存儲空間,這個存儲部件稱為PRF(Physical Register File)。可以看作ARF(Architecture Register File)的擴展。
PRF 可以通過FIFO來實現。
下面是該方法的實現圖:
?? 可以發現,仍然需要將邏輯寄存器的值存放在兩個地方。
但是好處是相比于使用ROB,該方法不再需要為每條指令都開辟一個物理寄存器的字段。
7.2.3 使用統一的PRF進行寄存器重命名
??該方法相當于將ARF和PRF合并。合并后稱為統一的PRF。
??在該PRF中,沒有和指令產生映射關系的寄存器都處于空閑狀態。有一個空閑列表來記錄哪些寄存器是空閑的。
- Free List用FIFO實現。
- 對于一個4-way的超標量處理器,需要每周期從FIFO讀4個物理寄存器編號出來。
- 每周期最多可以退休4條指令,所以最多有4個空閑物理寄存器編號會寫入FIFO。
- 當空閑列表被讀空,表示物理寄存器全部占用,流水線重命名及其之前的階段就要被暫停。直到有指令退休釋放物理寄存器為止。
- 當外部查看處理器狀態時,很多物理寄存器還是推測的,因為相應的指令還沒有退休,所以這些處于推測狀態的寄存器不應該被外部可見。因此需要開辟另一個重命名映射表(RAT),用于存儲所有退休狀態的指令(邏輯寄存器)和物理寄存器的對應關系。
新的問題:一個物理寄存器被占用后,何時再次變為空閑?
-
理論上來說,只要最后一條使用該物理寄存器的指令退休即可。
-
實際上這個條件在硬件中并不好判斷。處理器采用的是一種簡單保守的方法:
-
當一條指令和后面的某條指令寫到同一個目的寄存器時,后面的指令退休時,前面的指令對應的物理寄存器就沒用了。此時該物理寄存器就可以變為空閑。上圖中,b指令退休時,邏輯寄存器的值就被覆寫了,所以在此之前使用了r1對應的物理寄存器的指令都應該完成了,就可以釋放b指令之前r1的重命名寄存器了。
-
因此在ROB中除了記錄邏輯寄存器當前對應的物理寄存器之外,還需要存儲它之前對應的物理寄存器,便于該指令退休時釋放舊的映射關系。
使用統一的PRF進行寄存器重命名的缺點:
- 控制邏輯復雜,難度更大。
- 需要更多的電路:Free List存儲空閑物理寄存器編號,兩個重命名映射表(RAT)配合。
優點:
- 寄存器的值只要被寫入一次,就不需要進行移動。其他兩種方法都是先寫入ROB或PRF,之后再寫回ARF。兩次寫入帶來兩倍的功耗。
- 一條指令的源寄存器的值值會存在一個地方,即PRF中。其他兩個方法中值可能會在兩個地方,即ARF和ROB(PRF)中。存在兩個地方有一個壞處,就是當物理寄存器值寫回ARF中時,需要將該信息通知流水線中所有用了這個寄存器作為操作數的指令,增加了連線數量和功耗。
7.3 重命名映射表(RAT)
??重命名映射表提供了邏輯寄存器到物理寄存器的映射關系。因此RAT的地址就是邏輯寄存器編號,內容是物理寄存器編號。這個表格在實現上有兩種方式:
- 基于SRAM(SRAM-Based RAT, sRAT)
- 基于CAM(CAM-Based RAT, cRAT)
sRAT:
- 表項的個數為邏輯寄存器的個數
- 單張表的容量=邏輯寄存器個數*物理寄存器編號位寬,例如32*6=192bits
- 速度要快于CAM
cRAT:
- 也用邏輯寄存器編號尋址,但是尋址時是基于內容比較(CAM)。也就是用邏輯寄存器編號與存儲的表項一一比較,相同且V有效則返回對應的地址(物理寄存器編號)。
- 單張表的容量= 物理寄存器個數*邏輯寄存器位寬,例如64*5=320bits
- 因為要比較內容,速度慢
比較:
- 物理寄存器個數越多,單張表而言sRAT要比cRAT小很多,且此時sRAT功耗更低,速度也更快。
- 分支預測時需要保存checkpoint,當流水線很深時checkpoint個數很多,此時快照有多少個sRAT就需要復制多少份。但是對cRAT而言,只需要為每個快照保存一列V即可。所以這種情況下cRAT由于sRAT。
7.3.1基于SRAM的重命名映射表
?? 新寫入sRAT的值會覆蓋掉就的對應關系,比如兩條指令先后寫入同一個目的寄存器,那么sRAT中該目的寄存器對應的表項就會被覆蓋。這樣做可以嗎?
答案是不行,原因有二:
- 前面也說了被覆蓋的舊對應關系在釋放物理寄存器時也是需要的,因此舊的對應關系需要記錄下來。這樣在第二條指令寫同一個目的寄存器時,舊的對應關系中的物理寄存器就可以釋放了。這個舊的對應關系實際被記錄在ROB中。
- 當一條指令之前存在異常或分支預測失敗的指令時,該指令需要從流水線中抹除。同時該指令對RAT的修改也需要被恢復,此時就可以利用之前保存的舊映射關系了。
限制:
- 流水線中分支指令越多,就要使用越多的checkpoint。此時就會時重命名映射表復制多份。
解決辦法:
- 使用預測方法,對分支指令的正確度進行預測,對那些預測正確率很高的指令,就不對他們使用checkpoint。雖然這些指令發生錯誤時需要用很慢的方法對RAT進行恢復,但是好在這種錯誤發生概率很低,所以對性能影響不大。
7.3.2 基于CAM的重命名映射表
?? CAM重命名映射表中,每個表項表示一個目標寄存器對應的邏輯寄存器。多條指令可能有相同的目標寄存器,因此重命名映射表中可能會有若干個地址中的內容是相同的,但是這幾個地址中應該只有最后一個是有效的,因為之前的映射會被后面的映射覆蓋,所以需要一個有效位V來標志最后一次映射。
?? cRAT實際結構如下圖:
?? SRAM的部分用來存儲邏輯寄存器編號,CAM部分用來進行內容比較,最后匯總到編碼器。V也會送入編碼器,最終得到物理寄存器編號。
- cRAT中,并不是V為0就表示這個物理寄存器是空閑的。可能只是這個映射關系剛被覆蓋而已。
- 如果物理寄存器是空閑的,那么它在cRAT中對應的有效位一定是0。
- 在進行checkpoint保存時,只需要保存一份V向量就可以了。
??下面是一個示例:
??在執行到指令D時,會將V保存一份Checkpoint:
??同理,執行到G的寄存器重命名階段,假設D還沒得到結果,則又會保存一份checkpoint:
??如果指令執行完后發現D預測出錯,就會使用GC0對cRAT進行狀態恢復,D之后的指令對應的有效位都會被置為0,還要對空閑列表free list進行恢復。最后還要清空所有GC。因為后面的GC都在GC0的預測失敗路徑上。
7.4 超標量處理器的寄存器重命名
對于Dest=Srcl 0P Src2這樣的指令來說,寄存器重命名的過程如下:
-
從RAT中找到Src1和Src2對應的物理寄存器Psrc1和Psrc2。
-
從Free List中找到一個空閑的物理寄存器Pdest,作為目的寄存器Dest對應的物理寄存器。
-
將映射關系寫到RAT中:
?? 可見,RAT需要支持:
- 三個讀端口,兩個用來讀取兩個源寄存器;另一個用來讀取每條指令的目的寄存器之前對應的映射關系(用來釋放物理寄存器)。
- 一個寫端口,用來寫目的寄存器的映射關系。
?? 對于一個4-way的超標量處理器來說,每周期又四條指令進行寄存器重命名,因此需要:12個讀端口,4個寫端口。如下圖所示:
?? 在每周期進行重命名時各指令之間存在各種相關性:
?? WAW相關性的處理:
- 寫入RAT時,只需要將邏輯寄存器的最新映射關系寫道RAT中。如果一個周期內多條指令的有同一個目的寄存器,執行需要寫入最新的那條指令的映射關系。
- 將每條指令的舊映射關系寫入ROB時,若一個周期內多條指令使用一個目的寄存器,則寫入ROB的舊映射關系不再是來自RAT讀取的值,而是來自和它有WAW相關性的指令。
?? WAR相關性的處理:寄存器重命名可直接消除。
7.4.1 解決RAW相關性
?? 在4-way的超標量處理器中,一次可以對四條指令進行寄存器重命名,過程如下:
?? 上圖中R1,R2被映射到P10,P11,目的寄存器R1,R3,R5,R8分別映射為P31, P40, P8, P5(從Free List中選取)。
?? 當存在RAW相關性時:
?? R1寄存器存在RAW,因此第三條指令中的R1應該使用映射后的寄存器,也就是P31。
?? 此時,需要一種組內相關性檢查機制,對一個周期內進行重命名的所有指令進行RAW檢查。需要將每條指令的源寄存器編號與前面所有指令的目的寄存器編號進行比較,如果相等,源寄存器的物理寄存器就應該來自Free List的輸出,而不是RAT的輸出。
- 下面是組內相關性檢查的一個電路示意圖:
- 其中的相關性檢查電路如下圖:
7.4.2 解決WAW相關性
-
對RAT進行檢查:
- 多條指令的目的寄存器相等時,只有最新的那條指令的映射關系會被寫入RAT中。
- 相應的電路結構:
-
對ROB進行檢查:
- 為了釋放物理寄存器,每條指令需要從RAT中讀出它之前對應的物理寄存器,寫回到ROB中。
- 若一個周期進行重命名的幾條指令中有兩條指令目的寄存器相同,則較新的指令對應的舊的物理寄存器就直接來自于舊的那條指令(Free List),而不是RAT的輸出。
相應的電路圖如下:
- 若讀取RAT的源寄存器和寫入RAT的目的寄存器是同一個,會遇到同周期讀寫同一個地址的問題。
- 應該采用讀優先的策略,也就是先讀出舊值,再向該地址寫入新值。
7.5 寄存器重命名過程的恢復
??分支預測失敗或者異常會導致指令從流水線中抹除,此時需要將被這條指令占用的資源進行恢復。除了要恢復ROB和發射隊列,還要對RAT也進行恢復。
??對RAT的恢復主要有3種方法:
- Checkpoint
- WALK
- Architecture State
7.5.1 Checkpoint
- 所謂checkpoint就是對某些部件在某個時刻原封不動保存一份。相當于某個時間對處理器狀態拍了一個快照。
- 一般將Checkpoint簡寫為GC(Global Checkpoint)。
- 若狀態恢復時,可以從任意一個GC中讀取,那這種方式就是隨機訪問的GC (Random Access GC, RAGC);
- 若在狀態保存時,只有一個GC與狀態寄存器直接相連,其他GC要逐級移位才能放到指定GC中,就稱為串行訪問的GC (Sequential Access GC, SAGC)
PS. 串行訪問的GC能減少對主存儲部件的驅動能力的要求,但是相應的,需要較長時間才能進行狀態恢復。因此RAGC更適合做Checkpoint。
?? RAGC在電路上是如何實現的呢?
- RAT實際上本質是多端口的SRAM或寄存器堆。實現Checkpoint時,需要在SRAM的每個Main Bit Cell(MBC)旁邊加入一個Checkpoint Bit Cell(CBC)。
- MBC的內容可以復制到CBC,稱為Allocate
- CBC內容復制到MBC, 稱為Restore
- 電路結構如下圖:
7.5.2 使用WALK
背景:
- Checkpoint電路會增大硬件開銷
- 由于硬件限制,checkpoint沒法做很多
另辟蹊徑:使用ROB對RAT進行恢復。
- ROB中存儲了一條指令之前對應的物理寄存器。
- 從ROB底端最新的指令開始,逐條將每條指令之前對應的映射關系寫道RAT中。
- 對于4-way的處理器,RAT支持4路寫端口,可以每周期從ROB中WALK四條指令。
缺陷:
- 速度較慢,需要對流水線中的指令有選擇的抹除
- 還要逐個地對指令進行恢復
優勢:
- 消耗資源少
7.5.3 使用Architecture State
背景:
- 在統一的PRF進行寄存器重命名的方法中,所有邏輯寄存器都混在物理寄存器中了。當要從處理器外部訪問邏輯寄存器,直接用寄存器重命名階段的RAT是很難實現的,因為它是推測的(speculative)。因此一般都會在流水線的提交階段也用一個RAT。
例如下面的一組指令:
??當A離開流水線時,r1的值存儲在P31內。如果在D完成重命名的時刻,處理器外部訪問邏輯寄存器r1,如果直接用重命名階段的RAT,那只能得到P34這個映射結果,而該映射是推測的,可能被分支預測失敗或異常而抹除。所以不應該被外界看到這個映射。
解決方案:
-
所有正確離開流水線的指令都會更新這個RAT。稱之為aRAT(architectrue RAT)
-
aRAT的狀態肯定是正確的。其中的邏輯寄存器到物理寄存器的映射關系也是正確的而非推測的。
RAT狀態恢復:
- 分支預測失敗時,不馬上進行RAT狀態恢復,而是讓處理器繼續執行。
- 當該分支指令變為最舊的指令,aRAT中就表示了分支指令所對應的正確狀態的RAT。因為分支指令前的指令都正確離開了流水線。
- 此時可以將aRAT的內容復制到重命名階段的Speculative RAT,就完成了RAT的狀態恢復。
- 這種恢復可以在RAT中的bit cell中建立連接(類似checkpoint)
7.6 分發
?? 流水線的分發(Dispatch)就是將重命名后的指令寫道發射隊列(Issue Queue)和重排序緩存ROB的過程。指令到達發射隊列后,就可以亂序執行了。
知乎:flappylyc - 知乎 (zhihu.com)
博客園: love小酒窩 - 博客園 (cnblogs.com)
CSDN:love小酒窩的CSDN博客-IC,Verilog,計算機體系結構領域博主
公眾號已開,了解更多相關內容可以掃一掃下方二維碼~
總結
以上是生活随笔為你收集整理的超标量处理器设计——第七章_寄存器重命名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件商店下载java_Sun升级Java
- 下一篇: 如何把喜马拉雅连接到天猫精灵上