首页 > 解决方案 > 指令表中缺少延迟

问题描述

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

我希望我没有错过文档中这个问题的答案,但是任何人都可以向我解释为什么对于某些说明,没有延迟条目?

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

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

标签: assemblyx86micro-optimization

解决方案


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

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

对于具有多个输入的多指令,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

它有一个完整的延迟细分pext r64, r64, m64

  • 测量: 延迟:
    • 延迟操作数 2 → 1: 3
    • 延迟操作数 3 → 1(地址):8
    • 延迟操作数 3 → 1(内存):≤7

到目前为止,他们只有大部分英特尔 CPU(但也有 Zen),但数据来自自动化测试,并分别测试每个输入到每个输出。并列出 IACA 数据。 对于每条指令的每种形式,都有一个指向其详细测试结果的链接。

此外,他们对多指令指令的 uop 故障更加小心,例如movbe r64, m64,不是 2p0156 + p23,而是 p06 p15 p23(就像bswap r64Agner 确实正确的那样)。


推荐阅读