1. 程式人生 > >《大話處理器》連載——微架構(15) 暫存器重新命名

《大話處理器》連載——微架構(15) 暫存器重新命名

        暫存器不能隨便改名字,否則原來的資料依賴關係被打亂,會導致錯誤的執行結果,那麼怎樣才能既保留原先的資料依賴關係,又能將沒有資料依賴性的指令的暫存器改名字呢?

這裡介紹一種在處理器中經常實現的策略:

1.         將每條指令的目的暫存器對映到新的物理暫存器;

2.         指令的源暫存器對映為ISA暫存器最近對映到的那個物理暫存器;

3.         當本條指令完成後,該目的暫存器對映的更早的物理暫存器就可以釋放了;

          文字還是太抽象,看圖有真相:

暫存器重名示例

         在這個例子中,指令的第一個暫存器是目的暫存器,後2個是源暫存器,R1,R2,R3,R4是ISA暫存器,F1….F16是物理暫存器。

        R1,R2,R3,R4一開始被對映到F1,F2,F3,F4,第1條指令的目的暫存器是R3,因此將R3重新對映到F5,圖中的粗體表示對目的暫存器重新對映。第2條指令的源運算元需要訪問R3,就使用R3的最新對映值——F5,這樣就保證了指令2和指令1的資料相關性。

        指令3和指令2有反相關,將指令3的R2對映為F7,這樣指令3和指令2就沒有相關性了,即使指令3在指令2前面執行,也不會影響指令2的結果。

       指令4和指令3有輸出相關,經過暫存器重新命名後,指令4和指令3的R2分別對應不同的物理暫存器,它們之間的相關性就去除了。

        同樣的原理,指令4和指令5的相關性被保留。

       如果按照這種方式對映下去,物理暫存器自然會被使用完。因此,需要實時的釋放,已備重新分配。R4一開始對映到F4,當第2條指令執行完成後,R4的值就在F6中了,以後訪問R4時,都會使用最新的F6,而不會使用F4,這樣F4就可以被釋放了。

        在這種策略中,指令完全不需要訪問ISA暫存器,只需要訪問物理暫存器。