超标量处理器之寄存器重命名(五)

五、寄存器重命名

1. 什么是寄存器重命名

   寄存器重命名是计算机CPU的微体系结构(Microarchitecture)中的一种技术,为的是消除程序的不同指令之间的相关性在指令并行执行过程产生的影响,提高了处理器的指令级并行的能力。首先介绍指令间的数据相关性。

  • Output dependence,又称为先写后写(Write After Write,WAW)相关性,表示两条指令都将结果写到同一个目的寄存器;
  • Anti-dependence,又称为先读后写(Write After Read,WAR)相关性,表示一条指令的目的寄存器和它前面的某条指令的源寄存器是一样的;
  • True dependence,又称为先写后读(Read After Write,RAW)相关性,表示一条指令的源寄存器来自于它前面的某条指令计算的结果。

   数据相关性的三种类型WAW,WAR和RAW,只有RAW是真的相关性,其他两种相关性都是和寄存器的名字有关的,可以通过寄存器重命名解决。

  • 更换寄存器解决WAW相关性
    在这里插入图片描述
    两指令写入相同的寄存器R1 ==> 改为写入不同寄存器即可。
  • 更换寄存器解决WAR相关性
    在这里插入图片描述
    一指令写入寄存器R2,另一指令又读取R2寄存器的原数据 ==> 改为一指令写入另一个寄存器即可。

   这两种假相关性主要是由于寄存器个数有限造成的,一个很明显的解决办法,那就是增加指令集中寄存器的个数,但是这样做会导致处理器无法再兼容以前的程序,而向前兼容是处理器能够成功的一个重要条件。
   所以,最好的解决办法就是使用硬件管理的寄存器重命名(Register Renaming),处理器中实际存在的寄存器(物理寄存器(Physical Register)) 个数要多于指令集中定义的通用寄存器(逻辑寄存器(Logical Register,或Architecture Register)) 的个数,因此寄存器重命名得以发挥作用。处理器在进行寄存器重命名的时候,会动态地将逻辑寄存器映射到物理寄存器,这样可以解决WAW和WAR的相关性。

2. 寄存器重命名的方式

   寄存器重命名(Register Renaming)只是提出了一个概念,具体的实现方式是有很多种的,概括起来,主要有三种方式可以实现。

  1. 将逻辑寄存器(Architecture Register File,ARF)扩展来实现寄存器重命名;
  2. 使用统一的物理寄存器(Physical Register File,PRF)来实现寄存器重命名;
  3. 使用ROB来实现寄存器重命名。

   这三种方法的本质都是要将指令集中定义的逻辑寄存器,在处理器的执行过程中,动态地映射到处理器内部实际使用的物理寄存器上,使用这些物理寄存器来代替逻辑寄存器。

1> 使用ROB进行寄存器重命名

   这种方法将重排序缓存(ROB)作为了物理寄存器,其中存储着所有推测状态(speculative)的结果,而使用ARF存储所有正确的结果,这种方法就相当于使用ROB对ARF进行了扩展。
   之所以可以这样做,是因为在超标量处理器中,每条指令都会将自身的信息按照程序中原始的顺序存储到ROB中,但是由于分支预测失数(misprediction)和异常(exception)等原因,存储的指令结果未必正确。只有当指令变为流水线中最旧的指令,并且被验证为正确的时候,才会离开ROB,并使用它的结果对处理器的状态进行更新。将结果写到ARF中,这种方式相当于将PRF和ROB集成到了一起。
   当一条指令被写到ROB中一个表项(entry)的同时,这个表项在ROB中的编号也就成为了这条指令的目的寄存器对应的PRF,PRF与ARF形成映射关系,记录在重命名映射表中,这样就将一个ARF和ROB中一个表项的编号建立了映射关系,完成了对一条指令的目的寄存器进行重命名的过程。
在这里插入图片描述
   只要ROB中有空闲的空间,寄存器重命名就可以一直进行,这种方式可以简化寄存器重命名的过程,带来的问题是,一个寄存器在其生命周期内会有两个存放的位置:ROB和ARF。例如指令1的目的寄存器为R1,退休后将结果写入了ARF,而指令2执行后目的寄存器同样为R1,退休之前结果存在ROB中。当需要访问R1寄存器时,就需要使用重命名映射表(mapping table)来指示R1寄存器的值是位于ROB中还是位于ARF中,如果一个逻辑寄存器的值还在ROB中,那么重命名映射表还会给出这个逻辑寄存器在ROB中所占用表项的编号。
在这里插入图片描述
   这种方式优点在于设计复杂度不高,使用固有的ROB结构与PRF相结合,再用重命名映射表记录ROB编号与ARF的映射关系,即可实现寄存器重命名。缺点在于:

  1. 每条指令都需要占用ROB中的一个表项(entry),也就对应一个PRF,即使其没有目的寄存器,不需要寄存器重命名,造成浪费。
  2. 对于一条指令来说,它既可以从ROB中读取源操作数,也可以从ARF中读取源操作数,所以ROB和ARF都要支持最坏的情况,也就是在一个周期内执行的所有指令都需要读取 ROB(或ARF),这样导致ROB和ARF的读端口都会非常多。

2> 将ARF扩展进行寄存器重命名

   这种方式是基于ROB进行重命名方法的延伸,针对ROB重命名方法中对PRF的浪费问题,使用一个独立的存储部件PRF来存储流水线中所有指令的结果,只有那些存在目的寄存器的指令才会占据这个存储部件当中的存储空间,它可以看作是ARF的扩展。
   这个PRF的地位和方法一中的ROB相同,每次指令被解码之后,存在目的寄存器的指令会占据PRF的一个表项,这个表项的编号就是对应的物理寄存器的编号。指令退休后结果写入ARF,则对应的PRF表项被释放。
   这种方式中,重命名映射表记录了每个逻辑寄存器的值是位于PRF中还是ARF中,一条指令在PRF中对应的地址需要存储到表中。
   优点在于可以节约PRF空间,但是一个逻辑寄存器的值在其生命周期内,仍然可能存在于PRF和ARF两个地方,因此仍然会对后面的指令使用这个寄存器作为源操作数的过程产生影响。
在这里插入图片描述

3> 使用统一的PRF进行寄存器重命名

   在这种方法中,将方法二使用的ARF和PRF进行了合并,合并之后的部件称为统一的PRF(Physical Register File),在其中存储了所有推测的(speculative)和正确的(retire) 的寄存器值。
   这个统一的PRF和之前的PRF不同,在这个PRF中,没有和指令产生映射关系的寄存器都是处于空闲(free)状态,使用一个空闲列表(free list)来记录这个PRF中哪些寄存器处于空闲状态。当一条指令被寄存器重命名,并且它存在目的寄存器的时候,它就会占据PRF当中的一个寄存器,这个寄存器就处于被占用的状态,处于这个状态的寄存器会经历值没有被计算出来,值被计算出来但是没有退休(retire)、退休这三个过程,在此过程中,并不需要将寄存器的内容进行搬移,这样便于后续的指令读取操作数,这种寄存器重命名的方法也需要一个重命名映射表,用来存储每个逻辑寄存器和物理寄存器的对应关系。
在这里插入图片描述
   一条指令在寄存器重命名的时候,需要对源寄存器和目的寄存器都进行处理,对于源寄存器来说,它会去查找重命名的映射表(mapping table,Intel将其称为RAT)找出对应的物理寄存器的编号。如果这条指令存在目的寄存器的话,需要从空闲列表(Free List)中读取一个空闲状态的物理寄存器,指令的目的寄存器会被重命名为该物理寄存器,同时这个新的对应关系会更新到RAT当中。
   当需要从外部查看处理器的状态时,很多的物理寄存器由于处在推测(speculative)的状态,是不能够被外部看到的,一条指令只有退休(retire)的时候,它的结果才会被外部看到。因此还需要另外一个RAT,用来存储所有“退休”状态的指令和物理寄存器的对应关系,外界通过查询这个RAT,就可以找到逻辑寄存器此时对应的物理寄存器。
   关于物理寄存器的释放问题,很显然,当一个物理寄存器不再被它后面的指令使用时,这个物理寄存器就可以变为空闲状态。如何判断这个物理寄存器不被后续指令使用?当一条指令和后面的某条指令都写到同一个目的寄存器时,则后面的指令退休的时候,前面指令对应的物理寄存器就已经没有用处了。
   例如:
   指令a和b都使用r1,重命名映射到不同物理寄存器p1和p6。当ab之间指令使用r1为源寄存器时,会使用映射的p1,此时r1–>p1的映射关系有效。而当b之后指令使用r1为源寄存器时,会使用映射的p6,此时r1–>p1的映射关系失效,因此p1可以成为空闲状态。因此释放空闲物理寄存器就需要记录失效的映射关系,这需要使用到ROB。
   在指令重命名之后,指令进入ROB和发射队列中,此时指令会把目的寄存器映射信息存入ROB,这样当指令执行完毕时,根据ROB的信息,指令就知道自己该把结果写进哪一个物理寄存器。除了记录逻辑寄存器当前对应的物理寄存器之外,还需要存储它之前对应的物理寄存器,以便于在指令退休的时候(例如指令(b)),将它对应的旧映射关系进行释放。
在这里插入图片描述
   这种方式需要更复杂的控制逻辑来管理重命名的过程,它需要使用一个表格(free list)来存储所有空间的物理寄存器的编号,同时还需要两个重命名映射表(RAT)配合才可以正常进行工作。其优点在于:
3. 指令结果只写入一次,不像前两种方法需要先写进物理寄存器,再写进逻辑寄存器,减少写入次数可以降低处理器功耗。
4. 一个源数据只能存在一个地方,这样减少了指令取源数据的复杂度,不像前两种方法都要从物理、逻辑寄存器堆中选择数据,这样做既可以减少取数经过的逻辑门级数,又可以减少电路连线,进而减少功耗,降低设计难度。

3. 重命名映射表

   重命名映射表RAT使用逻辑寄存器作为地址来进行寻址,对于指令的源寄存器来说,可以从这个表格得到对应的物理寄存器的编号;对指令的目的寄存器来说,会将物理寄存器的编号写到这个表格中。在具体的物理实现层面上,主要有两种方式,一是基于SRAM(SRAM-Based RAT,sRAT),二是基于CAM(CAM-Based RAT,eRAT)。

1. 基于SRAM的重命名映射表

   在基于SRAM的重命名映射表(sRAT)中,表项(entry)的个数等于处理器中逻辑寄存器的个数,每个表项中存放对应的物理寄存器的编号,使用逻辑寄存器的编号作为地址对sRAT进行寻址。当需要对分支指令的状态进行Checkpoint 保存时,需要将整个sRAT都保存起来,因此这种方法的每个Checkpoint会占用大量的面积,正是由于这种限制,不可能将Checkpoint的个数做得很多。
在这里插入图片描述
   基于SRAM的重命名映射表(sRAT)读写速度较快,设计复杂度也不会随着物理寄存器个数的增加而变大,缺点是无法对RAT使用个数比较多的Cheekpoint,因为每个Checkpoint都需要将sRAT复制一份。
   在超标量处理器中,随着并行度的增高,流水线中分支指令的个数也会增多,这与Checkpoint个数过少会产生矛盾,解决的办法是只对分支预测正确率低的分支指令进行Checkpoint,这基于当前普遍较高的分支预测正确率。而对于没有Checkpoint的分支指令,一旦预测错误了,就需要使用速度比较慢的方法对RAT进行恢复,由于这种频率比较低,对性能的负面影响不会太大。

2. 基于CAM的重命名映射表

   在基于CAM的重命名映射表(cRAT)中,使用了内容寻址的存储器(即CAM),其大小等于物理寄存器的个数,表项中存放的是逻辑寄存器的编号,虽然也是使用逻辑寄存器的编号寻址,却是将地址与每个表项的内容进行比较,以此得到对应的物理寄存器编号,这种寻址方式和全相连结构(fully—amnociative)的Cache相同。
在这里插入图片描述
   在任意时刻,每个逻辑寄存器都只有一个物理寄存器与之对应,这可以使用一个有效位(V)来表示,每次对cRAT进行Checkpoint,只需要保存这个有效位即可。因此这种方式可以将Checkpoint数量做到很大,这是CAM的主要优势。
   其实cRAT是由CAM+SRAM组成的,SRAM部分用来存储每个物理寄存器对应的逻辑寄存器的编号,而CAM部分用来进行内容的比较,每个表项的比较结果都会送到一个编码器(Encoder)中,编码器会结合每个表项是否有效(V)的信息,将最终匹配的那个物理寄存器的编号进行输出,这就是读取cRAT的过程。
在这里插入图片描述
   以有效位V作为Checkpoint的内容实现cRAT的状态保存和恢复的过程如下:对于这样一段代码,
在这里插入图片描述
   1> 在分支指令F进行寄存器重名的时候,需要对cRAT进行Checkpoint 保存,即
在这里插入图片描述
   由于指令F是分支指令,不包括目的寄存器,不需要占用cRAT的空间,而指令B、D、E都写同一个逻辑寄存器r7,因此当指令E被寄存器重命名之后,物理寄存器p14和逻辑寄存器r7就是最新的对应关系,其他两条指令B和D对应的映射关系应该变为无效,有效位置0,对cRAT进行状态保存的时候,指令A~E对应的有效位10101就会被写到GC0中。
   2> 在指令G、H被寄存器重命名之后,分支指令F被发现分支预测失败,在对cRAT进行状态恢复之前,cRAT的状态为
在这里插入图片描述
   3> 分支指令F在预测失败时进行状态恢复,会将GC0的内容写回到cRAT的有效位(V)区域,此时就可以将cRAT恢复到分支指令F进行寄存器重命名之前的状态。
   对于具有多条分支指令的情况,cRAT状态保存和恢复过程同理,如果分支指令预测正确,对应的GC空间释放,如果预测失败,则将对应GC空间的内容写入cRAT中。
   基于CAM方式来实现的重命名映射表,一个最大的弊端就是其面积会随看处理器中物理寄存器个数的增加而变大,随着处理器并行度的增加(或许还伴随看流水线的加深),需要更多的物理寄存器来适应这样的趋势。优点在于在对cRAT进行状态保存的时候,只需要保存它的有效位(V)就可以了,这样大大降低了对硬件的需求,尤其是现代处理器中,会有更多的分支指令存在于流水线当中,这就需要更多的Checkpoint与之配合。

4. 超标量处理器的寄存器重命名

   一条指令的寄存器重命名过程大致有如下步骤,以Dest = Src1 op Src2这样的指令为例。
   1> 从重命名映射表(RAT)中找到Src1和Src2对应的物理寄存器Psrc1和Psrc2。
在这里插入图片描述
   2> 从空闲列表(free list)中找到一个空闲的物理寄存器Pdest,将其作为指令的目的寄存器Dest对应的物理寄存器。
在这里插入图片描述
   3> 将逻辑寄存器Dest和物理寄存器Pdest的映射关系写到重命名映射表(RAT)。
在这里插入图片描述
   经过上面的三步之后,就完成了对一条指令的寄存器重命名的过程(假设采用统一的PRF进行寄存器重命名),每条指令都会重复上述的过程。一条指令需要三个读端口(读两个源寄存器和以目的寄存器寻址读其对应的旧的映射关系,用于释放物理寄存器)和一个写端口(写目的寄存器对应的新的映射关系)。对于一条指令进行寄存器重命名的过程是比较简单的,但是对于每周期执行多条指令,RAT需要同时支持多个读写端口
   此外,每个周期对多条指令进行重命名,还会带来WAW、RAW、WAR(不影响)相关性问题,考虑WAW、RAW相关性问题又增加了重命名过程的复杂度。在超标量处理器中,重命名阶段的延迟主要来自于两个方面,一个是多端口SRAM本身的延迟,另一个就是RAW和WAW相关性检查和处理电路引起的延迟。相关性问题处理方法,在此暂不阐述。

5. 寄存器重命名过程的恢复

   由于分支预测失败(mis—prediction)或者异常(exception)等原因,所有处于流水线中的指令都处于推测(speculative)状态,这些指令在联利地离开流水线之前(也就是退休之前)都有可能从流水线中被抹掉,但是,如果被抹掉的指令已经经过了寄存器重命名阶段,那么这条指令已经占据了重命名映射表(RAT)、重排序缓存(ROB)和发射队列(Issue Queue)等资源,当指令从流水线中被抹掉时,被这条指令占用的资源需要进行恢复,这样才能够保证后续的指令可以在一个正确的流水线中开始执行,这个过程就是对寄存器重命名的恢复。有三种三种典型的方法:

  1. 使用Checkpoint对RAT进行恢复:利用Checkpoint保存的正确信息恢复RAT。
  2. 使用WALK对RAT 进行恢复;利用ROB中保存的正确信息恢复RAT。
  3. 使用Architecture State对RAT 进行恢复:在基于统一的PRF进行寄存器重命名的方法中,在流水线的提交(Commit)阶段也使用一个RAT(aRAT),记录离开流水线指令的正确信息,以此恢复RAT。

参考资料:
《超标量处理器设计》——姚永斌

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
超标处理器设计》讲述超标(SuperScalar)处理器的设计,现代的高性能处理器都采用了超标结构,大至服务器和高性能PC的处理器,小至平板电脑和智能手机的处理器,无一例外。《超标处理器设计》以超标处理器的流水线为主线展开内容介绍。《超标处理器设计》主要内容包括超标处理器的背景知识、流水线、顺序执行和乱序执行两种方式的特点;Cache的一般性原理、提高Cache性能的方法以及超标处理器中的Cache,尤其是多端口的Cache;虚拟存储器的基础知识、页表、TLB和Cache加入流水线后的工作流程;分支预测的一般性原理、在超标处理器中使用分支预测时遇到的问题和解决方法以及如何在分支预测失败时对处理器的状态进行恢复;一般的RISC指令集体系的简单介绍;指令解码的过程,尤其是超标处理器中的指令解码;寄存器重命名的一般性原理、重命名的方式、超标处理器中使用寄存器重命名时遇到的问题和解决方法以及如何对寄存器重命名的过程实现状态恢复;指令的分发(Dispatch)和发射(Issue)、发射过程中的流水线、选择电路和唤醒电路的实现过程;处理器中使用的基本运算单元、旁路网络、Cluster结构以及如何对Load/Store指令的执行过程进行加速;重排序缓存(ROB)、处理器状态的管理以及超标处理器中对异常的处理过程;经典的Alpha21264处理器的介绍。在本书中使用了一些现实世界的超标处理器作为例子,以便于读者加深对超标处理器的理解和认识。 《超标处理器设计》可用作高等院校电子及计算机专业研究生和高年级本科生教材,也可供自学者阅读。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值