有人可以解释一下英特尔指令集手册中给出的延迟和吞吐量值吗?
我理解得对吗,延迟是指指令运行所需的时间单位数量,而吞吐量则是每个时间单位内可启动的指令数?
如果我的定义正确,为什么某些指令(例如mulps
)在更新的 CPU 版本上的延迟更高呢?
有人可以解释一下英特尔指令集手册中给出的延迟和吞吐量值吗?
我理解得对吗,延迟是指指令运行所需的时间单位数量,而吞吐量则是每个时间单位内可启动的指令数?
如果我的定义正确,为什么某些指令(例如mulps
)在更新的 CPU 版本上的延迟更高呢?
这张表中缺少的是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发布到同一执行端口时存在写回冲突,如第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 实验测试之间的差异。
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位寄存器更快似乎极为奇怪。Agner过去在表格中出现过错误,这可能是另一个错误。