日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

超标量处理器设计——第七章_寄存器重命名

發(fā)布時間:2023/12/1 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 超标量处理器设计——第七章_寄存器重命名 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

超標(biāo)量處理器設(shè)計(jì)——第七章_寄存器重命名

參考《超標(biāo)量處理器》姚永斌著

文章目錄

  • 超標(biāo)量處理器設(shè)計(jì)——第七章_寄存器重命名
    • 7.1 簡述
    • 7.2 寄存器重命名方式
      • 7.2.1 用ROB進(jìn)行寄存器重命名
      • 7.2.2 擴(kuò)展ARF進(jìn)行寄存器重命名
      • 7.2.3 使用統(tǒng)一的PRF進(jìn)行寄存器重命名
    • 7.3 重命名映射表(RAT)
      • 7.3.1基于SRAM的重命名映射表
      • 7.3.2 基于CAM的重命名映射表
    • 7.4 超標(biāo)量處理器的寄存器重命名
      • 7.4.1 解決RAW相關(guān)性
      • 7.4.2 解決WAW相關(guān)性
    • 7.5 寄存器重命名過程的恢復(fù)
      • 7.5.1 Checkpoint
      • 7.5.2 使用WALK
      • 7.5.3 使用Architecture State
    • 7.6 分發(fā)

7.1 簡述

程序中存在很多相關(guān)性。可以分為:

  1. 數(shù)據(jù)相關(guān)性:

  2. 存儲器數(shù)據(jù)相關(guān)性:

    • load/store的相關(guān),也可以分為WAW,WAR和RAW三種類型。
  3. 控制相關(guān)性:

    • 分支指令引起的相關(guān)性,可以用分支預(yù)測解決。
  4. 結(jié)構(gòu)相關(guān)性:

    • 指令必須等到某些部件空閑時才能使用。例如發(fā)射隊(duì)列和重排序緩存,或者功能單元FU為空閑時才能繼續(xù)執(zhí)行。

只有RAW是真相關(guān)性。WAW是先寫再寫,可以通過重命名讓兩條指令先寫到不同的寄存器;WAR是先讀后寫,可以通過重命名讓寫指令寫到另一個寄存器,就不會對讀產(chǎn)生干擾。而先寫后讀,讀指令必須讀到新寫進(jìn)去的值,所以只有RAW才是真的數(shù)據(jù)相關(guān)。

例子:

之所以會有上述相關(guān)性,主要原因還是:

  1. 寄存器個數(shù)有限。
  2. 程序中循環(huán)體會重復(fù)像同一個變量賦值
  3. 代碼重用。某些函數(shù)在一段時間被頻繁調(diào)用。

解決辦法:寄存器重命名(Register Renaming)

  • 指令集定義的寄存器為邏輯寄存器(Logical Register 或 Architecture Register)
  • 處理器內(nèi)部實(shí)際存在的寄存器為物理寄存器(Physical Register)
  • 將邏輯寄存器映射到物理寄存器:重命名映射表(Register Renaming Table) ,Intel也將其稱為Register Alias Table, RAT

7.2 寄存器重命名方式

三種方式

  1. 將邏輯寄存器(Architechure Register File, ARF)擴(kuò)展來實(shí)現(xiàn)重命名。
  2. 使用統(tǒng)一的物理寄存器(PRF)來實(shí)現(xiàn)重命名。
  3. 使用ROB來實(shí)現(xiàn)重命名。

實(shí)現(xiàn)時,需要考慮:

  1. 何時占用一個物理寄存器,這個物理寄存器來自哪里?
  2. 何時釋放這個物理寄存器,這個物理寄存器去往哪里?
  3. 發(fā)生分支預(yù)測失敗時,如何處理?
  4. 發(fā)生異常時,如何處理?

7.2.1 用ROB進(jìn)行寄存器重命名

??在超標(biāo)量處理器中,每條指令都會將自身的信息按照程序中原始的順序存儲到ROB中,當(dāng)一條指令將結(jié)果計(jì)算出來之后,會將其寫到ROB中,但是由于分支預(yù)測失敗(mis-prediction)和異常(exception)等原因,這些結(jié)果未必就是正確的,它們的狀態(tài)被稱為推測的(speculative). 在一條指令離開流水線之前(也就是退休之前),它都會一直待在ROB中,只有當(dāng)指令變?yōu)榱魉€中最舊的指令,并且被驗(yàn)證為正確的時候,才會離開ROB,并使用它的結(jié)果對處理器的狀態(tài)進(jìn)行更新,例如將結(jié)果寫到ARF中。
??下面展示了ROB進(jìn)行寄存器重命名的過程:

??指令被寫到ROB中的一個表項(xiàng)時,該表項(xiàng)在ROB中的編號就是指令的目的寄存器對應(yīng)的物理寄存器號。這樣相當(dāng)于將邏輯寄存器對應(yīng)到了物理寄存器。

  • 指令離開流水線后(退休)會將結(jié)果從ROB中更新到ARF中。
  • ARF和ROB中存儲了兩份邏輯寄存器的值。某條指令還在流水線中,那么該指令所用的邏輯寄存器的值還在ROB中,ARF的存儲內(nèi)容就不是這個邏輯寄存器的最新值
  • 需要一個重命名映射表來指示每個邏輯寄存器的值是在ROB還是ARF,如下圖所示。圖中的重命名寄存器表里每個表項(xiàng)表示了該邏輯寄存器是在哪里,以及對應(yīng)的ROB地址。

  • 指令退休后,結(jié)果會從ROB中搬移到ARF中,這個信息也需要更新到重命名映射表中。

該方法的缺點(diǎn)

  1. 不是所有指令都有目的寄存器,但是ROB中都會統(tǒng)一為每個表項(xiàng)分配物理寄存器的字段。
  2. 對于一條指令,既可以從ROB中取源操作數(shù),也可以從ARF中取。ROB和ARF都需要支持最壞的情況。比如對4路超標(biāo)量處理器來說,如果一條指令的源寄存器有兩個,那就要支持8個讀端口。

該方法的優(yōu)點(diǎn):

  1. 容易實(shí)現(xiàn),復(fù)雜度不高,性能不錯。

7.2.2 擴(kuò)展ARF進(jìn)行寄存器重命名

??對ROB方案進(jìn)行升級,既然有些指令沒有目的寄存器,那就只保存那些有目的寄存器的指令。
??可以使用一個獨(dú)立的存儲部件,用來存儲流水線中所有指令的結(jié)果, 只有那些存在目的寄存器的指令才會占據(jù)這個存儲部件當(dāng)中的存儲空間,這個存儲部件稱為PRF(Physical Register File)。可以看作ARF(Architecture Register File)的擴(kuò)展。

PRF 可以通過FIFO來實(shí)現(xiàn)。

下面是該方法的實(shí)現(xiàn)圖:

?? 可以發(fā)現(xiàn),仍然需要將邏輯寄存器的值存放在兩個地方。
但是好處是相比于使用ROB,該方法不再需要為每條指令都開辟一個物理寄存器的字段。

7.2.3 使用統(tǒng)一的PRF進(jìn)行寄存器重命名

??該方法相當(dāng)于將ARF和PRF合并。合并后稱為統(tǒng)一的PRF

??在該P(yáng)RF中,沒有和指令產(chǎn)生映射關(guān)系的寄存器都處于空閑狀態(tài)。有一個空閑列表來記錄哪些寄存器是空閑的。

  • Free List用FIFO實(shí)現(xiàn)。
  • 對于一個4-way的超標(biāo)量處理器,需要每周期從FIFO讀4個物理寄存器編號出來。
  • 每周期最多可以退休4條指令,所以最多有4個空閑物理寄存器編號會寫入FIFO。
  • 當(dāng)空閑列表被讀空,表示物理寄存器全部占用,流水線重命名及其之前的階段就要被暫停。直到有指令退休釋放物理寄存器為止。
  • 當(dāng)外部查看處理器狀態(tài)時,很多物理寄存器還是推測的,因?yàn)橄鄳?yīng)的指令還沒有退休,所以這些處于推測狀態(tài)的寄存器不應(yīng)該被外部可見。因此需要開辟另一個重命名映射表(RAT),用于存儲所有退休狀態(tài)的指令(邏輯寄存器)和物理寄存器的對應(yīng)關(guān)系。

新的問題:一個物理寄存器被占用后,何時再次變?yōu)榭臻e?

  • 理論上來說,只要最后一條使用該物理寄存器的指令退休即可。

  • 實(shí)際上這個條件在硬件中并不好判斷。處理器采用的是一種簡單保守的方法:

  • 當(dāng)一條指令和后面的某條指令寫到同一個目的寄存器時,后面的指令退休時,前面的指令對應(yīng)的物理寄存器就沒用了。此時該物理寄存器就可以變?yōu)榭臻e。上圖中,b指令退休時,邏輯寄存器的值就被覆寫了,所以在此之前使用了r1對應(yīng)的物理寄存器的指令都應(yīng)該完成了,就可以釋放b指令之前r1的重命名寄存器了。

  • 因此在ROB中除了記錄邏輯寄存器當(dāng)前對應(yīng)的物理寄存器之外,還需要存儲它之前對應(yīng)的物理寄存器,便于該指令退休時釋放舊的映射關(guān)系。

使用統(tǒng)一的PRF進(jìn)行寄存器重命名的缺點(diǎn)

  1. 控制邏輯復(fù)雜,難度更大。
  2. 需要更多的電路:Free List存儲空閑物理寄存器編號,兩個重命名映射表(RAT)配合。

優(yōu)點(diǎn)

  1. 寄存器的值只要被寫入一次,就不需要進(jìn)行移動。其他兩種方法都是先寫入ROB或PRF,之后再寫回ARF。兩次寫入帶來兩倍的功耗。
  2. 一條指令的源寄存器的值值會存在一個地方,即PRF中。其他兩個方法中值可能會在兩個地方,即ARF和ROB(PRF)中。存在兩個地方有一個壞處,就是當(dāng)物理寄存器值寫回ARF中時,需要將該信息通知流水線中所有用了這個寄存器作為操作數(shù)的指令,增加了連線數(shù)量和功耗。

7.3 重命名映射表(RAT)

??重命名映射表提供了邏輯寄存器到物理寄存器的映射關(guān)系。因此RAT的地址就是邏輯寄存器編號,內(nèi)容是物理寄存器編號。這個表格在實(shí)現(xiàn)上有兩種方式:

  1. 基于SRAM(SRAM-Based RAT, sRAT)
  2. 基于CAM(CAM-Based RAT, cRAT)

sRAT:

  • 表項(xiàng)的個數(shù)為邏輯寄存器的個數(shù)
  • 單張表的容量=邏輯寄存器個數(shù)*物理寄存器編號位寬,例如32*6=192bits
  • 速度要快于CAM

cRAT:

  • 也用邏輯寄存器編號尋址,但是尋址時是基于內(nèi)容比較(CAM)。也就是用邏輯寄存器編號與存儲的表項(xiàng)一一比較,相同且V有效則返回對應(yīng)的地址(物理寄存器編號)。
  • 單張表的容量= 物理寄存器個數(shù)*邏輯寄存器位寬,例如64*5=320bits
  • 因?yàn)橐容^內(nèi)容,速度慢

比較:

  1. 物理寄存器個數(shù)越多,單張表而言sRAT要比cRAT小很多,且此時sRAT功耗更低,速度也更快。
  2. 分支預(yù)測時需要保存checkpoint,當(dāng)流水線很深時checkpoint個數(shù)很多,此時快照有多少個sRAT就需要復(fù)制多少份。但是對cRAT而言,只需要為每個快照保存一列V即可。所以這種情況下cRAT由于sRAT。

7.3.1基于SRAM的重命名映射表

?? 新寫入sRAT的值會覆蓋掉就的對應(yīng)關(guān)系,比如兩條指令先后寫入同一個目的寄存器,那么sRAT中該目的寄存器對應(yīng)的表項(xiàng)就會被覆蓋。這樣做可以嗎?
答案是不行,原因有二:

  1. 前面也說了被覆蓋的舊對應(yīng)關(guān)系在釋放物理寄存器時也是需要的,因此舊的對應(yīng)關(guān)系需要記錄下來。這樣在第二條指令寫同一個目的寄存器時,舊的對應(yīng)關(guān)系中的物理寄存器就可以釋放了。這個舊的對應(yīng)關(guān)系實(shí)際被記錄在ROB中。
  2. 當(dāng)一條指令之前存在異常或分支預(yù)測失敗的指令時,該指令需要從流水線中抹除。同時該指令對RAT的修改也需要被恢復(fù),此時就可以利用之前保存的舊映射關(guān)系了。

限制

  • 流水線中分支指令越多,就要使用越多的checkpoint。此時就會時重命名映射表復(fù)制多份。

解決辦法

  • 使用預(yù)測方法,對分支指令的正確度進(jìn)行預(yù)測,對那些預(yù)測正確率很高的指令,就不對他們使用checkpoint。雖然這些指令發(fā)生錯誤時需要用很慢的方法對RAT進(jìn)行恢復(fù),但是好在這種錯誤發(fā)生概率很低,所以對性能影響不大。

7.3.2 基于CAM的重命名映射表

?? CAM重命名映射表中,每個表項(xiàng)表示一個目標(biāo)寄存器對應(yīng)的邏輯寄存器。多條指令可能有相同的目標(biāo)寄存器,因此重命名映射表中可能會有若干個地址中的內(nèi)容是相同的,但是這幾個地址中應(yīng)該只有最后一個是有效的,因?yàn)橹暗挠成鋾缓竺娴挠成涓采w,所以需要一個有效位V來標(biāo)志最后一次映射。

?? cRAT實(shí)際結(jié)構(gòu)如下圖:

?? SRAM的部分用來存儲邏輯寄存器編號,CAM部分用來進(jìn)行內(nèi)容比較,最后匯總到編碼器。V也會送入編碼器,最終得到物理寄存器編號。

  • cRAT中,并不是V為0就表示這個物理寄存器是空閑的。可能只是這個映射關(guān)系剛被覆蓋而已。
  • 如果物理寄存器是空閑的,那么它在cRAT中對應(yīng)的有效位一定是0。
  • 在進(jìn)行checkpoint保存時,只需要保存一份V向量就可以了。

??下面是一個示例:

??在執(zhí)行到指令D時,會將V保存一份Checkpoint:

??同理,執(zhí)行到G的寄存器重命名階段,假設(shè)D還沒得到結(jié)果,則又會保存一份checkpoint:

??如果指令執(zhí)行完后發(fā)現(xiàn)D預(yù)測出錯,就會使用GC0對cRAT進(jìn)行狀態(tài)恢復(fù),D之后的指令對應(yīng)的有效位都會被置為0,還要對空閑列表free list進(jìn)行恢復(fù)。最后還要清空所有GC。因?yàn)楹竺娴腉C都在GC0的預(yù)測失敗路徑上。

7.4 超標(biāo)量處理器的寄存器重命名

對于Dest=Srcl 0P Src2這樣的指令來說,寄存器重命名的過程如下:

  1. 從RAT中找到Src1和Src2對應(yīng)的物理寄存器Psrc1和Psrc2。

  2. 從Free List中找到一個空閑的物理寄存器Pdest,作為目的寄存器Dest對應(yīng)的物理寄存器。

  3. 將映射關(guān)系寫到RAT中:

?? 可見,RAT需要支持:

  1. 三個讀端口,兩個用來讀取兩個源寄存器;另一個用來讀取每條指令的目的寄存器之前對應(yīng)的映射關(guān)系(用來釋放物理寄存器)。
  2. 一個寫端口,用來寫目的寄存器的映射關(guān)系。

?? 對于一個4-way的超標(biāo)量處理器來說,每周期又四條指令進(jìn)行寄存器重命名,因此需要:12個讀端口,4個寫端口。如下圖所示:

?? 在每周期進(jìn)行重命名時各指令之間存在各種相關(guān)性:

?? WAW相關(guān)性的處理

  1. 寫入RAT時,只需要將邏輯寄存器的最新映射關(guān)系寫道RAT中。如果一個周期內(nèi)多條指令的有同一個目的寄存器,執(zhí)行需要寫入最新的那條指令的映射關(guān)系。
  2. 將每條指令的舊映射關(guān)系寫入ROB時,若一個周期內(nèi)多條指令使用一個目的寄存器,則寫入ROB的舊映射關(guān)系不再是來自RAT讀取的值,而是來自和它有WAW相關(guān)性的指令。

?? WAR相關(guān)性的處理:寄存器重命名可直接消除。

7.4.1 解決RAW相關(guān)性

?? 在4-way的超標(biāo)量處理器中,一次可以對四條指令進(jìn)行寄存器重命名,過程如下:

?? 上圖中R1,R2被映射到P10,P11,目的寄存器R1,R3,R5,R8分別映射為P31, P40, P8, P5(從Free List中選取)。

?? 當(dāng)存在RAW相關(guān)性時:

?? R1寄存器存在RAW,因此第三條指令中的R1應(yīng)該使用映射后的寄存器,也就是P31。
?? 此時,需要一種組內(nèi)相關(guān)性檢查機(jī)制,對一個周期內(nèi)進(jìn)行重命名的所有指令進(jìn)行RAW檢查。需要將每條指令的源寄存器編號與前面所有指令的目的寄存器編號進(jìn)行比較,如果相等,源寄存器的物理寄存器就應(yīng)該來自Free List的輸出,而不是RAT的輸出。

  • 下面是組內(nèi)相關(guān)性檢查的一個電路示意圖:

  • 其中的相關(guān)性檢查電路如下圖:

7.4.2 解決WAW相關(guān)性

  1. 對RAT進(jìn)行檢查:

    • 多條指令的目的寄存器相等時,只有最新的那條指令的映射關(guān)系會被寫入RAT中。
    • 相應(yīng)的電路結(jié)構(gòu):

  2. 對ROB進(jìn)行檢查:

    • 為了釋放物理寄存器,每條指令需要從RAT中讀出它之前對應(yīng)的物理寄存器,寫回到ROB中。
    • 若一個周期進(jìn)行重命名的幾條指令中有兩條指令目的寄存器相同,則較新的指令對應(yīng)的舊的物理寄存器就直接來自于舊的那條指令(Free List),而不是RAT的輸出。

相應(yīng)的電路圖如下:

  • 若讀取RAT的源寄存器和寫入RAT的目的寄存器是同一個,會遇到同周期讀寫同一個地址的問題。
  • 應(yīng)該采用讀優(yōu)先的策略,也就是先讀出舊值,再向該地址寫入新值。

7.5 寄存器重命名過程的恢復(fù)

??分支預(yù)測失敗或者異常會導(dǎo)致指令從流水線中抹除,此時需要將被這條指令占用的資源進(jìn)行恢復(fù)。除了要恢復(fù)ROB和發(fā)射隊(duì)列,還要對RAT也進(jìn)行恢復(fù)。
??對RAT的恢復(fù)主要有3種方法:

  1. Checkpoint
  2. WALK
  3. Architecture State

7.5.1 Checkpoint

  • 所謂checkpoint就是對某些部件在某個時刻原封不動保存一份。相當(dāng)于某個時間對處理器狀態(tài)拍了一個快照。

  • 一般將Checkpoint簡寫為GC(Global Checkpoint)。
  • 若狀態(tài)恢復(fù)時,可以從任意一個GC中讀取,那這種方式就是隨機(jī)訪問的GC (Random Access GC, RAGC);
  • 若在狀態(tài)保存時,只有一個GC與狀態(tài)寄存器直接相連,其他GC要逐級移位才能放到指定GC中,就稱為串行訪問的GC (Sequential Access GC, SAGC)

PS. 串行訪問的GC能減少對主存儲部件的驅(qū)動能力的要求,但是相應(yīng)的,需要較長時間才能進(jìn)行狀態(tài)恢復(fù)。因此RAGC更適合做Checkpoint。

?? RAGC在電路上是如何實(shí)現(xiàn)的呢?

  • RAT實(shí)際上本質(zhì)是多端口的SRAM或寄存器堆。實(shí)現(xiàn)Checkpoint時,需要在SRAM的每個Main Bit Cell(MBC)旁邊加入一個Checkpoint Bit Cell(CBC)。
  • MBC的內(nèi)容可以復(fù)制到CBC,稱為Allocate
  • CBC內(nèi)容復(fù)制到MBC, 稱為Restore
  • 電路結(jié)構(gòu)如下圖:

7.5.2 使用WALK

背景:

  • Checkpoint電路會增大硬件開銷
  • 由于硬件限制,checkpoint沒法做很多

另辟蹊徑使用ROB對RAT進(jìn)行恢復(fù)

  • ROB中存儲了一條指令之前對應(yīng)的物理寄存器。
  • 從ROB底端最新的指令開始,逐條將每條指令之前對應(yīng)的映射關(guān)系寫道RAT中。
  • 對于4-way的處理器,RAT支持4路寫端口,可以每周期從ROB中WALK四條指令。

缺陷:

  • 速度較慢,需要對流水線中的指令有選擇的抹除
  • 還要逐個地對指令進(jìn)行恢復(fù)

優(yōu)勢:

  • 消耗資源少

7.5.3 使用Architecture State

背景

  • 在統(tǒng)一的PRF進(jìn)行寄存器重命名的方法中,所有邏輯寄存器都混在物理寄存器中了。當(dāng)要從處理器外部訪問邏輯寄存器,直接用寄存器重命名階段的RAT是很難實(shí)現(xiàn)的,因?yàn)樗峭茰y的(speculative)。因此一般都會在流水線的提交階段也用一個RAT。
    例如下面的一組指令:

??當(dāng)A離開流水線時,r1的值存儲在P31內(nèi)。如果在D完成重命名的時刻,處理器外部訪問邏輯寄存器r1,如果直接用重命名階段的RAT,那只能得到P34這個映射結(jié)果,而該映射是推測的,可能被分支預(yù)測失敗或異常而抹除。所以不應(yīng)該被外界看到這個映射。

解決方案

  • 所有正確離開流水線的指令都會更新這個RAT。稱之為aRAT(architectrue RAT)

  • aRAT的狀態(tài)肯定是正確的。其中的邏輯寄存器到物理寄存器的映射關(guān)系也是正確的而非推測的。

RAT狀態(tài)恢復(fù)

  • 分支預(yù)測失敗時,不馬上進(jìn)行RAT狀態(tài)恢復(fù),而是讓處理器繼續(xù)執(zhí)行。
  • 當(dāng)該分支指令變?yōu)樽钆f的指令,aRAT中就表示了分支指令所對應(yīng)的正確狀態(tài)的RAT。因?yàn)榉种е噶钋暗闹噶疃颊_離開了流水線。
  • 此時可以將aRAT的內(nèi)容復(fù)制到重命名階段的Speculative RAT,就完成了RAT的狀態(tài)恢復(fù)。
  • 這種恢復(fù)可以在RAT中的bit cell中建立連接(類似checkpoint)

7.6 分發(fā)

?? 流水線的分發(fā)(Dispatch)就是將重命名后的指令寫道發(fā)射隊(duì)列(Issue Queue)和重排序緩存ROB的過程。指令到達(dá)發(fā)射隊(duì)列后,就可以亂序執(zhí)行了。


知乎:flappylyc - 知乎 (zhihu.com)
博客園: love小酒窩 - 博客園 (cnblogs.com)
CSDN:love小酒窩的CSDN博客-IC,Verilog,計(jì)算機(jī)體系結(jié)構(gòu)領(lǐng)域博主
公眾號已開,了解更多相關(guān)內(nèi)容可以掃一掃下方二維碼~

總結(jié)

以上是生活随笔為你收集整理的超标量处理器设计——第七章_寄存器重命名的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。