英特尔指令集指南-延迟和吞吐量

14

有人可以解释一下英特尔指令集手册中给出的延迟和吞吐量值吗?

我理解得对吗,延迟是指指令运行所需的时间单位数量,而吞吐量则是每个时间单位内可启动的指令数?

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


1
哦,不对,这些延迟时间似乎包括了某种奇怪的L1访问。其中从2个周期增加到3个周期。建议搜索“agner fog指令表”来获取更准确的信息。 - Hans Passant
1
@HansPassant:不,英特尔的时序在这种情况下与Agner Fog的表格完全匹配。你为什么认为他们包括L1加载使用延迟? - Peter Cordes
1
这个网页有关于延迟和吞吐量值的解释:https://software.intel.com/en-us/articles/measuring-instruction-latency-and-throughput - Harald
1个回答

14

这张表中缺少的是Broadwell上MULPS的延迟为3,Skylake上为4。

在这种情况下,内部查找器的延迟是准确的,尽管它偶尔与Agner Fog的实验测试不匹配。(那个VEXTRACTF128的延迟可能是因为英特尔没有在他们的表格中包括旁路延迟)。有关吞吐量和延迟数字以及它们对于现代乱序CPU的含义,请参见我在链接问题上的回答以获取更多详细信息。

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

这简化了uop调度器,该调度器将uops从保留站分派到执行单元,大多按照最旧的优先顺序,但必须通过选择哪些输入已准备好来过滤。调度器耗电量很大,这是乱序执行的功率成本的重要组成部分。 (不幸的是,不实际制作一个按关键路径优先顺序选择uops的调度程序,以避免独立uops由于资源冲突从关键路径中窃取周期。)

Agner Fog在他的微架构pdf的SnB部分解释了同样的内容。

混合不同延迟的μops

之前的处理器在将具有不同延迟的μops发布到同一执行端口时存在写回冲突,如第114页所述。这个问题在Sandy Bridge上得到了很大程度的解决。执行延迟被标准化,所有延迟为3的μops都会被分配到端口1,所有延迟为5的μops都会被分配到端口0。延迟为1的μops可以分配到端口0、1或5。除了除法和平方根之外,不允许使用其他延迟。

延迟的标准化有一个好处,即避免写回冲突。缺点是某些μops的延迟比必要的要高。

嗯,我突然意识到 Agner 给 VEXTRACTF128 xmm, ymm, imm8 的数据有些奇怪。Agner 在 SnB 上将其列为 1 个操作码,2 个时钟周期的延迟,但是 Intel 将其列为 1 个时钟周期的延迟(如此讨论)。也许执行单元是 1 个时钟周期的延迟,但在使用结果之前有内置的 1 个时钟周期旁路延迟(用于跨越通道吗?)。这可以解释 Intel 数据和 Agner 实验测试之间的差异。


一些指令仍然需要2个时钟周期的延迟,因为它们解码为2个依赖于彼此的微操作,每个微操作需要1个时钟周期。即使是AVX 256b版本,MULPS也只有一个微操作,因为即使是英特尔第一代AVX CPU也具有全宽度的256b执行单元(除了除法/平方根单元)。需要两倍的FP乘法器电路副本是优化以节省晶体管成本的好理由,但会牺牲延迟。
This pattern holds up to and including Broadwell, as far as I can tell from searching Agner's tables. (使用LibreOffice,选择整个表格,进行数据->筛选->标准筛选,并查找列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和1个旁路延迟,Agner Fog测量的方式或者是无法避免的。VMOVMSKPS r32,ymm也是2c(相对于r32,xmm版本的3c)。
Broadwell将MULPS延迟降低到3,与ADDPS相同,但保持FMA为5c。 可能他们想出了如何在不需要加法时快捷地缩短FMA单元以仅产生乘法。
Skylake可以处理延迟为4的uops。FMA、ADDPS/D和MULPS/D的延迟为4个周期。(SKL取消了专用的向量-FP加法器,并使用FMA单元进行所有操作。因此,ADDPS/D的吞吐量增加一倍以匹配MULPS/D和FMA...PS/D。我不确定哪个变化促使了什么,以及是否在没有严重影响ADDPS延迟的情况下放弃了向量-FP加法器是否会引入4c延迟指令。)
其他具有4c延迟的SKL指令:PHMINPOSUW(从5c降至4c),AESDEC/AESENC,CVTDQ2PS(从3c升至4c,但这可能是3c +旁路),RCPPS(从5c降至4c),RSQRTPS,CMPPS/D(从3c升至4c)。嗯,我想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位寄存器更快似乎极为奇怪。Agner过去在表格中出现过错误,这可能是另一个错误。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接