寄存器重命名技术在乱序执行流水线中有两个作用。一是消除指令之间的寄存器读后写相关(WAR),和写后写相关(WAW);二是当指令执行发生例外或转移指令猜测错误而取消后面的指令时可以保证现场的精确。
寄存器重命名的思路很简单:就是当一条指令写一个结果寄存器时不直接写到这个结果寄存器,而是先写到一个中间寄存器过渡一下,当这条指令提交的时候再写到结果寄存器中。
指令重命名有两种方法:软件重命名和硬件重命名方法。
- 软件寄存器重命名方法 是在编译的过程中消除指令集的数据相关的方法:
例如,具体示例如下,Addy 摘自胡老总《计算机体系结构》(相同颜色为 寄存器相关):
通过软件方法,在编译过程中将寄存器相关的部分,通过软件寄存器重命名的方法解决部分寄存器相关,增大了指令间的并行性。
如下图所示为 软件修改结果。
- 硬件寄存器重命名方法 大致可以分成两种,一是把重命名寄存器和结构寄存器分开;二是不把重命名寄存器和结构寄存器分开。
重命名寄存器(程序员不可见微结构寄存器)和结构寄存器(程序员可见寄存器)。
? 重命名寄存器的状态
EMPTY:表示该寄存器没有被重命名(重命名后又已经被释放)。
MAPPED:表示已经被重命名但结果没有写回。
WRITEBACK:表示结果已经写回重命名寄存器但没有Commit到结构寄存器。
? 结构寄存器的状态
VALID:表示相应寄存器的值可用。
INVALID:表示相应寄存器的值不可用。
? 映射关系
可以在结构寄存器中增加一个指向重命名寄存器的重命名寄存器号域。
? 核心是重命名表
可以用CAM或RAM的方法,以CAM的方法为例。
项数与物理寄存器一样。
主要包括三个域:
name:相应的逻辑寄存器号。
state:状态,EMPTY:表示该寄存器没有被重命名(重命名后又已经被释放);MAPPED:表示已经被重命名但结果没有写回;WRITEBACK:表示结果已经写回重命名寄存器但没有Commit到结构寄存器;COMMIT:表示结果已经被确认。
valid:在一个逻辑寄存器对应多个物理寄存器的情况下表示最新映。