有人可以解释一下给出的延迟和吞吐量值 英特尔内部指南?
我是否正确理解延迟是指令运行所需的时间量,吞吐量是每个时间单位可以启动的指令数量?
如果我的定义是正确的,为什么某些指令的延迟在较新的CPU版本上更高(例如 mulps
)?
有人可以解释一下给出的延迟和吞吐量值 英特尔内部指南?
我是否正确理解延迟是指令运行所需的时间量,吞吐量是每个时间单位可以启动的指令数量?
如果我的定义是正确的,为什么某些指令的延迟在较新的CPU版本上更高(例如 mulps
)?
缺少该表:Broadwell的MULPS延迟:3。在Skylake:4。
在这种情况下,内在查找器的延迟是准确的 它偶尔与Agner Fog的实验测试不符。 (VEXTRACTF128延迟可能是英特尔在其表中不包括旁路延迟的情况)。 看到 我对这个相关问题的回答 有关如何处理吞吐量和延迟数量的更多详细信息,以及它们对现代无序CPU的意义。
MULPS延迟确实从4(Nehalem)增加到5(Sandybridge)。这可能是为了节省功率或晶体管,但更可能是因为SandyBridge将uop延迟标准化为仅几个不同的值,以避免回写冲突:即,当相同的执行单元在同一周期中产生两个结果时,例如,从开始2c uop一个循环,然后1c uop下一个循环。
这简化了uop调度程序,它将uop从预留站发送到执行单元。或多或少在最早的第一顺序中,但它必须过滤哪些输入准备就绪。调度程序耗电,这是无序执行的功耗成本的重要部分。 (遗憾的是,制作一个以关键路径优先顺序选择uops的调度程序是不切实际的 独立的uops从资源冲突的关键路径中窃取周期。)
Agner Fog解释了同样的事情(在他的microarch pdf的SnB部分)):
μops时,以前的处理器有回写冲突 不同的延迟发布到同一个执行端口,如 在第114页描述。这个问题在很大程度上解决了桑迪 桥。执行延迟是标准化的,所有μops都有 延迟3发布到端口1和所有μops,延迟为5 go 延迟为0.μs,延迟为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乘法器电路副本是优化它以节省延迟成本来节省晶体管的一个很好的理由。
通过搜索Agner的表格,这种模式可以支持Broadwell,AFAICT。 (使用LibreOffice,我选择了整个表,并做了data-> filter->标准过滤器,并查找列C = 1和列F = 4的行。(然后重复2)。查找任何uops加载或存储。
Haswell坚持只有1,3和5个周期ALU uop延迟的模式(AESENC / AESDEC除外,对于具有7c延迟的port5是1 uop。当然还有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位寄存器更快,这似乎非常奇怪。阿格纳过去在他的桌子上犯了错误;这可能是另一个。