IDK 为什么 Agner 在他的电子表格中将一些单元格留空。我认为这些都是手工输入的,因为至少有几个相当明显的错别字,例如5 而不是 0.5 用于吞吐量(内存源 vinserti128 或其他东西,IIRC)。
解释是除了您可以从 CPU 通常的工作方式推断出的信息之外,还有 零 信息。即,通常有一个单独的加载 uop 为 ALU uop 供电,它通常与带有寄存器源的 ALU uop 相同。但是有些指令可以使用广播负载,例如Skylake vpsrld 具有内存源移位计数(低元素适用于所有)看起来它使用广播加载 uop 而不是通常的 ALU shuffle 来提供可变移位 uop(如 vpsrlvd 1 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
它有a full latency breakdown for pext r64, r64, m64:
- 测量:延迟:
- 延迟操作数 2 → 1:3
- 延迟操作数 3 → 1(地址):8
- 延迟操作数 3 → 1(内存):≤7
到目前为止,他们只有大部分英特尔 CPU(但也有 Zen),但数据来自自动化测试,并分别测试每个输入到每个输出。并列出 IACA 数据。 对于每条指令的每种形式,都有一个指向其详细测试结果的链接。
此外,他们对多 uop 指令的 uop 故障更加小心,例如movbe r64, m64 不是 2p0156 + p23,而是 p06 p15 p23(就像 bswap r64,Agner 确实正确)。