英特尔内在函数指南 - 延迟和吞吐量

Phi*_*tor 12 performance x86 sse intel intrinsics

有人可以解释英特尔内部指南中给出的延迟和吞吐量值吗?

我是否正确理解延迟是指令运行所需的时间单位,吞吐量是每个时间单位可以启动的指令数量?

如果我的定义是正确的,为什么某些指令的延迟在较新的CPU版本上更高(例如mulps)?

Pet*_*des 10

缺少该表:Broadwell的MULPS延迟:3.在Skylake:4.

在这种情况下,内在探测器的延迟是准确的,尽管它偶尔与Agner Fog的实验测试不匹配.(VEXTRACTF128延迟可能是英特尔在其表中不包括旁路延迟的情况). 有关如何处理吞吐量和延迟数量以及它们对现代无序CPU的意义的更多详细信息,请参阅我对该链接问题的回答.

MULPS延迟确实从4(Nehalem)增加到5(Sandybridge).这可能是为了节省功耗或晶体管,但更可能是因为SandyBridge将uop延迟标准化为仅几个不同的值,以避免回写冲突:即当相同的执行单元在同一周期中产生两个结果时,例如从启动2c uop一个循环,然后1c uop下一个循环.

这简化了uop调度程序,它将uop从预留站发送到执行单元.或多或少在最早的第一顺序中,但它必须过滤哪些输入准备就绪.调度程序耗电,这是无序执行的功耗成本的重要部分.(遗憾的是,制作一个以关键路径优先顺序选择uop的调度程序是不切实际的,以避免独立的uops从资源冲突的关键路径中窃取周期.)

Agner Fog解释了同样的事情(在他的microarch pdf的SnB部分):

混合具有不同延迟的μops

如第114页所述,当具有不同延迟的μops发布到同一执行端口时,先前的处理器会发生回写冲突.此问题在Sandy Bridge上得到很大解决.执行延迟是标准化的,所以延迟为3的所有μop都发送到端口1,所有具有延迟为5的μop进入端口0.μops,延迟为1可以转到端口0,1或5.没有其他延迟允许,除了除法和平方根.

延迟的标准化具有避免回写冲突的优点.缺点是一些μops具有比所需更高的延迟.

嗯,我刚才意识到Agner的数字VEXTRACTF128 xmm, ymm, imm8很奇怪.Agner将其列为SnB上的1 uop 2c延迟,但英特尔将其列为1c延迟(如此处所述).也许执行单元的延迟是1c,但是在使用结果之前,有一个内置的1c旁路延迟(用于交叉?).这可以解释英特尔的数字与Agner的实验测试之间的差异.


一些指令仍然是2c延迟,因为它们解码为2个依赖的uop,每个延迟为1c.MULPS是单个uop,甚至是AVX 256b版本,因为即使是Intel的第一代AVX CPU也有全宽256b执行单元(除了div/sqrt单元).需要两倍的FP乘法器电路副本是优化它以节省延迟成本来节省晶体管的一个很好的理由.


这种模式适用于包括Broadwell,AFAICT在内的搜索Agner表.(使用LibreOffice,我选择了整个表,并做了data-> filter->标准过滤器,并查找列C = 1和列F = 4的行.(然后重复2.)查找任何uops加载或存储.

Haswell坚持只有1,3和5个周期ALU uop延迟的模式(AESENC/AESDEC除外,对于端口5具有1 uop,具有7c延迟.当然还有DIVPS和SQRTPS).还有CVTPI2PS xmm, mm,1 uop 4c延迟,但也许是p1 uop的3c和旁路延迟1c,Agner Fog测量它或不可避免的方式. VMOVMSKPS r32, ymm也是2c(对于r32,xmm版本为3c).

Broadwell将MULPS延迟降至3,与ADDPS相同,但保持FMA为5c.据推测,他们想出了如何在不需要添加时简化FMA单元以产生乘法.


Skylake能够处理延迟= 4的微操作.FMA,ADDPS/D和MULPS/D = 4个周期的延迟.(SKL放弃了专用的矢量-FP添加单元,并使用FMA单元完成所有操作.因此,ADDPS/D吞吐量加倍,以匹配MULPS/D和FMA ... PS/D.我不确定哪个更改激发了什么,如果他们不想放弃vec-FP加法器而不会太严重损害ADDPS延迟,他们是否会引入4c延迟指令.)

具有4c延迟的其他SKL指令:PHMINPOSUW(低于5c),AESDEC/AESENC,CVTDQ2PS(高于3c,但这可能是3c +旁路),RCPPS(低于5c),RSQRTPS,CMPPS/D(高于3c) .嗯,我猜FP比较是在加法器中完成的,现在必须使用FMA.

MOVD r32, xmmMOVD xmm, r32被列为2c中,或许从int-VEC旁路延迟为int?或者是Agner测试中的一个小故障?测试延迟需要其他指令来创建回到xmm的往返.这是HSW的1c.Agner将SKL MOVQ r64, xmm列为2个周期(port0),但是将其MOVQ xmm, r64列为1c(port5),读取64位寄存器比读取32位寄存器更快,这似乎非常奇怪.阿格纳过去在他的餐桌上犯过错误; 这可能是另一个.