几句话说清楚24:Skylake微架构(Microarchitecture)剖析(8)

一个示例介绍Reorder Buffer(ROB)和Register Alias Table(RAT)和Reservation Station(RS)

理解乱序执行(Out-of-Order)的核心其实就是把ROB,RAT和RS这三个组件搞透。

如果要单独讲,很容易成为一大锅概念和专有名词的杂烩。所以这次把这几个紧密相关的组件放到一起,先用例子说明,仅描述自然行为,同时也避免出现太多概念。

上图是在一个起始时刻CYCLE 0时CPU后端各组件的状态。它即将执行Instructions表格里的6条指令。不同种类指令所需要消耗的执行时间如Cycle Consumption所示。

ARFArchitectural Register File,里面保存有当前时刻architectural register中的值;RAT就是前面介绍过的Register Alias Table,主要用作对architectural register的Rename。

Reservation Station(RS)根据所连接的执行不同类型指令的Port而分成两类,一类保存ADD/SUB相关的指令,一类保存MUL/DIV相关的指令。里面的指令在两个Value都Ready的时候将发送到执行单元执行。

Re Order Buffer旁边的表格是这6条指令从IssueExecute, Write最后再到Commit这几个状态的cycle时刻表。

OK,那么下面进入第一个cycle。

第一条指令DIV R2, R3, R4按照先进先出的原则首先进入ROB1

在ROB中,Dst填该指令的目的architectural register,也就是R2;Value是该指令执行完计算出来的结果,显然现在还不得而知,表示是否执行完的Done标志位也是N的状态。

同时针对DIV指令的RS中也有空闲资源,因此该指令也会在同一cycle进入RS。目的tagD-tag填写指令对应的ROB条目(ROB1);Tag1Tag2通过查阅RATR3R4的状态,如果有Rename的情况,则填写对应的ROB条目,如果没有,则直接读取ARF中的值,作为Value填入。

因此,D-tagROB1Tag1Tag2因为R3R4没有Rename所以不填,直接读取ARF中的值,20和5,放入Value1Value2中。

之后,在RAT中,R2被Rename成了ROB1,即表示后续指令欲读取R2的值的话,都应该去读取ROB1value的值。

此时该DIV指令所需要的操作数都已经Ready,那么就可以在下一个cycle时从RS中发射到执行单元去执行。

下面进入第二个cycle。

在第二个cycle中,第一条DIV指令开始执行,根据DIV的执行周期,那么我们知道它将在第2 + 10 = 12个cycle中执行完成。同时ROB中还有空闲,我们可以issue第二条MUL指令。

在RS中,上一条DIV指令已经清出,也有空闲资源,所以MUL指令也可以进入到RS中。另外几个选项也如DIV指令的判断方式,因此D-tagROB2,两个value为4和2。此时MUL指令也已经Ready,可以在下一个cycle开始执行。

同时RAT中将R1rename到ROB2。因为后续最新的R1的值将等于ROB2中的value

在第三个cycle中,MUL指令开始执行,根据MUL的执行周期,它将在第3 + 3 = 6个cycle中执行完成。因ROB中 还有空闲,此时可以issue第三条ADD指令。

RS里面,ADD指令需要放到存放ADD/SUB指令的RS中,除此之外,各字段的填写方式与之前的指令没有区别。R7R8也可以直接从ARF中获取数值,因此该ADD指令也已经Ready,可以在下一个cycle开始执行。

之后,RAT中将R3rename到ROB3

那么在第四个cycle中,第四条MUL指令可以进入ROBRS之中。在RS中,D-tag填入该指令对应的ROB条目,即ROB4。而它的第一个操作数R1通过RAT读取(参见cycle 3中的RAT情况。),rename到了ROB2,因此tag1需要填ROB2Tag2同理,填ROB1

之后,RAT中的R1需要rename到ROB4,以保持最新的状态。

RS中,因为该条指令两个操作数的value还没有Ready,不能在下一个cycle开始执行,因此还暂存在RS之中。

在第五个cycle中,拆成两个阶段来看。第一个阶段,也即cycle 5`,第五条SUB指令进入ROBRS,各字段的填写方式与之前相同。

在cycle 5的第二个阶段中,注意到指令时刻表中,第三条在指令将在cycle 5完成执行,并进入Write阶段。

于是此时第三条指令在ROB中对应的ROB3Value中将填入该指令执行的结果,也就是3,同时设置标志位DONE为Y。

在执行完成之后,在同一个cycle中,CPU还将进行一个操作,就是将该结果广播给RS中现存的指令,如果有等待ROB3执行结果的指令,将接收该结果并更新状态。

在当前RS(Adder)中,SUB指令正在等待ROB3的结果(参见cycle5`),于是其不再等待Tag1,并在Value1中填入结果3。此时该SUB指令也已经Ready,并将在下一个cycle中执行,根据其执行开销,将在第6 + 1 = 7cycle时执行完成。

后面的下期再继续。

© 2020 DecodeZ All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero