指令表中缺少延迟

Missing latency in instruction tables

我目前正在查看 Agner Fog 的 instruction tables 以了解常见指令的延迟。

我希望我没有错过文档中这个问题的答案,但是谁能给我解释一下为什么有些指令没有延迟条目?

例如,操作数 r,r,m 的 PEXT 指令的延迟对于 Skylake 留空?

对缺失延迟的解释是什么?为什么首先很难获得延迟(如果是这种情况)?

不知道 Agner 为什么在他的电子表格中将一些单元格留空。我认为这些都是手工输入的,因为至少有几个相当明显的错别字,例如5 而不是 0.5 用于某物的吞吐量(内存源 vinserti128 或其他东西,IIRC)。

解释是 信息超出了您可以从 CPU 通常的工作方式推断出来的信息。即通常有一个单独的加载 uop 为 ALU uop 供电,并且它通常与寄存器源相同的 ALU uop。但是一些指令可以使用广播负载,例如具有内存源移位计数的 Skylake vpsrld(低元素适用于所有)看起来它使用广播加载 uop 而不是通常的 ALU 洗牌来提供可变移位 uop(如 vpsrlvd 1 p01 的 uop).

对于具有多个输入的多 uop 指令,Agner 仍然只列出 1 个延迟数。这不是一幅完整的图画;有时第一个 uop 只需要一个输入,因此 a -> result > b -> result 的延迟。例如他将 vpsrld(SKL 上的 p01 p5 为 2 微指令)列为 1c 吞吐量/1c 延迟。对于两个输入都为 1c 的结果来说,这显然是不可能的。据推测,Agner 测量了数据输入 -> 输出延迟,其中轮班计数 运行 的广播偏离了关键路径。 (我从它只是 p5 的事实推断 p5 uops 在做什么:洗牌端口。而且 SKL 有 1 uop 可变计数移位。并且它不需要内存中的移位计数。显而易见的结论是这是广播随机播放或加载。)


要获得更完整的延迟数据,请参阅https://www.uops.info/table.html

a full latency breakdown for pext r64, r64, m64:

  • Measurements: Latencies:
    • Latency operand 2 → 1: 3
    • Latency operand 3 → 1 (address): 8
    • Latency operand 3 → 1 (memory): ≤7

到目前为止,他们大多只有 Intel CPU(还有 Zen),但数据来自自动化测试,分别测试每个输入到每个输出。还列出了 IACA 数据。 对于每条指令的每一种形式,都有一个link来详细测试它的结果。

此外,他们对多 uop 指令的 uop 分解更加小心,例如movbe r64, m64 不是 2p0156 + p23,它是 p06 p15 p23(就像 bswap r64 Agner 确实是正确的)。