现在的位置: 首页 > 综合 > 正文

《大话处理器》连载——微架构(15) 寄存器重命名

2018年05月07日 ⁄ 综合 ⁄ 共 793字 ⁄ 字号 评论关闭

        寄存器不能随便改名字,否则原来的数据依赖关系被打乱,会导致错误的执行结果,那么怎样才能既保留原先的数据依赖关系,又能将没有数据依赖性的指令的寄存器改名字呢?

这里介绍一种在处理器中经常实现的策略:

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寄存器,只需要访问物理寄存器。 

抱歉!评论已关闭.