该表中缺少:Broadwell 上的 MULPS 延迟:3。在 Skylake 上:4。
在这种情况下,内在查找器的延迟是准确的,尽管 it occasionally doesn't match Agner Fog's experimental testing。 (VEXTRACTF128 延迟可能是英特尔在其表中未包括旁路延迟的情况)。 请参阅my answer on that linked question,详细了解如何处理吞吐量和延迟数字,以及它们对现代无序 CPU 的意义。
MULPS 延迟确实从 4 (Nehalem) 增加到 5 (Sandybridge)。这可能是为了节省功率或晶体管,但更可能是因为 SandyBridge 将 uop 延迟标准化为仅几个不同的值,以避免写回冲突:即当同一个执行单元在同一个周期中产生两个结果时,例如从开始一个 2c uop 一个周期,然后一个 1c uop 下一个周期。
这简化了微指令调度程序,它将微指令从保留站分派到执行单元。或多或少按最早的优先顺序,但它必须过滤哪些输入已准备好。调度程序很耗电,这是乱序执行的电力成本的重要组成部分。 (不幸的是,为了避免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):
Mixing μops with different latencies
当 μops 使用
不同的延迟被发送到同一个执行端口,如
在第 114 页上进行了描述。这个问题在 Sandy 上得到了很大的解决。
桥。执行延迟是标准化的,因此所有具有
延迟 3 被发送到端口 1 和延迟为 5 的所有微操作
到端口 0。延迟为 1 的微操作可以到端口 0、1 或 5。没有其他
允许延迟,除法和平方根除外。
延迟标准化的优点是回写
避免了冲突。缺点是有些微操作有更高的
延迟超过必要。
嗯,我刚刚意识到 Agner 的 VEXTRACTF128 xmm, ymm, imm8 数字很奇怪。 Agner 在 SnB 上将其列为 1 uop 2c 延迟,但 Intel 将其列为 1c 延迟 (as discussed here)。也许执行单元是 1c 延迟,但是在您可以使用结果之前,有一个内置的 1c 旁路延迟(用于车道交叉?)。这可以解释英特尔的数字与 Agner 的实验测试之间的差异。
一些指令仍然是 2c 延迟,因为它们解码为 2 个依赖 uop,每个 1c 延迟。 MULPS 是单个 uop,即使是 AVX 256b 版本,因为即使是英特尔的第一代 AVX CPU 也具有全宽 256b 执行单元(除/sqrt 单元除外)。需要两倍多的 FP 乘法器电路副本是优化它以节省晶体管但以延迟为代价的一个很好的理由。
此模式适用于并包括 Broadwell,AFAICT 搜索 Agner 的表格。 (使用 LibreOffice,我选择了整个表,然后执行了数据->过滤器->标准过滤器,并查找列 C = 1 和列 F = 4 的行。(然后重复 2。)寻找任何'不加载或存储。
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。我不确定哪个更改激发了什么,以及如果他们不想在不严重损害 ADDPS 延迟的情况下放弃 vec-FP 加法器,他们是否会引入 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 的旁路延迟?还是阿格纳的测试中的一个小故障?测试延迟需要其他指令来创建返回 xmm 的往返。在 HSW 上是 1c。 Agner 将 SKL MOVQ r64, xmm 列为 2 个周期(端口 0),但将 MOVQ xmm, r64 列为 1c(端口 5),读取 64 位寄存器比读取 32 位寄存器更快似乎非常奇怪。阿格纳过去在他的桌子上犯过错误。这可能是另一个。