暫存器更名(register renaming)
假設一間旅館門上只有十個房號(1 到 10 號),背後其實擁有一百個房間,還有一位聰明的櫃台人員:每次有人要「3 號房」,他就悄悄指派一間不同的真實房間並記下對應。兩位客人可以都被告知住在「3 號房」卻永不相撞,因為幕後他們在不同的實體房間裡。暫存器更名就是這位櫃台:程式命名一小組架構暫存器,硬體卻把每一個映射到一個大得多的實體暫存器池,並為每一次新的寫入挑一個全新的實體暫存器。
在機制上,核心維護一張暫存器別名表(RAT),把每個架構暫存器名稱(x0…x31)映射到當下持有其值的實體暫存器。當一道指令要寫,比方說 x5,更名器配置一個未用的實體暫存器 p42,在表中把 x5 指向 p42,並把後續讀 x5 的指令改寫成讀 p42。因為每一次寫都拿到自己的實體暫存器,重用名稱 x5 帶來的讀後寫與寫後寫(假)相依根本不可能發生——只有真正的寫後讀相依(讀者被指向生產者的實體暫存器)會留下。空閒的實體暫存器來自一張空閒清單;當某個舊值不再需要時,就把它歸還。
更名是亂序執行背後默默無名的推手。沒有它,那寥寥幾個架構暫存器名稱會不斷碰撞、把獨立指令序列化;有了它,機器揭露的平行性遠超 ISA 暫存器數量所暗示的。誠實的代價是更名硬體本身——龐大的實體暫存器檔、別名表、配置與空閒清單邏輯——它耗費面積與功耗,而且在分支誤測或例外發生時必須小心地回捲,才能讓可見的暫存器狀態保持完全正確。
兩個展開的迴圈迭代都寫 x10。更名把第一次寫映射到 p20、第二次映射到 p21,於是兩個迭代不再共用名稱,可以平行執行,而不必在 x10 上序列化。
少數架構名稱背後有許多實體暫存器——假相依就此瓦解。
更名能消除假(WAR/WAW)相依,但永遠消不掉真(RAW)相依——你無法靠更名越過一個確實必須先產生才能被讀的值。它在誤測時也必須被精確地回捲。