Intel Intrinsics 指南 - 延迟和吞吐量

Intel Intrinsics guide - Latency and Throughput

有人可以解释 Intel Intrinsic Guide 中给出的延迟和吞吐量值吗?

我是否理解正确,延迟是一条指令执行到 运行 所花费的时间单位,而吞吐量是每个时间单位可以启动的指令数?

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

缺少 table:Broadwell 上的 MULPS 延迟:3。Skylake 上:4。

在这种情况下,内在查找器的延迟是准确的,尽管 . (That VEXTRACTF128 latency may be a case of Intel not including a bypass delay in their table). See 有关如何处理吞吐量和延迟数字的更多详细信息,以及它们对现代乱序的含义 CPU.

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

这简化了 uop 调度程序,它将 uops 从保留站调度到执行单元。或多或少按最旧优先的顺序排列,但它必须根据哪些输入已准备好进行过滤。调度程序非常耗电,这是乱序执行的电力成本的重要组成部分。 (不幸的是,制作一个按关键路径优先顺序选择 uops 的调度程序是不切实际的,以避免

Agner Fog explains the same thing (in the SnB section of his microarch pdf):

Mixing μops with different latencies

Previous processors have a write-back conflict when μops with different latencies are issued to the same execution port, as described on page 114. This problem is largely solved on the Sandy Bridge. Execution latencies are standardized so that all μops with a latency of 3 are issued to port 1 and all μops with a latency of 5 go to port 0. μops with a latency of 1 can go to port 0, 1 or 5. No other latencies are allowed, except for division and square root.

The standardization of latencies has the advantage that write-back conflicts are avoided. The disadvantage is that some μops have higher latencies than necessary.

嗯,我刚刚意识到阿格纳 VEXTRACTF128 xmm, ymm, imm8 的数字很奇怪。 Agner 在 SnB 上将其列为 1 uop 2c 延迟,但 Intel 将其列为 1c 延迟 ()。也许执行单元是 1c 延迟,但是在你可以使用结果之前,有一个内置的 1c 旁路延迟(用于车道交叉?)。这可以解释英特尔的数字与 Agner 的实验测试之间的差异。


一些指令仍然是 2c 延迟,因为它们解码为 2 个相关的 uops,每个 1c 延迟。 MULPS 是单微指令,即使是 AVX 256b 版本,因为即使是英特尔的第一代 AVX CPUs 也有全角 256b 执行单元(divide/sqrt 单元除外)。需要两倍数量的 FP 乘法器电路副本是对其进行优化以以延迟为代价节省晶体管的一个很好的理由。


此模式适用于并包括 Broadwell,AFAICT 从搜索 Agner 的 tables。 (使用 LibreOffice,我选择了整个 table,然后执行数据->过滤器->标准过滤器,并查找列 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 和 1c 旁路延迟可能是 3c,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 放弃了专用的 vector-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,CMP PS/D(从 3c 开始)。嗯,我想 FP 比较是在加法器中完成的,现在必须使用 FMA。

MOVD r32, xmmMOVD xmm, r32 被列为 2c,也许是从 int-vec 到 int 的旁路延迟?还是 Agner 测试中的一个小故障?测试延迟将需要其他指令来创建返回 xmm 的往返行程。在 HSW 上是 1c。 Agner 将 SKL MOVQ r64, xmm 列为 2 个周期(端口 0),但 MOVQ xmm, r64 列为 1c(端口 5),读取 64 位寄存器比读取 32 位寄存器更快似乎非常奇怪。 Agner 过去曾在 table 中犯过错误;这可能是另一个。