【问题标题】:Long latency instruction长延迟指令
【发布时间】:2020-02-22 06:34:07
【问题描述】:

我想要一个长延迟的单微指令 x861 指令,以便创建长依赖链作为测试微架构功能的一部分。

目前我正在使用fsqrt,但我想知道有没有更好的东西。

理想情况下,该指令将在以下标准上获得高分:

  • 延迟时间长
  • 稳定/固定延迟
  • 一个或几个微指令(尤其是:非微编码)
  • 消耗尽可能少的 uarch 资源(加载/存储缓冲区、页面遍历器等)
  • 能够与自身链接(延迟)
  • 能够与 GP 寄存器链接输入和输出
  • 不干扰正常的 OoO 执行(除了它消耗的任何 ROB、RS 等资源)

所以fsqrt 在大多数意义上是可以的,但延迟并不长,而且似乎很难与 GP regs 链接。


1 特别是在现代 Intel x86 上,如果它也能在 AMD Zen* 上运行良好,则可获得奖励积分。

【问题讨论】:

    标签: optimization x86 cpu-architecture micro-optimization microbenchmark


    【解决方案1】:

    主流 Intel CPU 没有任何延迟很长的单 uop 整数指令。所有 ALU 端口上都有用于 1 周期延迟微指令的整数 ALU,端口 1 上有 3 周期延迟流水线 ALU。我认为 AMD 类似。

    div/sqrt 单元是唯一真正的高延迟 ALU,但整数 div/idiv 在 Intel 上是微编码的,所以是的,使用 FP,其中 div/sqrt 通常是单微指令。

    AMD 的整数 div / idiv 是 2-uop 指令(大概是写 2 个输出),具有与数据相关的延迟。

    此外,AMD Bulldozer/Piledriver(其中 2 个整数内核共享一个 SIMD/FP 单元)对于 movd xmm, r32(10c 2 微指令)和 movd r32, xmm(8c 1 微指令)具有相当高的延迟。 Steamroller 将其缩短 1c。 Ryzen 在任一方向都有 3 周期 1 uop。

    movd 到/从 XMM regs 在 Intel 上很便宜:具有 1 周期(Broadwell 和更早版本)或 2 周期延迟(Skylake)的单 uop。 (https://agner.org/optimize/)


    sqrtss 具有固定延迟(在 IvB 及更高版本上),除了可能低于正常输入。如果您的整数链仅涉及任意整数位模式的movd xmm, r32,您可能需要设置 DAZ/FTZ 以消除 FP 辅助的可能性。 NaN 输入很好;这不会导致 SSE/AVX 数学变慢,只有 x87。

    其他 CPU(Sandybridge 及更早版本,以及所有 AMD)具有可变延迟 sqrtss,因此您可能希望在那里控制起始位模式。

    如果您想使用sqrtsd 以获得比sqrtss 更高的每微指令延迟,也是如此。即使在 Skylake 上,它仍然是可变延迟。 (15-16 个周期)。

    您可以假设延迟是输入位模式的纯函数,因此每次使用相同的输入启动sqrtss 指令链将给出相同的延迟序列。或者使用0.01.0+infNaN 的起始输入,序列中的每个微指令都将获得相同的延迟。

    (简单的输入,如 1.0 和 0.0(输入和输出中的有效数字很少)可能以最低的延迟运行。sqrt(1.0) = 1.0 和 sqrt(0) = 0,所以这些是自我延续的。对于sqrt(NaN) = NaN)

    您可以使用and reg, 0 或其他非深度中断归零作为链的一部分来控制输入位模式。或者也许 or reg, -1 创建 NaN。然后,您可以在 Sandybridge 或更早版本以及包括 Zen 在内的 AMD 上获得固定延迟。

    或者pinsrw xmm0, eax, 7(Intel 上的端口 5 为 2 微指令)仅修改 XMM 的高 qword,而将底部保留为已知的 0.01.0。可能比只使用 0 的 and 和使用 movd 更便宜,除非端口 5 压力不是问题。


    要创建吞吐量瓶颈(而不是延迟),您在 Skylake 上的最佳选择是 vsqrtpd ymm - p0 为 1 uop,延迟 = 15-16,吞吐量 = 9-12。

    在 Broadwell 和更早的版本上,它是 3 uops (2p0 p15),但我认为 Skylake 扩大了 SIMD 分隔线(我猜是为 AVX512 做准备)。

    【讨论】:

      【解决方案2】:

      vsqrtss 可能比fsqrt 好一些,因为它至少满足与 GP 寄存器相对容易的链接(因为 GP 向量只是一个 movd 之外)。

      【讨论】:

      • 我假设您搜索了 Agner Fog 的说明表来确定合适的候选人?我查看了 SkylakeX 的表格,没有找到比 vsqrtss 更好的要求列表。
      • @njuffa 我浏览了一遍,但我不想说我是详尽无遗的。当然,可能有一个我没有考虑过,或者可能有一种完全不同的方法没有反映在 Agner 的表中(例如,用通常不是长延迟的指令触发长延迟的某种方式)。
      • @njuffa - 另请注意,我认为不能一次满足所有标准,所以仍然需要指出“如果您想要非常长的延迟但愿意放弃 XYZ,那么请尝试foo" 类型的东西。
      猜你喜欢
      • 2012-10-16
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 2015-10-19
      相关资源
      最近更新 更多