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

解码

在拿到了经过“预解码”的macro-ops之后,开始正式进入解码过程。marco-ops进入Instruction Decode组件解码,最终的输出为定长的micro-ops

Insturction Decode组件也有入口带宽限制,每个Cycle最多取3个unfused指令+2个fused指令,或者5个unfused指令(这里指macro ops)。所以说fused多了也不好,一个cycle最多取两个。同时如果开了Hyper Thread,则两个Thread按Cycle交替使用Instruction Decode。

在Instruction Decode组件里面的就是各个具体的Decoder。Decoder类型可以分类两类,一类是Simple Decoder,一类是Complex Decoder,感觉这句是在说废话。

顾名思义,Simple Decoder处理的是解码之后的输出为1个fused-uop的指令;Complex Decoder处理的是解码之后的输出为1个至4个fused-uop的指令。

Fused-uop

注意这里说的是fused-uop,不是fused-marco。在这里所有输出的uop都是做过fused处理的,目的是减少后续资源的占用。

但这里有一个比较容易混淆的概念,就是fused-uop并非专指那些两个uop合并之后生成的“合并uop”,而是指所有经过了uop fusion处理的uop:有些指令可能两个uop变一个,但也有一些是一个还是一个,即便如此,输出的那一个也叫fused-uop

为了进一步澄清这个概念,我们稍微需要涉及一点后端的概念。在前端这里,生成fused-uop的部分还属于CPU流水线中的uops fused domain,而在后端需要将指令发射到执行单元去的时候,是不能执行fused uop的,所以fused uop还需要再分解为unfused uop才可以执行,这一部分就属于CPU流水线中的uops unfused domain

有了这些概念之后,我们可以看一下Instruction Tables.pdf这份文档。

在P244中有对skylake指令的说明,上面有对一些概念的解释,下面是一张表格:

在这张表格里是最常见的mov命令的说明。但因为操作
数(operands)的不同在真正执行的时候也会有细节上的差别。第一行中的mov的两个操作数一个是register,另外一个是一个立即数。在uops fused domainuops unfused domain两栏中的计数都是1。

这种指令也算在uops fused domain经过了fusion处理。只不过其实前后没什么区别。

但如果我们看一下所有在uops unfused domain里计数为2的mov指令,它们在uops fused domain中的计数都是1。这种mov指令就是真正做过2条uop合并的mov指令。

这份表格还有很多有趣的内容,推荐有时间的时候随手翻翻。

Skylake有4个Simple Decoder和1个Complex Decoder。但从表里我们可以看到uops fused domain计数为1,也就是可以被Simple Decoder处理的指令在所有指令中所占的比例似乎并没有达到4/5那么高。

这里需要说明的是,输出大于4个uop的指令,既不由Simple Decoder处理,也不由Complex Decoder处理,而是直接去查Microcode Sequencer(MS),这是一块类似于缓存的ROM。

Complex Decoder的数量始终为1的原因是Complex Decoder解码出来的uop都很难在执行时进行并行化处理,同时Complex Decoder每多解码一个uop,就要有一个Simple Decoder处于不能工作的状态。

对CPU来说,它最希望的就是它要做的工作,它需要的数据,它要执行的指令,都已经在一块缓存里准备就绪了。这是CPU上班摸鱼的主要方法,但摸出了风格,摸出了水平。下一部分介绍一下在指令解码方面的缓存内容。

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