寄存器重命名(Register Rename)
-
重命名缓存类型(Rename Buffer Type)
-
merged architectural and rename register file
每个物理寄存器处于4状态中的一个,4个状态如下:
available: uncommitted state
AR(architectural register): 作为指令集寄存器
RB(rename buffer), not valid: 作为RB,但是寄存器不包含指令返回的结果。
RB, valid: 作为RB,寄存器包含指令返回的结果。
初始化时,前n个物理寄存器被分配成AR状态。n为指令集中定义的寄存器个数。剩余的寄存器处于avaliable状态。
当一条包含目的寄存器的指令被发射时,需要从avaliable的寄存器中分配一个物理寄存器。相应地,它的状态被设置成“RB, not valid”,valid bit被清除。等到相应的指令执行完,结果写进分配好的rename buffer中。这时valid bit被置1,状态转到“RB,valid”。接着,当该指令执行完时,被分配的rename buffer将进入AR状态。最后,当旧的AR回收时,被置成Available状态。
如果指令发生错误(faulty)或者异常(exception),未完成的指令必须被取消。已经被分配的rename buffer处于RB,valid或者RB,not valid的状态将变成available状态。另外,相应的映射表或者rename buffer也将被取消。
相比于其他类型,merged模式不需要AR和RB之间的数据传输。 -
stand-alone rename register
Rename buffer可以和指令集buffer分开。指令执行完需要有从RB到AR的回写。 -
keeping renamed values in ROB
ROB(reorder buffer)是用来暂存已经发射的指令,确保指令顺序执行的循环buffer。每个ROB的entry都存放正在执行的指令,当然可以扩充一个位域用来存放返回结果。ROB也可以进一步扩展作为终于暂存站(central shelving buffer)。 -
keeping renamed values in shelving buffers
Rename Buffer也可以用指令缓存区来实现。这样做有个明显的缺点,就是指令缓存在指令分发出去时就可以回收,而RB必须等到指令执行完才可以回收。
-
-
拆分rename 寄存器
前面为了简单起见,统一叫AR。在实际cpu中,定点的寄存器和浮点的寄存器往往是分开存放的。但是无论定点指令还是浮点指令都统一存放在一个ROB中,因此ROB要有足够的深度来保持定点和浮点的数据。 -
RB的数量
RB保存寄存器结果直到指令完成。考虑到并非所有指令都是寄存器指令。因此,正在执行的尚未完成的最大指令数是我们需要的RB数量。这些尚未执行完的指令包括:- 放在暂存架上尚未执行的指令
- 在执行单元中的指令
- 在load queue中的等待cache访问的指令
- 在store queue中的等待结束的指令
因此最大未完成指令数为:
npmax = wdw + nEU + nLq + nSq
wdw:暂存架深度
nEU:并行执行单元个数
nLq:load queue的深度
nSq:store queue的深度
假设最差情况,RB个数需要:
nrmax = wdw + nEU + nLq
store指令不需要RB。
如果CPU中用了ROB,那么ROB的深度和npwax一样。
如果设计中ROB个数或者RB的个数少于上面的公式,在最差情况下,有可能造成因资源不足而导致的阻塞,对性能有一些影响。典型的场景中,满足如下公式:
wdw < nr < nROB
-
读写端口数
读写端口数是在一个周期内,根据操作数的个数决定的。这还跟操作数获取策略(Operand fetch policies)有关。策略分为发射获取(issue-bound fetch)和分发获取(dispatch-bound fetch)两种。如果是发射获取,那么操作数在存入暂存站时就把寄存器也同时存入暂存站,而分发获取则在暂存站只保留寄存器号,等到分发时才读取寄存器。发射获取模式下,寄存器读写端口跟发射数有关。比如4发射,定点指令如果最多有3个操作数,那么需要12个读4个写端口。分发获取则考虑执行单元的并发数。 -
寄存器映射方法(Register mapping methods)
在寄存器重命名期间,处理器需要分配物理寄存器,同时在指令结束前,跟踪架构寄存器到物理寄存器的映射关系。因此重命名包括三个组件:- 重命名buffer的分配
- 映射关系的跟踪方法
- 重命名buffer的回收
因为寄存器只有在指令发射时才会用到,因此在发射之前重命名会浪费RB的空间。
跟踪寄存器映射关系通常有两类方法。一是构造映射表。表的深度为架构寄存器的数量,根据架构寄存器索引物理寄存器。另一类是物理寄存器上增加一些标识,来记录映射关系。
a是映射关系表。b是在物理寄存器上扩展出5个位域。
Entry valid: 表示改物理寄存器已经分配了。
Dest register no: 表示架构寄存器号。
Lastest bit:在重复重命名时会出现多个有效表示,last表示最后一次分配。
Value: 寄存器的值
Value valid: 寄存器值是否有效,当指令执行完并返回结果时,有效位置1.
-
重命名率
重命名率是指在一个周期内,处理器可以操作的最多的重命名数量。重命名率应该等于发射率(issue rate)。但是实现高的重命名率并不容易。首先分析指令之间的依赖关系将变得复杂,其次需要更多的寄存器读写端口。 -
可能的实现
-
应用实践
从Free list里按顺序找到可用的物理寄存器,写到rename table中,同时在ROB中跟踪映射关系。
参考文献:The Design Space of Register Renaming Techniques, Sima, IEEE 2000.