CPU只有16個整數(shù)寄存器(x86-64),但現(xiàn)代處理器內(nèi)部有上百個物理寄存器。寄存器重命名技術(shù)把程序看到的"邏輯寄存器"動態(tài)映射到"物理寄存器",消除WAW和WAR假依賴,讓指令亂序執(zhí)行成為可能。
1. 重命名的核心思想
程序看到的寄存器是邏輯寄存器(Architectural Register),x86-64有16個。處理器內(nèi)部有物理寄存器(Physical Register),現(xiàn)代CPU有200+個。
映射關(guān)系:
- 每條寫邏輯寄存器的指令,分配一個新的物理寄存器
- 后續(xù)讀該邏輯寄存器的指令,讀取最新的物理寄存器
- 舊物理寄存器在不再被使用時釋放
示例:
原始代碼:
ADD R1, R2, R3 ; 寫R1
MUL R4, R1, R5 ; 讀R1
SUB R1, R6, R7 ; 寫R1(WAW!)
DIV R8, R1, R9 ; 讀R1
重命名后:
ADD P10, P2, P3 ; R1→P10
MUL P11, P10, P5 ; 讀P10
SUB P12, P6, P7 ; R1→P12(新物理寄存器,消除WAW)
DIV P13, P12, P9 ; 讀P12
現(xiàn)在ADD和SUB可以并行執(zhí)行,因?yàn)樗鼈儗懖煌奈锢砑拇嫫鳌?/p>
2. 三種實(shí)現(xiàn)方式
2.1 ROB-based重命名(Intel P6)
Intel P6架構(gòu)(Pentium Pro/II/III)使用重排序緩沖區(qū)(ROB)作為物理寄存器[1]:
- 推測結(jié)果存在ROB中
- 退休時復(fù)制到架構(gòu)寄存器文件(ARF)
- 重命名映射表記錄邏輯寄存器→ROB entry
問題:
- 每條指令都占ROB entry,即使沒有目的寄存器(如分支)
- 源操作數(shù)可能來自ROB或ARF,需要雙端口支持
- 退休時需要數(shù)據(jù)搬運(yùn)(ROB→ARF),增加功耗
2.2 ARF擴(kuò)展(Intel Netburst早期)
使用獨(dú)立的物理寄存器文件(PRF)存儲推測結(jié)果[2]:
- 只有有目的寄存器的指令才占PRF entry
- 退休時復(fù)制到ARF
- 比ROB方案節(jié)省空間
問題:邏輯寄存器的值仍可能存在于PRF和ARF兩個地方,取數(shù)時需要判斷。
2.3 統(tǒng)一PRF(現(xiàn)代主流)
Intel Sandy Bridge及以后、ARM Cortex-A73及以后采用統(tǒng)一物理寄存器文件[1][3]:
- 合并ARF和PRF,所有寄存器值都存在PRF
- 沒有數(shù)據(jù)搬運(yùn),退休時只需更新映射關(guān)系
- 需要空閑列表(Free List)管理物理寄存器
- 需要兩個重命名映射表(RAT):
- Front-end RAT:記錄推測狀態(tài)
- Retirement RAT:記錄已提交狀態(tài)
優(yōu)勢:
- 指令結(jié)果只寫一次,降低功耗
- 源數(shù)據(jù)只在一個地方,簡化取數(shù)邏輯
- 減少電路連線和邏輯門級數(shù)
ARM Cortex-A73的具體實(shí)現(xiàn)[3]:
- 整數(shù)寄存器文件:41個物理寄存器(64位寬)
- FP/向量寄存器文件:38個物理寄存器(128位寬)
- 分離設(shè)計(jì)降低端口數(shù),節(jié)省面積和功耗
3. Tomasulo算法:重命名的經(jīng)典實(shí)現(xiàn)
Tomasulo算法(IBM 360/91,1967年)首次實(shí)現(xiàn)了寄存器重命名[4][5]。
3.1 核心組件
保留站(Reservation Station):
- 每個功能單元有獨(dú)立的保留站
- 緩存指令和操作數(shù)
- 操作數(shù)未就緒時,記錄產(chǎn)生它的保留站標(biāo)簽(Tag)
寄存器重命名:
- 指令中的邏輯寄存器被替換為值或指向保留站的指針
- 消除WAR和WAW依賴
公共數(shù)據(jù)總線(CDB):
- 廣播已完成指令的<值, 標(biāo)簽>
- 等待該標(biāo)簽的保留站捕獲值
3.2 執(zhí)行流程
-
發(fā)射(Issue):
- 從指令隊(duì)列取指令
- 分配空閑保留站
- 重命名源寄存器:如果值已就緒,直接讀入;否則記錄標(biāo)簽
- 重命名目的寄存器:分配新標(biāo)簽
-
執(zhí)行(Execute):
- 監(jiān)視CDB,等待操作數(shù)就緒
- 所有操作數(shù)就緒后,送入功能單元執(zhí)行
-
寫回(Writeback):
- 結(jié)果通過CDB廣播<值, 標(biāo)簽>
- 更新寄存器文件和等待的保留站
- 釋放保留站
3.3 處理WAW和WAR
WAW示例:
DIV F0, F2, F4 ; F0 = F2/F4
SUB F0, F6, F8 ; F0 = F6-F8(WAW?。?
Tomasulo處理:
- DIV發(fā)射到保留站Mult1,目的F0重命名為Mult1的標(biāo)簽
- SUB發(fā)射到保留站Add1,目的F0重命名為Add1的標(biāo)簽
- 后續(xù)讀F0的指令會讀到Add1的標(biāo)簽(最新映射)
- DIV的結(jié)果寫入F0時,如果映射已更新到Add1,則不更新(避免覆蓋)
WAR示例:
SUB F4, F0, F8 ; 讀F0
DIV F0, F2, F4 ; 寫F0(WAR!)
Tomasulo處理:
- SUB發(fā)射到Add1,源F0的值直接讀入(或記錄標(biāo)簽)
- DIV發(fā)射到Mult1,目的F0重命名為Mult1的標(biāo)簽
- SUB從Add1的Vj字段讀F0,不受DIV寫F0的影響
4. 物理寄存器的釋放
關(guān)鍵問題:什么時候釋放物理寄存器?
原理:當(dāng)后續(xù)指令都使用新的映射時,舊物理寄存器可以釋放。
實(shí)現(xiàn)[4]:
- 重命名時,記錄目的寄存器的舊映射(Previous Mapping)
- 指令退休時,檢查該舊映射是否還被后續(xù)指令使用
- 如果沒有使用,放入Free List
示例:
指令a: ADD R1, R2, R3 ; R1→P1(舊映射:P0)
指令b: SUB R1, R4, R5 ; R1→P6(舊映射:P1)
當(dāng)指令b退休時:
- 后續(xù)指令使用R1都讀到P6
- P1不再被使用,可以釋放
ROB在這里的作用是記錄指令順序,確保按程序順序退休和釋放寄存器。
5. 總結(jié)
| 依賴類型 | 是否可消除 | 消除方法 | 實(shí)現(xiàn)復(fù)雜度 |
|---|---|---|---|
| RAW | 否 | 轉(zhuǎn)發(fā)/等待 | - |
| WAW | 是 | 重命名目的寄存器 | 中 |
| WAR | 是 | 重命名目的寄存器 | 中 |
寄存器重命名的核心價值:
- 消除假依賴,暴露更多指令級并行
- 支持亂序執(zhí)行,提升IPC
- 動態(tài)映射,比靜態(tài)編譯優(yōu)化更靈活
三種實(shí)現(xiàn)方式對比:
- ROB-based:設(shè)計(jì)簡單,但數(shù)據(jù)搬運(yùn)多,功耗高
- ARF擴(kuò)展:節(jié)省PRF空間,但取數(shù)邏輯復(fù)雜
- 統(tǒng)一PRF:無數(shù)據(jù)搬運(yùn),能效最優(yōu),現(xiàn)代主流
理解寄存器重命名,就能理解為什么現(xiàn)代CPU能在只有16個架構(gòu)寄存器的情況下,實(shí)現(xiàn)深度亂序執(zhí)行和高性能。
參考
-
Chips and Cheese. Sandy Bridge: Setting Intel's Modern Foundation. P6 vs Sandy Bridge PRF. ? ?
-
Chips and Cheese. Tracing Intel's Atom Journey: Goldmont Plus. PRF vs ROB. ?
-
Chips and Cheese. Cortex A73's Not-So-Infinite Reordering Capacity. A73 PRF design. ? ?
-
中國科學(xué)技術(shù)大學(xué). 5-3 動態(tài)指令流調(diào)度II. Tomasulo算法詳解. ?