有人可以解释Intel Intrinsic Guide中给出的延迟和吞吐量值吗?
我是否正确理解延迟是指令运行所需的时间单位,吞吐量是每个时间单位可以启动的指令数量?
如果我的定义是正确的,为什么某些指令的延迟会在较新的CPU版本上更高(例如mulps
)?
答案 0 :(得分:9)
缺少该表:Broadwell的MULPS延迟:3。在Skylake:4。
在这种情况下,内在查找程序的延迟是准确的,尽管it occasionally doesn't match Agner Fog's experimental testing。 (VEXTRACTF128延迟可能是英特尔在其表中不包括旁路延迟的情况)。 有关吞吐量和延迟数量的详细信息,以及它们对现代无序CPU的意义,请参阅my answer on that linked question。
MULPS延迟确实从4(Nehalem)增加到5(Sandybridge)。这可能是为了节省功率或晶体管,但更可能是因为SandyBridge将uop延迟标准化为仅几个不同的值,以避免回写冲突:即,当相同的执行单元在同一周期中产生两个结果时,例如,从开始2c uop一个循环开始,然后在下一个循环开始1c uop。
这简化了uop调度程序,它将uop从预留站发送到执行单元。或多或少在最早的第一顺序中,但它必须过滤哪些输入准备就绪。调度程序耗电,这是无序执行的功耗成本的重要部分。 (遗憾的是,制作一个以关键路径优先顺序选择uops的调度程序是不切实际的,以避免having independent uops steal cycles from the critical path with resource conflicts.)
Agner Fog explains the same thing (in the SnB section of his microarch pdf):
嗯,我刚才意识到Agner的Mixing μops with different latencies
以前的处理器在μops时有回写冲突 不同的延迟发布到同一个执行端口,如 在第114页描述。这个问题在很大程度上解决了桑迪 桥。执行延迟是标准化的,所以所有的μops都有 延迟3发布到端口1和所有μops,延迟为5 go 延迟为0.μs,延迟为1可以转到端口0,1或5.没有其他 允许延迟,除了除法和平方根。
延迟的标准化具有回写的优点 避免冲突。缺点是一些μops有更高 延迟超过必要。
VEXTRACTF128 xmm, ymm, imm8
数字很奇怪。 Agner将其列为SnB上的1 uop 2c延迟,但英特尔将其列为1c延迟(as discussed here)。也许执行单元的延迟是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, xmm
和MOVD xmm, r32
列为2c,也许是从int-vec到int的旁路延迟?或者是Agner测试中的一个小故障?测试延迟需要其他指令来创建回到xmm的往返。这是HSW的1c。 Agner将SKL MOVQ r64, xmm
列为2个周期(port0),但将MOVQ xmm, r64
列为1c(port5),读取64位寄存器比读取32位寄存器更快,这似乎非常奇怪。阿格纳过去在他的餐桌上犯过错误;这可能是另一个。