【发射】issue


发射队列(IQ)也可以叫做保留站(Reservation Station, RS)。发射队列会按照一定规则,选择源操作数都已经准备好的指令,将其送到FU中执行,是处理器从顺序执行到乱序执行的分界线。

发射阶段的硬件复杂,时序处于处理器当中的关键路径上。

下图给出发射阶段的执行过程。在这里插入图片描述

  1. 发射队列(( IssueQueue ),用来存储已经被寄存器重命名,但是没有被送到FU执行的指令,通常也被称为保留站(Reservation Station)
  2. 分配(Allocation )电路,用来从发射队列中找到空闲的空间,将寄存器重命名之后的指令存储到其中,不同的发射队列的设计方法,会直接影响这部分电路的实现.
  3. 选择(Select )电路,也称为仲裁(Arbiter )电路,如果在发射队列中存在多条指令的操作数都已经准备好了,那么这个电路会按照一定的规则,从其中找出最合适的指令,送到FU中去执行,这部分电路是发射阶段比较关键的部分,会直接影响整个处理器的执行效率;
  4. 唤醒(Wake-up)电路,当一条指令经过FU执行而得到结果数据时,会将其通知给发射队列中所有等待这个数据的指令,这些指令中对应的源寄存器就会被设置为有效的状态,这个过程就是唤醒。如果发射队列中一条指令的所有源操作数都有效了,则这个指令就处于准备好(ready )的状态,可以向选择电路发出申请。

以上图为例,发射队列中存储着A~G这七条指令,指令A和B都已经处于准备好的状态,经过选择电路的仲裁,选择指令B送到FU中进行运算,它运算完成后,会将发射队列中和B指令的结果寄存器相同的所有源寄存器(位于指令C和D中)也置为有效,这样就 将相关的指令进行了唤醒。

发射阶段的实现有很多种方式,而位于这个阶段中心位置的部件就是发射队列,它的实现方式直接决定了整个发射阶段的实现方式,它可以设计成集中式(Centralized ),也可以设 计成分布式(Distributed );可以设计成压缩的方式(Compressing ),也可以设计成非压缩的方式(Non-compressing );可以设计成数据捕捉的方式(Data-capture ),也可以设计成非数据捕捉的方式(Non-data-capture )。这些结构都正交的,它们之间可以互相组合,也就是说,发射队列可以设计成集中式、数据捕捉并且采用压缩方式,也可以设计成分布式、非数据捕捉并且采用非压缩方式,具体采用何种方式取决于处理器架构的设计。

1. 发射队列实现概述

1.1 集中式 vs. 分布式

所有FU共用一个发射队列称这种结构为集中式的发射队列(Centralized Issue Queue,CIQ);而如果每个FU都有单独的发射队列,称这种结构为分布式的发射队列(Distributed Issue Queue,DIQ)
两种方式各有优缺点,现代处理器通常结合使用上述两种方法,使某几个FU共同使用同一个发射队列。具体将哪些FU共用一个发射队列,是和指令集、设计目标等相关的。

1.2 数据捕捉 vs. 非数据捕捉

在流水线哪个阶段读取寄存器的值决定了处理器中其他一些部件的设计。

  1. 在流水线发射阶段之前读取寄存器,称为数据捕捉(Data-capture)。首先读取PRE,如果值没有计算出来就将寄存器的编号写到发射队列中,以供唤醒wake-up的过程使用,同时被标记为当前无法获得(non-available)的状态。这些寄存器会在之后通过旁路网络bypassing network得到值,不需要访问寄存器堆。 发射队列中存储指令操作数的地方称为payload RAM。在这里插入图片描述当指令从IQ中被仲裁电路选中时,可以从payload RAM中对应的地方将源操作数读取出来,送到FU。同时,它会将目的寄存器的编号值进行广播,发射队列中其他指令都会将自身源寄存器编号和广播的编号值比较,一旦相等就在payload RAM对应位置标记,计算完毕后选中的指令会将结果通过旁路网络写到payload RAM对应的位置中。payload RAM捕捉FU计算的结果,被称为数据捕捉结构(data-capture)。
    超标量处理器中,machine width用来标记每周期解码和重命名的指令个数;issue width用来标记每周期最多可以在FU中并行执行的指令个数(每周期最多可以发射的指令个数)。CISC处理器中,issue width需要大于machine width,避免出现进的多,出得少。RISC中,考虑指令相关性,issue width也需要大于machine width。
    PRE需要读端口数是machine width×2.在这里插入图片描述
  2. 在流水线发射阶段之后读取PRF,称为非数据捕捉(Non-data-capture),重命名之后的指令直接将源寄存器的编号放到发射队列中,当指令从发射队列被选中时,会使用源寄存器的编号来读取物理寄存器堆,将读取到的值送到FU执行。PRF需要的读端口数是issue width×2.在这里插入图片描述
    在使用ROB进行寄存器重命名时,一般配合使用数据捕捉。

1.3 压缩 vs. 非压缩

  1. 压缩的发射队列 compressing Issue Queue在这里插入图片描述在这里插入图片描述在这里插入图片描述此种方法延迟和发射队列的容量成正比。IQ中可以容纳的指令个数越多,延迟越大。

    • 优点:分配allocate电路简单;选择电路简单,可以最大限度释放RAW相关性指令。
    • 缺点:需要复杂mux和布线资源;指令移动多,功耗大。
  2. 非压缩的发射队列 Non-Compressing Issue Queue
    在这里插入图片描述

    • 优点:指令不需要每个周期移动,减少功耗,mux和布线的面积。
    • 缺点:分配allocation电路复杂;oldest-first功能选择电路复杂。

2. 发射过程的流水线

2.1 非数据捕捉结构的流水线

在这里插入图片描述
issue过程被分为唤醒wake-up和仲裁select两个流水线阶段。这种指令执行完之后才对相关指令进行唤醒的方法是tomasulo算法。但是两条背靠背RAW的指令执行之间差了三个周期。因此需要通过旁路网络将唤醒的过程提前。在这里插入图片描述在这里插入图片描述
只有将指令的仲裁和唤醒两个操作放在一个周期之内完成,才能使指令背靠背执行。

因为仲裁电路和唤醒电路比较复杂,将它们放在一个周期内执行,会使处理器频率变低。将电路分开在两个周期可以提高处理器频率,但会影响超标量处理器每周期可以并行执行的指令个数(IPC)。

FU的执行时间不一定是一个周期。

2.2 数据捕捉结构的流水线

指令被仲裁电路选中后不需要读物理寄存器。在这里插入图片描述在这里插入图片描述

3. 分配

为在一周期内完成指令分配,可以使用空闲列表记录所有空闲表项的编号,list按照FIFO的方式管理。为提高速度,可以把发射队列分为四部分,从每部分中找到一个空闲的表项。在这里插入图片描述
如果指令A所属段没有空闲空间,指令A不能被写入发射队列中,由于重命名阶段是按程序指定顺序进行的,A会导致B、C、D都无法写入到发射队列里。

分配(allocate)、仲裁(select)和唤醒(wake-up)构成了发射阶段正常工作的三个主要步骤。

4. 仲裁

4.1 1-of-M的仲裁电路

需要实现oldest-first功能的仲裁,以简化相关性。可以利用重排序缓存ROB。直接使用指令在ROB的地址,因为读写指针会翻转,出现大小写混乱。可以在ROB地址前面再加一位称为位置值(position bit)。在这里插入图片描述在这里插入图片描述

  • 位置值相同时,ROB地址值越小,对应指令越旧;
  • 位置值不同时,ROB地址值越大,对应指令越旧。

指令在流水线分发dispatch阶段,会将重命名之后的指令写到ROB和发射队列中,同时也会将每条指令在ROB中的地址值也一并写到发射队列中。仲裁电路根据地址值所提供的年龄信息,可以从所有指令中找到最旧那条指令。如果发射队列有M个表项,这个仲裁电路就称为1-of-M的仲裁电路。在这里插入图片描述
8个表项需要经过8-4-2-1共三级比较电路才能最终获得最旧的指令对应的地址值。所需比较电路的级数N和发射队列中的表项个数M存在N=log2M。发射队列大时,需要更多比较器级数,增加延迟。

根据ready位选择。
在这里插入图片描述
仲裁年龄的同时,也需要在发射队列找到对应的指令。
在这里插入图片描述
通过上述方法,可以从表项个数为M的发射队列中选择一条最旧的指令。1-of-M的仲裁电路。

4.2 N-of-M的仲裁电路

几个FU共用一个发射队列,需要在一个周期内为每个FU都选择出一条指令,要求N-of-M的仲裁电路。在这里插入图片描述
发射队列容量为M,每个FU都有一个专属的1-of-M的仲裁电路。

一般来讲,会将加减法、逻辑运算和移位运算合在一个FU;将整数乘除法合并;将访问存储器和访问协处理器合并;将浮点运算合并。在这里插入图片描述

5. 唤醒

5.1 单周期指令唤醒

仲裁电路的个数等于issue width的值。在这里插入图片描述
仲裁电路个数为四。每个表项都需要向四个仲裁电路发出请求信号request,也从四个仲裁电路收到四个响应信号Grant。四个响应信号中,只有一个有效,有效相应会将指令的目的寄存器编号送到指定总线(tag bus)上。
val:表示是否存在源寄存器
issued:被仲裁电路选中但不马上离开发射队列,会被标记不向仲裁电路发出请求信号

四个仲裁电路Select0 ~ Select3分别对应四条总线Tag bus0 ~ Tag bus3.

发射队列每个表项都会向所有的仲裁电路发出请求信号,但只有一个请求信号有效,也只会从一个仲裁电路收到有效的响应信号。

第一步:被仲裁电路选中的指令会将它的目的寄存器的编号送到对应的总线上(tag bus)。
第二步:每一条总线(tag bus)上的值会和发射队列中所有指令的源寄存器的编号进行比较,如果发现相等,则将这个源寄存器标记为准备好的状态。
第三步:当发射队列中的某条指令的所有操作数都准备好了,并且还没有被仲裁电路选中过,它就可以向对应的仲裁电路发出请求信号。
第四步:如果仲裁电路发现有更高优先级的指令(例如年龄更老的指令)也发出了请求信号,则当前的这条指令将不会得到有效的响应信号,这条指令将在下个周期继续向仲裁电路发出请求信号。在这里需要注意的是,在一些设计中,一条指令可以轮流向两个仲裁电路发出请求信号,如果其中一个仲裁电路几次都没有给出响应信号的话,可以将这条指令的请求信号送至另外一个仲裁电路,因为另一个仲裁电路很可能此时是空闲的,这种平衡的算法有时候会起到一定的作用。如果从仲裁电路得到了有效的响应信号,则这个响应信号会将这条指令标记为“已经被选中”的状态,这条指令在下个周期就不会向仲裁电路继续发送请求信号了。为什么不直接让这条已经被选中的指令马上离开发射队列呢?这是因为一条指令如果使用了load指令的结果的话,即使它被仲裁电路选中,也不可以马上离开发射队列,
这在后文会有解释。
第五步:发射队列中的这条指令根据收到的响应信号,将它的目的寄存器的编号送到对应的总线上,用来唤醒发射队列中所有相关的源寄存器,同时这条指令就可以送到对应的FU中执行了。

5.2 多周期指令唤醒

复杂指令需要根据它在FU中执行的周期数,将这个唤醒过程延迟。唤醒过程可分为两个阶段。

  • 将被选中指令的目的寄存器的编号值送到总线上。
  • 将总线上值和发射队列中所有源寄存器的编号进行比较。
    将唤醒过程延迟可根据这两阶段产生两种方法:延迟广播(delayed tag broadcast)和延迟唤醒(delayed wake-up)

5.2.1 延迟广播

延迟广播根据被选中指令所以需要的执行周期数N,延迟N-1个周期后,才将它送到总线上。在这里插入图片描述
tag bus 冲突
在这里插入图片描述用表格记录当前在FU中执行的指令所需要的周期数。在这里插入图片描述

5.2.2 延迟唤醒

与目的寄存器编号比较结果相等的寄存器不一定马上被置为ready,而是根据这条进行广播的指令所需要的执行周期数进行相应的周期延迟。在这里插入图片描述
在这里插入图片描述
可以采用移位寄存器实现延迟唤醒。解码阶段指令执行周期数就可以知道了,可以把DELAY一并写入IQ.在这里插入图片描述
当一条指令被仲裁电路选中之后,除了将它的目的寄存器的编号送到总线之外,还需要将它的DELAY值也一并送到总线上,称这个总线为DELAY bus。i一般来说,每个FU都会对应一个DELAY bus。根据寄存器编号的比较结果,将对应DELAY bus的值“捕捉”到发射队列相应的表项(entry)中,然后再将这个DELAY值进行移位的处理,完成延迟唤醒的过程。在图8.39中,发射队列中的每个表项包括的内容如下。

①Freed:表示这个表项是否是空闲的,当一条指令写入其中时,这个表项就不再是空闲的;而这条指令被仲裁电路选中,并且确定不会有问题时,这条指令就可以离开发射队列,这个表项也就可以变为空闲的状态。需要注意的是,一条指令被仲裁电路选中之后,并不一定保证这条指令就一定会得到想要的操作数,当这条指令的操作数来自于load指令时,处理器可能会采用推测唤醒(speculative wake-up)的方法来加快执行效率,这时候即使一条指令被仲裁电路选中了,它也有可能在之后的时间重新参与仲裁的过程,因此管理发射队列中的一个表项是否空闲并不是一件很直接的事情,最容易的方法就是当一条指令顺利地离开流水线(也就是退休)的时候,才使它在发射队列中占据的表项变为空闲的状态,但是这会导致很多无效的指令占据着发射队列,使其可用的容量变小,降低了处理器可能获得的并行度,因此现实当中的处理器会采用一些更高级的方法,这些内容将在后文介绍。

②Issued:表示一条指令是否已经被仲裁电路选中,被选中的指令可能不会马上离开发射队列,因此需要对这种指令加以标记,以使它不再向仲裁电路发出请求信号。

③SrcL:指令的第一个源寄存器的编号值,它会和所有的总线上的目的寄存器的编号进行比较。

④SrcL_M:当寄存器编号的比较结果相等时,这一位会被置1(M表示match);当这条指令接收到仲裁电路给出的响应信号时,这一位会被清O,是移位寄存器(SrcL_SHIFT)进行算数右移的使能信号,当它为1时,移位寄存器每周期都会算术右移一位。

⑤S·cL SHIFT:移位寄存器,当寄存器编号的比较结果相等时,会将对应的DELAY值写到这个移位寄存器中,然后它在移位使能信号(SrcL_M)的控制下,每周期都会算术右移一位,通过这种方式实现延迟唤醒的功能,这个移位寄存器最低位的值用来表示当前的源寄存器(SrcL)是否已经处于准备好的状态(ready状态)。

⑥Rdy:表示指令的第一个源寄存器是否已经准备好了(ready状态),它本质上就是移位寄存器(SrcL_SHIFT)的最后一位。

上面所讲述的SrcL、SrcL_M和SrcL_SHIFT都在描述指令的第一个源寄存器,同理,SrcR、SrcR M和SrcR_SHIFT都用来描述指令的第二个源寄存器,它们的内容是一样的。

⑦SrcR_imm_valid:表示指令的第二个操作数是否是立即数。

⑧DELAY:用来记录每条指令需要在FU中执行的周期数,在一条指令被仲裁电路选中,将它的目的寄存器的编号送到总线(tag bus)上的同时,也会将这个DELAY值送到对应的总线上(DELAY bus),发射队列中的每个源寄存器都会根据比较的结果,选择合适的DELAY值写到图8.39中的SrcL_SHIFT(或SrcR_SHIFT)区域中。因为这个值会被进行算数右移,所以对DELAY值采用1和0进行编码,DELAY值的位宽由所有FU中,最多需要的周期数来决定,而DELAY值最右边将被填充0,对于一条在FU中需要执行L个周期的指令来说,0的位数等于L一1,表示这条指令需要将唤醒信号进行延迟的周期数。举例来说,对于一个8位的DELAY值,当一条指令需要在FU中执行的周期数为4时,这条指令的DELAY值会被编码为11111000,当发射队列中的某个源寄存器“捕捉”到这个DELAY值之后,经过3个周期的算数右移,它的最低位就是1了,也就是表示这个源寄存器已经被唤醒,处于准备好的状态。

⑨ROB ID:这条指令在ROB中的位置,这个值作为指令的年龄信息,使仲裁电路(Select)可以实现oldest-first的指令选择。一旦发射队列中的某个源寄存器的编号和总线上的目的寄存器的编号相等时,例如SrcL和某个总线上的值相等,则SrcL_M位就会被置为1,直到接收到仲裁电路给出的响应信号(即grant信号),才会将SrcL_M位清零,也就是说,SrcL M位会保持很多个周期都为1,而这一位作为移位寄存器(SrcL SHIFT)的使能信号。当其为1时,移位寄存器在每周期都会算术右移一位,当移位寄存器右边的0全部被移掉时,整个值就全是1了,所以即使它继续算数右移,其最右边的位也会一直为1,表示这个源操作数一直处于准备好的状态,直到某一个时刻,这条指令被仲裁电路选中而收到了有效的响应信号(grant信号),才会将这条指令对应的移位寄存器(SrcL_SHIFT和srcR_SHIFT)和移位使能信号(SrcL_M和SrcR M)都清零,这条指令就不会继续向仲裁电路发出请求信号了。

5.3 推测唤醒

实际处理器中很多指令需要执行周期数是没有办法提前知道的,如:

  • load L1 L2 L3 DRAM DRAM由于自身结构原因(比如queuing delay),从中读取数据需要的时间并不是固定值。
  • 某些处理器中乘除法的early out

在这里插入图片描述
一旦指令A发生D-cache缺失,B不能通过旁路网络获得操作数,B需要重新放回发射队列。在这里插入图片描述
早期的tomasulo算法中,只有FU将结果运算出来之后,才会将目的寄存器的编号进行广播,对其他指令进行唤醒操作。现代处理器都是在指令被仲裁电路选中的同时根据所需要的执行周期数,来对其他的相关指令进行唤醒。

推测唤醒 speculative wake-up

预测错误需要状态恢复,被唤醒的寄存器应该被重置为非准备好not ready状态。如果一些存在相关性的指令离开了发射队列还需要将其重新放回发射队列中,并重新向仲裁电路发出申请,这个过程称为replay。

采用软件处理TLB缺失:按照异常的处理方式,也称为基于I-Cache的状态恢复。
采用硬件处理TLB缺失:基于发射队列的状态恢复。

采取不同结构的D-Cache,对于推测唤醒的过程有影响。

在这里插入图片描述

Independent Window (IW)
Speculative Window (SW)在这里插入图片描述
一条指令被仲裁电路选中后,可以马上离开发射队列,也可以继续停留在发射队列中,直到被允许时才能离开,不同的设计方法会导致不同的状态恢复的方法,产生不同的执行效率和硬件消耗。下面介绍两种常用的方法:Issue Queue Based Replay和Replay Queue Based Replay

5.3.1 Issue Queue Based Replay

在发射队列中增加Issued标志位,用来指示指令已经被仲裁电路选中但还没有离开发射队列。这条指令需要replay时,会将issue标志位清零,这样它就可以继续向仲裁电路发出请求信号。

一旦load在执行阶段得到D-cache命中结果,就可以将发射队列中相关指令进行释放,最大限度减少多余指令对于发射队列的占用。一旦发生store/load 或 load/load指令违例,为避免死锁,需要将需要replay的指令从流水线抹掉,从I-Cache中重新将指令取出来放到流水线中。

发现D-Cache缺失时,可以简单的将所有在load指令之后被仲裁电路选中的指令都重新放回发射队列中(指令还没离开发射队列,只需更改对应状态位)。这是一种无差别选择指令的方法,被称为Non-Selective Replay,一定程度上损失性能。

处在IW窗口的指令,和对应的load指令不存在相关性,不需要replay。

可以使用load-vector记录哪些寄存器和load指令存在相关性。vector中每一位表示一条load指令,值的宽度等于流水线中能够最多存在的load指令个数。每个物理寄存器都有一个load-vector值。对于非load,目的寄存器向量值来源于两个源寄存器相或的结果。对于load,除了来源于源寄存器,还会占用向量值的一个新的位。这样发现load指令cache缺失时,根据在向量值中对应的位,可以从发射队列中找出哪些寄存器和它有直接间接关系,从而将这些寄存器设置not ready,等待重新被唤醒。在这里插入图片描述
也可以:对每条load指令都使用一个5位的值,用来表示这条load指令处于流水线的哪个位置(select、RF、Cal Addr、TLB/Tag 和 Data),称这个值为Load position vector(LPV)。当load被仲裁电路选中时,将它的LPV置为10000,表示load位于select阶段。所有和目的寄存器比较结果相等的源寄存器都会得到这条load的LPV值,在之后的每个周期,发射队列中所有源寄存器的LPV都会逻辑右移一位,用来追踪load在流水线中状态。带LPV的指令唤醒其他指令时,也会将LPV赋给别的指令,这样就能识别哪些指令和load存在间接相关性。发现D-cache缺失时,在发射队列中那些LPV最低位是1(00001, load处于data)的所有源寄存器,都会和load存在相关性,需要置为not ready。

如果一条指令LPV全0,说明没有相关性,可以马上离开发射队列。

在这里插入图片描述在这里插入图片描述在这里插入图片描述(图有点小问题)如果D-cahce miss,就将load SW窗口的所有指令置为无效,LPV值最后一位是1的源寄存器置为not ready。不相关的指令仍旧ready,只要issued被清零,这些没有相关性的指令又可以仲裁。需要每周期执行多条指令时,发射队列的每个源寄存器都需要多个LPV值。

Selective replay:只将和load有相关性的指令从流水线抹掉,其他指令继续执行。在这里插入图片描述
Non-Selective Replay 或者 selective replay都基于发射队列replay,导致很多指令被仲裁电路选中后不能马上离开发射队列,无法最大限度并行化。

5.3.2 Replay Queue Based Replay

在这里插入图片描述
非数据捕捉结构的发射队列,S->E(select到execute)时间长,基于发射队列replay会造成发射队列实际可用容量小,所以会配合基于RQ进行replay。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在GitLab中,创建issue是通过在项目中提供给使用者、测试者、开发者反馈项目问题的板块来实现的。创建issue需要登录GitLab,并在相应的项目中进行操作。一般情况下,一个项目团队内使用的issue应该包含标题、描述、分配给谁、标签、对应的版本(可选)、预计完成时间(可选)等信息。创建完issue后,可以在相关issue下进行讨论和问题跟踪。为了保护issue的内容,建议创建完issue后将其锁定,这样其他成员只能评论而不能修改issue内容。此外,还可以指派issue给指定成员、邀请成员查看issue、创建和选择标签、查看issue看板等。还可以创建里程碑将issue划分在某个版本下,以支持以版本的维度进行项目管理。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [gitlab issue详细操作流程](https://download.csdn.net/download/whatyang666/10523809)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [GitLab中创建议题(Issue)和指派人员、创建标签和创建里程碑](https://blog.csdn.net/xiaochenXIHUA/article/details/122762961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值