指令表中缺少延迟

Goa*_*444 5 x86 assembly micro-optimization

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

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

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

丢失延迟的解释是什么,为什么一开始就很难获得延迟(如果是这种情况)?

Pet*_*des 3

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

\n\n

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

\n\n

对于具有多个输入的多微指令指令,Agner 仍然只列出了 1 个延迟数字。这不是一幅完整的图画;有时第一个 uop 仅需要一个输入,因此延迟来自a -> result> b -> result。例如他列出了vpsrld(SKL 上的 p01 p5 为 2 uops)列为 1c 吞吐量/1c 延迟。显然不可能两个输入都为 1c。据推测,Agner 测量了数据输入 -> 输出延迟,并且移位计数的广播偏离了关键路径。(我推断 p5 微指令正在做什么,因为它只是 p5:随机端口。并且 SKL 有 1 个微指令可变计数移位。并且不需要移位计数根据记忆。明显的结论是它是广播随机播放或加载。)

\n\n
\n\n

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

\n\n

它具有以下完整的延迟细分pext r64, r64, m64

\n\n
\n
    \n
  • 测量:延迟:\n \n
      \n
    • 延迟操作数 2 \xe2\x86\x92 1: 3
    • \n
    • 延迟操作数 3 \xe2\x86\x92 1(地址):8
    • \n
    • 延迟操作数 3 \xe2\x86\x92 1(内存):\xe2\x89\xa47
    • \n
  • \n
\n
\n\n

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

\n\n

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

\n