【问题标题】:Missing latency in instruction tables指令表中缺少延迟
【发布时间】:2020-01-01 22:43:23
【问题描述】:

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

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

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

对丢失的延迟有什么解释,为什么一开始就很难得到延迟(如果是这样的话)?

【问题讨论】:

    标签: assembly x86 micro-optimization


    【解决方案1】:

    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 确实正确)。

    【讨论】:

      猜你喜欢
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多