Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (11) - 乱序引擎/重命名器&调度器

版权声明:转载必须保留原出处,没有书面许可不可用于商用目的, https://blog.csdn.net/qq_43401808/article/details/85997673

Renamer

从上图中可以看出,重命名器是连接“有序前端”与“调度器的数据流世界(即乱序引擎)”的桥梁。它每周期可以最多从微指令队列搬移4条微指令到乱序引擎。尽管重命名器最多可以搬移4条微指令(未熔合的,微熔合的,宏熔合的),这个带宽已经等价于发射口的带宽(每周期6条微指令)。在这个过程中,乱序核执行如下的步骤:

  • 将微指令中x86架构的源操作数/目的操作数重命名为微架构中的源/目的操作数
  • 为微指令分配资源。例如,加载缓冲区,或存储缓冲区
  • 将微指令绑定到正确的发射口

某些微指令在重命名阶段即可完成,从流水线中移除掉,有效地节省了执行带宽。这些微指令包括:

  • 零习语(zero-idiom)(打破依赖习语 dependency breaking idiom,随后有详细讲解)
  • NOP指令
  • VZEROUPPOER指令
  • FXCHG指令

重命名器可以每周期分配两条分支,比起前代微架构的每周期一条分支,可以消除或减少执行时的气泡现象(即执行流不均衡性)。

微熔合的读存与写存操作,如果使用了变址寄存器参量,则将会被分解为两条微指令(即类似于Haswell微架构中的微指令离解unlamination过程,参看后续章节),因此在一个周期中会占用重命名器的两条微指令带宽(注:重命名器的最大带宽是每周期4条微指令)。

Dependency Breaking Idioms

通过使用常用的指令将寄存器清零,可以增强指令的并行性。重命名器可以侦测到将目标寄存器设置为0的操作指令。

可能的话,尽量使用如下打破依赖习语将某个寄存器清零(即前面提到的零习语)。

注:这里打破依赖指的是指令执行结果是确定数,不依赖于指令的输入而变

  • XOR REG, REG
  • SUB REG, REG
  • PXOR/VPXOR XMMREG, XMMREG
  • PSUBB/W/D/Q XMMREG, XMMREG
  • VPSUBB/W/D/Q XMMREG, XMMREG
  • XORPS/PD XMMREG, XMMREG
  • VXORPS/PD YMMREG, YMMREG

由于零习语由重命名器侦测,执行,删除,所以这些指令都不会产生执行时延。

还有另外一种打破依赖习语,被称为壹习语(one idiom)。

CMPEQ XMM1, XMM1; 这个指令将目标寄存器中的所有比特位设置为1

对于这种情况,CMPEQ指令必须执行,但是,因为已知执行结果并不依赖于源操作数的输入数据,目标寄存器中的结果总是所有比特位置1,所以只要有可用的执行单元,壹习语指令可以立即投入执行。

Scheduler

调度器控制微指令的分发过程,这里分发指的是将微指令传输到对应的发射口/执行单元。要实现微指令分发,调度器必须标识出就绪的微指令以及微指令的操作数来源:某个寄存器堆条目,或者来自于某个执行单元的旁路。根据发射口与回写总线的可用性,以及就绪微指令的优先级,调度器在每个周期会选择将哪些微指令分发投入执行。

猜你喜欢

转载自blog.csdn.net/qq_43401808/article/details/85997673