什么是寄存器重命名?
寄存器重命名是一种消除寄存器数据之间虚假数据依赖关系(例如 WAR 和 WAW 依赖关系)的标准方法。它最早由 Tjaden 和 Flynn 于 1970 年提出。
他们打算将寄存器重命名用于一组确定的指令,这些指令或多或少与加载指令类相似,尽管它没有使用“重命名”这个短语。Keller(1975)引入了“寄存器重命名”的名称,并将其解释为所有合适的指令。
寄存器重命名假定三操作数指令格式。为了说明此前提条件,让我们考虑一个双操作数指令,例如
ad r1, r2
其解释为
r1←(r1)+(r2)
在双操作数指令格式中,结果写回其中一个源操作数的位置,在本例中为 r1 的位置。但是,为了重命名目标,必须使用与包含源操作数 (r1) 的寄存器不同的寄存器,例如 r11。因此,重命名后我们得到
r11←(r1)+(r2)
这意味着双操作数指令的重命名总是以三操作数指令结束。因此,双操作数指令只能使用内部的双操作数到三操作数转换进行重命名。
寄存器重命名的实现
寄存器重命名可以静态或动态地实现,如图所示。
**静态实现** - 在静态实现中,寄存器重命名在编译期间进行。此技术最初是在流水线处理器的并行优化编译器中引入的,后来在超标量处理器中也得到了应用。
**动态实现** - 当寄存器重命名动态实现时,重命名在执行期间发生。这需要额外的电路,包括补充寄存器空间、额外的数 据路径和逻辑。动态重命名已在 1990 年代初期的先进超标量处理器中得到应用。
重命名分两个阶段引入。在第一阶段,重命名仅部分实现。这里,重命名仅限于一种或几种特定的数据类型。例如,Power1、Power2、PowerPC 601 和 Nx586 处理器使用部分重命名。
在这两个阶段中,IBM 是第一个引入重命名的供应商,最初是在其 Power 系列的 Power1 (RS/6000) 中,后来在其 ES/9000 系列的高端处理器中。IBM 继续在其基于 Power 的 PowerPC 系列中实施完全重命名,除了第一个型号 PowerPC 601。所有重要的超标量处理器供应商在其最新的型号中都引入了重命名,除了 DEC 的 α 系列和 Sun 的 UltraSparc。