寄存器重命名技術在亂序執行流水線中有兩個作用。一是消除指令之間的寄存器讀後寫相關(WAR),和寫後寫相關(WAW);二是當指令執行發生例外或轉移指令猜測錯誤而取消後面的指令時可以保證現場的精確。
寄存器重命名的思路很簡單:就是當一條指令寫一個結果寄存器時不直接寫到這個結果寄存器,而是先寫到一箇中間寄存器過渡一下,當這條指令提交的時候再寫到結果寄存器中。
指令重命名有兩種方法:軟件重命名和硬件重命名方法。
- 軟件寄存器重命名方法 是在編譯的過程中消除指令集的數據相關的方法:
例如,具體示例如下,Addy 摘自胡老總《計算機體系結構》(相同顏色爲 寄存器相關):
通過軟件方法,在編譯過程中將寄存器相關的部分,通過軟件寄存器重命名的方法解決部分寄存器相關,增大了指令間的並行性。
如下圖所示爲 軟件修改結果。
- 硬件寄存器重命名方法 大致可以分成兩種,一是把重命名寄存器和結構寄存器分開;二是不把重命名寄存器和結構寄存器分開。
重命名寄存器(程序員不可見微結構寄存器)和結構寄存器(程序員可見寄存器)。
• 重命名寄存器的狀態
EMPTY:表示該寄存器沒有被重命名(重命名後又已經被釋放)。
MAPPED:表示已經被重命名但結果沒有寫回。
WRITEBACK:表示結果已經寫回重命名寄存器但沒有Commit到結構寄存器。
• 結構寄存器的狀態
VALID:表示相應寄存器的值可用。
INVALID:表示相應寄存器的值不可用。
• 映射關係
可以在結構寄存器中增加一個指向重命名寄存器的重命名寄存器號域。
• 核心是重命名錶
可以用CAM或RAM的方法,以CAM的方法爲例。
項數與物理寄存器一樣。
主要包括三個域:
name:相應的邏輯寄存器號。
state:狀態,EMPTY:表示該寄存器沒有被重命名(重命名後又已經被釋放);MAPPED:表示已經被重命名但結果沒有寫回;WRITEBACK:表示結果已經寫回重命名寄存器但沒有Commit到結構寄存器;COMMIT:表示結果已經被確認。
valid:在一個邏輯寄存器對應多個物理寄存器的情況下表示最新映。