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

上期

第六个cycle之后

看一下第六个cycle时会发生什么。

仍然分为两个阶段。第一个阶段cycle 6’里,第六条ADD指令指令可以进入ROB以及RS。

在RS中,D-tag填写该指令所在的ROB条目ROB6,两个操作数通过读取RAT获得,R4R2对应的分别是ROB5ROB1

RATR1所对应的最新值修改为ROB6

在第二个阶段,注意到此时第二条指令也在cycle 6执行完毕,因此它将执行的结果(8)写入到其所在的ROB条目ROB2,并在同时将执行的结果广播给RS中的指令。

此时RS中的MUL指令正在等待ROB2的值,此时将其对应的Value1中写入计算的结果(8)。

在第七个周期,注意到第五条指令也该执行完成,其所执行所得到的结果(-1),也需要写回到ROB5并广播给RS中的指令。但此时没有等待该值的指令。所以对其他状态暂时没有影响。

但如果此时有新的指令需要R4ROB5此时的值可以直接传递给该指令。

在第7个指令之后,CPU进入一个尴尬的时期。没有新的指令执行完毕,RS中的指令也没有Ready的,观察一下时刻表,下一个时刻有新的指令执行完毕是cycle 12的事。

cycle 12中第一条DIV指令执行完毕,结果写入ROB1,广播结果给RS中的指令,正好两个都需要ROB1,并且拿到这个结果之后都进入Ready状态,可以在下一个cycle执行。

更新一下第四条和第六条指令的时刻表,执行都是在第13个cycle,完成将分别在第16和14个cycle。

此时还发生了一件事,就是ROB中的第一条指令的DONE标志位标成了Y。ROB之前我们介绍是一个先入先出的FIFO结构,只有第一条指令完成之后,才能按顺序开始commit。

所以在cycle 13,第一条指令历史性的commit了。Commit的意思就是把结果写入到ARF,因此R2在ARF中改为了4。同时删除该ROB条目,为后续的指令腾出资源。当然RAT中也不再需要rename到ROB1,最新的值已经在ARF中。

cycle 14中,ROB中的当前在队列头部的指令,也就是第二条指令也可以commit了,按之前的操作,R1的值也改成了最新的值(8)。

同时,第六条指令也执行完毕,计算的结果写入ROB6。当然这条指令还不能commit,因为commit需要按指令顺序。

第15个cycle,除了commit第三条指令之外没什么好做的。和以前的操作类似。

第16个指令,第4条指令执行完毕,结果写入ROB4,同时它也是当前ROB中在队列头部的指令,可以在下一个cycle commit。

那就commit呗。

剩下的第18,19 cycle想必你也知道该干什么了:把最后的两条指令commit掉。

OK,当指令时刻表都完成之后,这6条指令正式执行完毕。

关于这几个组件

全部目的都在于通过一个示例解释RAT, ROBRS这三个组件的组成、特性和功能。在熟悉了这个例子的基础上可以再去寻找那些传统的“教科书”去印证理解那些大段大段的文字描述。

这个例子其实还缺少一些类似分支转跳,尤其是分支预测失败之后如何操作的说明。但足矣描述清楚CPU的乱序执行和顺序commit到底是怎么回事。

关于CPU微架构,前端和后端的内容基本上介绍的差不多了,后面会开始最后一个部分,也就是内存操作相关的组件的介绍。兴许会再添加一个后端执行的示例也说不定,看心情。

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