【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.4~9.6】

9.4 LoopBack Buffer

Nehalem 中的28uop loop buffer 在Sandy Bridge和Ivy Bridge中被保留。Loop Buffer被放置在uop cache之后,但是在uop cache miss的情况下,它也可以接受来自译码器的指令。Loop buffer可以提高微小循环的性能。如果uop cache不是瓶颈的话,loop buffer没有可以测量得到的效果。这也是大多数的情况。

可以使用小于28条uop的循环以利用loopback buffer的优势。

9.5 Micro-op fusion

处理器和之前的处理器一样使用uop fusion。一些需要在执行单元中使用两条2 uop的指令可以利用uop fusion 技术来保证这两条uops在pipeline的大多数pipe像一条指令一样flow,以解决pipeline的带宽。见91和107页。


这里插入Pentium M 7.6中介绍的micro-op fusion 技术

寄存器重命名(RAT)和 退休(RRF)阶段在pipeline中是瓶颈,最大值为每周期3条uops。为了避免瓶颈,设计者将一些之前处理器分为两条uop的指令操作合并。这被称为uop fusion技术。融合的操作在大多数的pipeline和ROB中只作为一项。但是因为这一ROB项不得不代表了需要被两个不同的执行单元进行的操作。融合的ROB项被分派到两个不同的执行单元,但是退休时只作为单独的一项退休。

Uop fusion 技术只能被应用到两种类型的指令上:memory 写指令和读->修改操作。

写内存操作包括计算内存的地址和传输数据。在之前的处理器中,这两条操作被分为两条uop,执行单元中的port 3端口负责地址计算,port 4端口负责数据传输。这两条指令在PM 中大多数会被融合为一条uop。内存读取操作只需要一条uop(port2端口) 与之前的处理器一致。

第二种类型可以被融合的操作是度修改操作,例如指令 ADD EAX,[mem32] 包括两条操作,第一条操作(port2)从[mem32]处读取数据,第二条操作(port0/1)将读取的值加到EAX上。这样的指令在之前的处理器中被分为两条uops,但是可以在PM中融合。这可以应用到大多数对通用寄存器\浮点寄存器\栈寄存器\MMX 寄存器的读->修改操作指令上,但是XMM寄存器上不支持。

读->修改->写操作,比如ADD [mem32],EAX 不能融合读和修改操作,但是可以融合写操作。

; Example 7.2. Uop fusion
mov [esi], eax ; 1 fused uop
add eax, [esi] ; 1 fused uop
add [esi], eax ; 2 single + 1 fused uop
fadd qword [esi] ; 1 fused uop
paddw mm0, qword [esi] ; 1 fused uop
paddw xmm0, xword [esi] ; 4 uops, not fused
addss xmm0, dword [esi] ; 2 uops, not fused
movaps xword [esi], xmm0 ; 2 fused uops

可以看出,打包加法(PADDW)读修改指令可以在Pentium M中被融合,如果目标寄存器是64bit MMX 寄存器,但是如果目标是128 bit XMM寄存器则不支持。后面的指令要求两条uop读取64bit,额外的两条uop每条进行超过64bit的计算。ADDSS指令不能被融合,即使他只利用了XMM寄存器的低位。不是 读->修改的指令如果涉及XMM 寄存器可以被融合,但是XMM寄存器写操作可以被融合。如果最后一条汇编所示。

Core Solo/Duo 有更多的机会来进行XMM指令的融合,一个128bit的XMM指令可以通过两个或者更多的64bit uops  在64-bit执行单元中执行。两个64bit 微操作可以在译码器中被粘合。在pipeline的早期阶段,如7.2所引用的论文,融合fusion和粘合lamination操作并没有明显的不同。这样做的结果就是XMM指令的吞吐率在译码器中增加了,但是Core Solo/Duo 的执行单元中并带宽并没有增加。

PM中的reorder buffer(ROB)被重新设计以实现每项可以有超过3个的输入依赖项,之前的设计中只允许两项。例如,指令 mov [ESI+EDI],EAX和ADD EAX,[ESI+EDI]都有三个输入依赖项,也就是说需要等待EAX,ESI和EDI都准备好之后指令才能执行。未融合uops的指令仍只支持两个依赖项。mov [ESI+EDI],EAX分为依赖ESI和EDI的地址计算uop,和依赖输出地址计算结果的uop以及EAX的uop。类似的,ADD EAX,[ESI+EDI]分为依赖读取ESI和EDI的 uop 和依赖读操作结果以及EAX的uop。如果指令只有两个依赖输入项,那么uop不会融合。例如,指令ADC EAX,EBX和CMOVE EAX,EBX都有三个输入依赖,EAX,EBX和标志位。但是因为这些指令都是无法融合的,它们都将被分为两条uop去执行。

Uop fusion 有如下的优点:

  • 译码器更加有效,因为融合的指令可以进入三个中的任意一个译码器,但是如果产生两条uop,那么只能进入译码器D0
  • 如果更少的uop被生成,那么寄存器重命名和退休的瓶颈将被环节
  • ROB的容量将会增加,因为融合的uop只占用一项。

如果程序可以从上述优势中获益,那么它更倾向于使用被融合的指令。如果只是一条两条指令是瓶颈,那么uop fusion没有必要,因为融合的指令又会被分配进两个执行单元。

Manual 4 中的表格,指令表格说明了融合和未融合的uop指令。uop fused domain说明了译码器生成的uop条数。uops unfused domain 说明了进入每个执行单元的uops指令的个数。融合的uops在执行单元中被切分执行,因此融合的内存写操作在port3和port4中都被列上。融合的读->修改操作 在port2 和port0 中被列上。"uops 融合域" 的uop数目总和比"uops 未融合域"uop总和少的就是融合的指令。

表格的部分截图:


翻译自【Microarchitecture of Intel and AMD CPU  An optimization guide for assembly programmers and compiler makers】

欢迎关注我的公众号《处理器与AI芯片》

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值