处理器指令编码可重定义的方法_大金哥的超标量处理器学习笔记之7——寄存器重命名...

程序的不同指令间存在很多相关性,可分为:

寄存器数据相关性,包括先写后写WAW、先读后写WAR和先写后读RAW,与寄存器直接相关,在解码时得到寄存器名字即可解决这些相关性,是本章重点;

存储器数据相关性,也可分为WAW、WAR和RAW,这种相关性的解决方法在后续章节介绍;

控制相关性,由分支引发的相关性,用分支预测可解决,前文已讲述;

结构相关性,如需要发射队列或ROB有剩余空间,或者FU的计算资源空闲。

数据相关性中只要RAW是真相关,WAW、WAR都是由乱序引发的假相关,可通过更换寄存器名字解决,这主要是由于通用寄存器有限、循环体(总是向同一寄存器写值)、代码重用(重复调用某函数)造成的。由于指令编码空间以及向前兼容的问题,不能增加通用寄存器个数,因此使用硬件管理的重命名在处理器内部重新定义物理寄存器(PR),指令集中的寄存器被称为逻辑寄存器(LR),PR在处理器中实际存在(LR实际中不一定存在,后文会讲述)。处理器会动态将LR映射到PR解决WAW和WAR相关性的问题,如图99,通过重命名映射表(基于SRAM或CAM)和空闲寄存器列表来完成寄存器重命名的过程。

本章首先介绍寄存器重命名和重命名映射表的实现方式,然后介绍超标量处理器重命名过程对各类数据相关性的处理过程,最后叙述重命名过程的部件因分支预测失败或异常而进行恢复的机制。

44915eba55029e246a3d6af2473568f4.png
图 99 使用寄存器重命名解决WAW和WAR相关性

7.1. 寄存器重命名的方式

实现寄存器重命名有以下几种方式:

使用ROB;

将LRF扩展;

使用统一的PRF;

Intel采用第1种,MIPS采用第3种,本质都是将LR动态映射到PR,需考虑以下问题:

什么时候占用PR,该PR来自哪里?

什么时候释放PR,该PR去向何处?

发生分支预测失败时怎么处理?

发生异常时怎么处理?

解决以上问题就完成了寄存器重命名,下面分别介绍本节开始提到的三种重命名寄存器方式的实现过程。

7.1.1. 使用ROB进行寄存器重命名

将ROB作为PR存储推测结果(可能分支预测失败),LR存储正确结果,只要当指令退休前,ROB中的结果才会写入LRF(又称architecture register file,ARF),如图100,当指令写入ROB的表项时,该表项编号即为目的寄存器对应的PR。注意可能流水线后序指令中还存在着目的寄存器相同的指令,这样即使指令刚退休相应AR中的结果都不一定是最新结果,所以还需要重命名映射表来指示每个AR的最新值是位于ROB还是ARF中,如图101。

e5dc94a0a2475a2dd238c8b3552faa4c.png
图 100 将PRF和ROB集成,进行寄存器重命名

2f5e47bf9197b42c94c46cac4d7e7147.png
图 101 基于ROB对寄存器重命名

寄存器映射表中存储着寄存器的ARF编号或所对应ROB中的表项编号,这对指令操作数的读取会造成负面影响,在实际处理器中会配合数据捕捉的发射方式,并采用payload RAM来存储所需要操作数,具体内容后文会介绍。

基于ROB进行寄存器重命名的方式虽便于管理,但存在两个缺点:

很多指令无目的寄存器但所占表项无法拿掉所对应PR;

考虑最坏情况,一个周期执行的所有指令都需读取ROB或ARF,导致读端口非常多,对面积和延迟都会有很大影响。总体说来这种重命名方式易于实现,Intel在基于P6架构如Pentium系列的处理器采用了这种方式。

7.1.2. 将ARF扩展实现寄存器重命名

使用PRF(可看做ARF的扩展)来存储流水线所有带目的寄存器指令的结果,每次指令解码后存在目的寄存器的指令会占据PRF一个表项,指令退休了将其转移到PRF释放PRF对应空间,因此PRF本质上也可以用FIFO实现,跟ROB一样。如果PRF中没有空间,则重命名寄存器之前的流水段都需要暂停,这种方式也需要重命名映射表在其中记录了每个AR的最新值在PRF还是ARF中,如图102。

126aabb21668960b472bc9ffc904f227.png
图 102 将ARF扩展进行寄存器重命名

7.1.3. 使用统一的PRF进行寄存器重命名

将上一种方法使用的ARF和PRF进行合并,合并的部件被称为统一的PRF,其中存储了所有推测的和正确的寄存器值,在这个PRF中没有和指令产生映射关系的寄存器都处于空闲状态,并用一个free list来记录哪些指令处于空闲状态,当一条指令被进行寄存器重命名时且存在目的寄存器时就会占据PRF中的一个寄存器,该寄存器会经历值未被计算出来、值被计算出但指令未退休、指令退休三个状态,此过程不需要搬移寄存器内容以便于后续指令读取操作数。该方法也需要一个重命名映射表存储AR和PR的对应关系,如图103,空闲列表可用FIFO实现,所有空闲状态的PR编号都会存于其中,该FIFO需要通过交叠的方式实现多端口。

6cd14377128fb9eb64da9c74a11f3195.png
图 103 使用统一的PRF进行寄存器重命名

指令进行寄存器重命名时需要对源和目的寄存器都进行处理,对于源寄存器,会去查找映射表(mapping table,Intel称其为RAT)找出对应PR编号,同时如果存在目的寄存器则需要从空闲列表中读取一个PR编号与该目的寄存器建立映射关系并写入RAT。如果空闲列表已空则流水线需要暂停等待直至有指令退休而释放PRF。

当外部查看处理器状态时只有当指令退休时所对应目的寄存器结果才能被看到,所以还需要另外一个RAT来存储所有退休状态指令与PR对应关系,每当指令退休时将映射关系写入这个RAT,外界通过查询这个RAT找到AR此时对应的PR。

只有当最后一条使用某PR的指令退休该PR才可变为空闲状态,但是只有编译器比较容易能够识别出最后一条使用某PR的指令,处理器需要采用一种很保守的方法,如图104,当一条指令和后面某条指令都写到同一寄存器,则后面指令退休时,前面指令所对应PR就没有用处了,对于指令b,p6才是它的目的寄存器,而p1所对应PR此时可以被释放。为实现该功能,ROB(注意不是RAT)中除了记录当前AR所对应PR还要存储它之前对应的PR,以便在指令退休时对旧映射关系进行释放。

d8b65d3e0f8ba4e08e9171db3f1cb21f.png
图 104 当指令退休时,可将其对应的旧映射关系进行释放

7.1.4. 小结

基于ROB的重命名最简单,不需要管哪些PR是可以使用的,在指令被写到ROB时就完成了寄存器重命名过程,对于将ARF扩展的方法,需要将PRF按照FIFO的方式管理,跟基于ROB方法类似;而是用统一的PRF,需要free list存储空闲PR编号,还需要两个RAT配合,不过该方法有以下两个优势:

寄存器的值只用写入一次,而另外两种方法第一次写入ROB或PRF,第二次写入ARF,因此这种方法功耗占优;

该方法某指令的源寄存器只存于PRF,而另外两种存于ARF或ROB/PRF,当结果需要搬运到ARF需要通知流水线所有将该寄存器作为操作数的指令,增加连线数量和复杂度。

现代处理器如MIPS R10000、Alpha 21264以及Pentium4均采用第三种方法进行寄存器重命名。

7.2. 重命名映射表

指令在寄存器重命名时,源寄存器通过查找RAT确定对应的PR,目的寄存器则需要分配PR并将映射关系写入RAT,这个表格可基于SRAM或寄存器(sRAT)和基于内容寻址存储器CAM(cRAT)实现,如图105,AR地址位5位,PR地址为6位。使用AR地址对sRAT进行寻址,故共有32个表项。cRAT将AR地址作为内容进行寻址,故其大小等于PR的个数,但速度慢于sRAT而且所占据的存储空间更大,但现实中仍有很多处理器使用cRAT,因为进行checkpoint时只需保存状态位,但sRAT则需要全部保存,但checkpoint个数超过一定值,cRAT就比较有优势,而现代处理器的深流水线和高并行度都需要更多的checkpoint,因此IBM用于服务器的POWER系列处理器均采用了cRAT。具体选择哪种RAT需要根据处理器功耗、面积和性能方面的要求综合考虑之后才能决定。

ff5dc2f075173dc88ae9e18252c20760.png
图 105 RAT的两种物理实现方法

7.2.1. sRAT

任意时刻sRAT中每个AR都只有一个PR与之对应,因此不需要标志位,但需要对分支指令状态进行checkpoint保存时需要将整个sRAT保存,因此每个checkpoint个数不能做得很多,如MIPS R10000处理器中就使用了sRAT,只对分支指令使用了四个checkpoint,就是最多允许4条分支存在于流水线中,对于4-way超标量处理,sRAT需要8个读端口和4个写端口,此外还需要free list,新写入的sRAT会覆盖原来旧的对应关系,但原来的信息不能就这样丢失,原因如下:

指令在退休时会将其之前的对应的物理寄存器变为空闲状态,因此当一个PR编号写入sRAT之前需要将其覆盖的信息保存在ROB中,ROB中记录AR对应的新旧物理寄存器(那为何还需要RAT?),关于ROB后文会详细介绍;

当指令处于分支预测失败或异常路径,需要抹掉,这条指令对RAT的修改也应被恢复,将旧映射关系保存,可协助RAT完成修复过程。

使用sRAT最大的限制就是不能使用较多的checkpoint,在超标量处理器中大量使用了预测算法,如分支预测、load/store相关性预测、数值预测等,同样我们也可以对分支预测的正确度进行预测,对分支预测正确率很高的指令(有规律)就不进行checkpoint保存,对于经常分支预测失败的指令(无规律或难以发现的规律)使用checkpoint保存,但如果一旦预测失误就需要使用速度比较慢的方法对RAT进行恢复,后文会对这些方法进行介绍,但这种情况一般发生的频率较低。

7.2.2. cRAT

寻址方式跟全相联cache一样,根据AR的地址对cRAT进行内容寻址,注意每个AR在cRAT中只有一个有效的PR与之对应。每次对cRAT进行checkpoint,也只需要保存有效位,所以可把checkpoint个数做得很大,如Alpha21264采用cRAT,包括了80个checkpoint,即最大允许80个分支同时存在于流水线,事实上这个处理器为流水线的每条指令都使用了1个checkpoint,这样任何指令发生异常都能快速恢复,这是使用cRAT最大的优势。

对于写cRAT来说,不需要按内容寻址,可以将其看做普通处理器将PR编号作为地址即可,实际上cRAT是由CAM+SRAM组成的,如图106,SRAM部分用来存放每个PR对应AR的编号,CAM部分用来进行内容比较,每个表项的比较结果都会送进编码器,结合有效位将匹配的PR输出,写操作时直接使用PR的编号作为地址写入SRAM部分。

仍然需要free list记录空闲PR编号,同样需要等到后面写入同一个AR的指令退休才能释放相应的PR,所以在cRAT中,表项有效位为0不一定表示PR空闲,可能表示之前的映射关系刚刚覆盖(和空闲的区别?)。对PR何时变为空闲状态进行管理,需要使用ROB与free list配合(怎么配合?),不需要cRAT参与。

f37120eaa251383402bd1358f0730f5c.png
图 106 使用CAM+SRAM组成cRAT

当分支预测失败时只需将这条分支对应的checkpoint写回cRAT的有效位就可完成对cRAT的恢复。需要注意,PR对应的有效位为0也不能表示它已经变成了空闲状态,有可能只是它的映射关系刚被覆盖,当此时进行checkpoint保存即保存这个状态,而如果经过一段时间需要对这个checkpoint进行恢复时,这个PR可能已经变为空闲状态,也就是此时状态恢复的内容和保存之时已经不一样了,不过这不会引发错误因为有效位依然被恢复成0。

下面通过一个例子讲述cRAT状态保存和恢复过程,考虑以下汇编代码:

b697330f9f304c18952332eeba0f8713.png

1)当分支指令F进行寄存器重命名时,需要对cRAT进行checkpoint保存,cRAT表的内容如表7,F无目的寄存器不占用空间。

ac99e36175e67d5f71cad1d8f5355e55.png
表 7 分支指令F进行寄存器重命名时cRAT表的内容

2)当G、H重命名后,F发生分支预测失败,恢复前,cRAT表内容如表8,指令B所占据表项可能已变为空闲状态或又写入新的指令,但使用GC0(global checkpoint)进行状态恢复后,指令B所在有效位被恢复成0,至于这个表项对应的PR是否处于空闲状态需要查看free list(该list应该也需要恢复?)。如果某个表项的有效位一直为1,那么将被一直占据直到出现目的寄存器与之相同的指令。

703d100d26ce6eb1291e8f8f4fbf96a2.png
表 8 指令A-H被寄存器重命名后,cRAT的内容

如果需要多个checkpoint,则需要对其编号,每次在重命名阶段遇到分支指令就需要找出一个空闲的GC(是否需要free list?)来存储此时的有效位,并将该GC编号放到分支指令的信息中,如果后面确定分支预测正确(分支退休的时候判断?)则释放对应的GC,如果失败将其写入有效位后再进行释放,以两条分支为例,汇编程序如下:

cd567f643a9e466beab38fc0f648d716.png

1)当第一条分支指令D进行寄存器重命名时,将状态位保存到GC0中,此时cRAT的内容如表9。

64c745137731f0ad635a0d0d1f7545a1.png
表 9 第一条分支指令D进行寄存器重命名时,cRAT的内容

2)当第二条分支指令G进行寄存器重命名时,假设分支D还没得到结果,则需要将状态位保存到CG1中,此时cRAT的内容如表10。

3)当所有指令完成寄存器重命名时,cRAT的内容如表11。如果此时发现D分支预测错误,需要使用GC0进行状态恢复,还需要通过恢复读指针对free list进行状态恢复,那些被占用的物理寄存器都重新变为空闲状态,而且采用了顺序执行的分支架构,其他GC(GC0之后的?)也都会被释放。从上面描述可以看出,对cRAT进行状态恢复就是要还原AR真正对应的PR,但cRAT不管理哪些PR是空闲状态,这个功能通过ROB(为什么需要通过ROB?使用checkpoint应该就不需要ROB中的旧映射关系)和free list实现。

使用cRAT最大弊端就是面积随PR的个数增大而增大,比较电路也会增加,速度变慢,但进行checkpoint保存时只需保证有效位,设计时需仔细权衡。

a4015ee4a61bfa8e850291ec53ca9b46.png
表 10 第二条分支指令G进行寄存器重命名时,cRAT的内容

f7131ec872d1e45482bbb9e9293cd4ff.png
表 11 分支A-J都完成寄存器重命名时,cRAT的内容

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

首先通过一条指令的寄存器重命名进行一个梳理,对于Dest=src1 op src2,寄存器重命名过程如下:

1)从RAT中找到对应的物理寄存器psrc1和psrc2;

2)从空闲列表找到空闲的pdest与目的寄存器进行映射;

3)将映射关系写入RAT。

即完成重命名过程。为了将PR能释放为空闲状态,还需要将目的寄存器之前对应的映射关系写入ROB,因此RAT需额外增加一个读端口,使用指令的目的寄存器作为地址读出之前的映射关系,因此RAT需要三个读端口(分别使用src1、src2和dest作为地址)和一个写端口(使用dest作为地址,将空闲列表送出的值作为数据)。

但对于4-way的超标量处理器,RAT就需要12个读端口和4个写端口,如图107,此外还需要考虑每个周期进行重命名的多条指令间存在的相关性,这对重命名过程影响也很大,如图108,同时存在WAW、RAW、WAR三种相关性,具体如下:

1)AB存在RAW相关,指令B的r0对应PR直接来指令A所对应的P30,而不是从RAT中读取的值;

2)ABD存在WAW相关,虽然似乎可通过重命名解决这个问题,但仍然需要在重命名阶段检查这个相关性,原因如下:

如果一个周期进行重命名的多条指令间存在同一目的寄存器,则只需要讲最新指令的映射关系写入RAT;

b35c4eab16529f0e36709e053cd0369a.png
图 107 一个4-way超标量处理器中的RAT

4fa6effd84dc689fe93f796491631568.png
图 108 每周期进行重命名的四条指令间存在的各种相关性

将每条指令的旧映射关系写到ROB时,如果发现同一周期使用同一目的寄存器,则需要写入ROB旧映射关系不是来自RAT而是来自和它存在WAW相关的指令。

3)BD存在WAR相关性,通过重命名可以消除。

所以在超标量处理器的重命名过程中需要检查RAW和WAW(WAR不需要)这两种相关性,因此会导致延迟增加,再加上多端口延时所以重命名阶段对周期影响很大,可考虑通过两周期流水线实现重命名过程,但这样会增加RAW和WAW相关性检查的复杂度,因为不仅需要检查当前周期指令间的相关性还需要检查与上一个周期的指令之间存在的相关性。

7.3.1. 解决RAW相关性

如果不存在RAW或WAW相关性,重命名过程非常简单,如图109,所有指令的源寄存器都从RAT中找到对应的PR,目的寄存器也会从RAT找到之前的映射关系(写入ROB以便退休时释放这些关系),同时从空闲列表读出4个空闲的PR编号,建立新的映射关系写入RAT。当同周期多条指令间存在RAW相关性时,像之前的方式重命名就会出现问题,如图110,指令3所使用的源寄存器R1应来自P31。所以需要对同周期指令间进行RAW的相关性检查,这种检查被称为组内相关性检查。

c7fbfc4b194f5944f261bc6acc67cff5.png
图 109 对不存在RAW或WAW相关的同周期指令进行重命名

bfedf5217bb2b50f937cabe9a7f1df97.png
图 110 同周期指令间存在RAW遇到的问题

寄存器重命名阶段指令还是在顺序执行,因此只需要将指令的源寄存器与前面所有目的寄存器编号进行比较,若存在相等项则这个源寄存器所对应PR就不是来自RAT而是来自当前周期空闲列表输出的对应值,如存在多个相等项则使用最新指令所对应PR,检查过程如图111。组内相关性检查与访问RAT是并行工作的因此不会对处理器周期造成负面影响。除第一条指令外的所有指令的源寄存器都需要进行相关性检查,该电路的实现方法如图112。

5514ec47faa45dcb83fed3fa4a7c3acc.png
图 111 对RAW相关性检查的电路图

51590a8db0bca92509ddc1bf221679fc.png
图 112 组内相关性检查电路

7.3.2. 解决WAW相关性

虽然寄存器重命名可消除WAW相关性,但前文已提及这种相关性影响了RAT和ROB的写入过程,因此在重命名阶段需要进行WAW相关性检查,对于RAT和ROB处理过程不一样需要区别对待。

1)对写RAT进行检查

多条指令相等只将最新指令的映射关系写入RAT,所以需要进行WAW检查,对于每条指令,都需要与其后面的指令目的寄存器比较,如果存在相等的情况就不应写入RAT,如图113。

23c4e90a603fdcdd63a96cb6a140b85a.png
图 113 对于写RAT的WAW相关性检查

2)对写ROB进行检查

前文提过,为了能释放PR以及对处理器进行状态恢复(当sRAT没有保存某些分支的checkpoint时需要?)每条指令需要从RAT中读出该目的寄存器之前对应的PR将其写入ROB,如果同周期存在相同目的寄存器的指令那么比较新的这条指令对应的旧的PR就直接来自于旧的指令而不是RAT,如图114。

7899de6787a107c1a2b7366d0af163d3.png
图 114 存在WAW相关性的四条指令

为了实现这个功能需要进行WAW相关性检查,每条指令都需要和它旧的指令进行目的寄存器比较,以确定写入ROB的映射关系是来自于RAT还是空闲列表,如图115。

349383f8ea47cbaea0f84dbf583a6106.png
图 115 对于写ROB进行WAW相关性检查

7.3.3. 解决其他问题

寄存器重命名阶段需要使用源寄存器和目的寄存器读取RAT,也需要使用目的寄存器将空闲列表的输出写入RAT,这其中出现多端口SRAM的读地址和写地址相同的问题,根据前文所述,使用目的寄存器读取RAT的过程应该先完成,然后才能写入新的映射关系。当然在这个周期源寄存器和目的寄存器也可能存在相等的情况,实际上在多端口的SRAM中都有成熟的方法解决这个问题,如图116。写优先模式中,写入到SRAM中某个地址内容在写入完成后就可以读到当前周期写到的内容而在读优先模式写入的内容在下个周期才能读取(代码如何具体实现?)。

对于RAT来说需要选择读优先模式,如果同周期指令间存在RAW相关性,即某指令的目的寄存器与另外指令的源寄存器相同似乎又不能采用读优先模式,但这种RAW相关性前文已经解决过,不需要只通过RAT来解决。

29de31dc2fe47cfac6ea4edc8b6d4ce3.png
图 116 解决读写地址冲突的两种模式

以上讲的寄存器重命名过程有一个前提即假设该周期正好可对4条指令重命名,且每条指令都包含2个源寄存器和1个目的寄存器,而实际上并非如此如有点指令无目的寄存器有的操作数为立即数,这些情况需要在指令解码后加以标记,做法如下:

1)根据当前周期所需目的寄存器个数决定从空闲列表读取数值个数;

2)使用目的寄存器读取RAT时,根据标记信息目的寄存器不存在的指令既不会读RAT也不会写RAT;

3)使用源寄存器读取RAT,根据标记信息源寄存器不存在的指令不会读取RAT或忽略从RAT中读出的结果‘;

4)重命名阶段进行RAW和WAW相关性检查时,如果源或目的寄存器不存在则直接忽略掉和它相关的比较结果。

7.4. 重命名过程的恢复

由于分支预测失败或异常,如果被抹掉指令已经过重命名阶段,那么这些指令就已占据RAT、ROB和发射队列等资源,第4章已介绍对ROB和发射队列的恢复,本节将介绍对RAT的恢复过程。本节将介绍3种典型的恢复方法,它们对本章第1节中提到的三种寄存器重命名的方式均适用。

7.4.1. 使用Checkpoint

处理器中checkpoint是在某个时间点把某些部件内容原封不动保存,注意需要在一个周期内保存和恢复。对于正在工作的部件,可将整个内容放任意一个GC,且恢复时也可从任意一个GC读取数据,那么称这种方式为随机访问的GC。如果状态保存时,需要经过逐个移位才能放放到指定GC,则为串行访问的GC,如图117。

8c393124e7f2a1e0141d1cdc3a94f851.png
图 117 SAGC和RAGC工作原理

对于SAGC只有一个GC和工作部件相连,部件不需要很大驱动能力,但如果要访问的GC较远则需要通过多次移位实现(具体怎么实现?),造成过长的状态恢复时间。对于RAGC,每个GC与工作部件相连,对GC的访问一个周期就能完成,但需要buffer为工作部件提供驱动能力,考虑到checkpoint目的是快速保存和恢复有些部件,因此RAGC更为合适。

对于RAT而言,不考虑checkpoint即为多端口SRAM,实现checkpoint功能后,SRAM最小存储单元MBC周围都加入同样的存储单元CBC(allocation)。进行保存时将MBC内容复制进CBC,状态恢复时则相反(restore),这种带有checkpoint功能的MBC如图118。CBC只需要一个读端口和一个写端口,allocation和store控制数据转移过程。(具体实现过程没看懂)

45c198e667505990a42124d52f0dbdca.png
图 118 带有checkpoint功能的main bit cell

7.4.2. 使用WALK

由于ROB存有指令目的寄存器之前对应的PR,因此可以将RAT的状态逐步倒回去。如发生分支预测失败时抹掉相应指令同时暂停流水线,从ROB底端(对应最新指令)开始逐条将每条指令之前的映射关系写到RAT,这个方式称为WALK,可以把更改RAT的指令按照相反的顺序对RAT进行恢复,可最大限度利用ROB的写端口(如有4个就每次恢复4条指令)。显然这样进行恢复是非常慢的,但消耗的硬件资源少。一些处理器如MIPS R10000使用这种方法对异常发生(频率低)时的处理器进行状态恢复,同时用比较快的checkpoint的方法对分支预测失败(频率相对较高)时进行恢复。

7.4.3. 使用Architecture State

在基于统一的PRF进行寄存器重命名时,ISA定义的所有AR都混在了处理器内部的PR中。当外部访问一个AR(只能访问ISA中定义的AR)时无法使用重命名阶段的RAT,因为它处于推测状态,因此一般会在提交阶段也使用RAT,所有正确离开流水线的指令会更新这个RAT(architecture RAT,aRAT)。因为我们也可以利用这个总是正确RAT进行恢复,当分支预测失败时,并不马上进行恢复(此时需要抹掉后续指令吗?)让处理器继续执行,当预测失败的分支指令变为最旧的指令时,此时的aRAT即表示了分支所对应正确状态的RAT,所以可将aRAT复制到重命名阶段的RAT中。这两个RAT结构一模一样,只需在物理层面将两个RAT的位单元之间架起一个直连的通道通过相应信号控制即可在一个周期内完成复制,与checkpoint方法相同。但如果在分支之前存在cache miss的指令,这样就会影响执行效率。不过如果正好前面出现异常,这样相比立即进行状态恢复反而节约了功耗,因为这条预测失败的分支会被抹掉。

7.5. 分发

分发(dispatch)阶段是顺序和乱序执行的分界点,在这个阶段经过寄存器重命名之后的指令会被写到发射队列(乱序和顺序)以及ROB中,下面将详细介绍这个过程。

1)发射队列(乱序),大部分FU可乱序执行,被执行之前,指令被放入发射队列缓存中,每个FU对应一个发射队列(先假设如此),只要操作数准备好即送入FU中执行,而不用管以前的顺序。对于4-way超标量处理器,每周期最多需要从队列中找到4个空闲表项,由于乱序执行的特性,这并不容易,后文会再进行介绍;

2)发射队列(顺序),分支和store等指令需要顺序执行,容纳这些指令的发射队列实际就是FIFO,通过调整写指针即可找到空闲表项,一般通过交叠实现多端口FIFO;

3)ROB,指令经过寄存器重命名后按照程序指定顺序写入ROB,同时在ROB中还会记录一些执行过程中的状态如异常,计算完成的指令需要等到ROB中排在它前面的指令全部退休才允许改变处理器状态,ROB本质也是FIFO。

分发阶段可和重命名寄存器阶段放在同一周期,也可单独放在一个周期,该阶段功能实现较为轻松。

注:本专栏所有内容均来自于本人对《超标量处理器设计》这本书学习笔记的总结整理与思考,专业术语的英文全称及解释均只在第一次出现时说明,后文不再说明,可读性较差,但适合从事CPU设计工作的专业人员逐字逐句精读,不喜请自行离开,没必要瞎喷。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
f32c是可重定向的,标的,流水线的32位处理器核,其可以执行RISC-V或MIPS指令集的子集。它在参数化VHDL中实现,其允许具有不同面积/速度权衡的合成,并且包括分支预测器,异常处理控制块和可选的直接映射高速缓存。 RTL代码还包括诸如多端口SDRAM和SRAM控制器,具有复合(PAL),HDMI,DVI和VGA输出的视频帧缓冲器,具有用于精灵和窗口的简单2D加速,浮点向处理器,SPI,UART,PCM音频,GPIO,PWM输出和定时器,以及为各种制造商的众多流行FPGA开发板定制的胶合逻辑。在合成整数基准中,内核以存储在片上块RAM中的代码和数据产生3.06 CoreMark / MHz和1.63 DMIPS / MHz(1.81 DMIPS / MHz,功能内联)。当配置为16 KB指令和4 KB数据高速缓存,并且代码和数据存储在外部SDRAM中时,内核产生2.78 CoreMark / MHz和1.31 DMIPS / MHz。包括定时器和UART的性能优化的f32c SoC仅占用1048个6输入LUT,同时仍然能够在最紧凑配置(仅消耗697(649个逻辑加48个存储器)LUT)下合成时执行gcc生成的代码。可配置选项包括:C_arch RISC-V或MIPS ISAC_big_endian总线端C_mult_enable合成乘法单位C_branch_likely支持分支延迟时隙取消C_sign_extend支持符号扩展指令C_movn_movz支持条件移动指令C_ll_sc支持原子读 - 修改 - 写构造C_branch_prediction合成分支预测器C_bp_global_depth全局分支历史跟踪大小C_result_forwarding合成结果旁路C_load_aligner合成加载对齐器C_full_shifter pipelined而不是迭代移位器C_icache_size指令高速缓存大小(0到64 KB)C_dcache_size数据高速缓存大小(0到64 KB)C_debug综合单步调试模块

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值