为什么不存在更宽版本的 VDPPD / VDPPS,例如 512 位?

Why don't wider versions of VDPPD / VDPPS exist, like 512-bit bit?

我只能找到 128 位版本的向量点积 AVX/SIMD 说明

  1. 有 512 位版本吗?
  2. 如果没有(我找不到它们),请问您知道为什么吗?对于各种应用程序来说,这似乎是一个相当重要的指令族,至少在我看来,其中最重要的是对 zmm 的元素求和?向量。

dpps 通常仅在您使用 SIMD“错误”(效率低下)时首先有用,用于向量内的水平操作而不是垂直操作多个向量。 (有时,如果您可以在不重新设计许多现有代码使用的某些数据结构的情况下获得一些加速,或者如果数据的其他用例更重要,那么您有时还是会这样做。)

Slides + text: SIMD at Insomniac Games (GDC 2015) 有一些关于将数据结构设计为 SIMD 友好(SoA 与 AoS)的好东西,以及与滥用 SIMD 向量来保存 x、y、 z 几何向量。


I have only been able to find 128-bit versions of the Vector Dot Product AVX/SIMD instructions

AVX1 includes vdpps ymm, ymm, ymm/m256, imm8。它在 YMM 的两个通道中执行两个独立的 128 位 DPPS 操作,就像大多数其他水平/洗牌指令一样,这些指令在 AVX 中以不太有用的方式得到扩展,尤其是 AVX2。也许这就是你的意思?

It seems like a reasonably important instruction family

完全没有。它 对 2 到 4 个元素的点积有用,并且无论如何都会解码为多个 uops。如果它完全满足您的需要,那么值得在 Intel 上使用,但 AMD 只是对其进行微编码。 https://uops.info/ / https://agner.org/optimize/。或者至少在 Ice Lake 之前的 Intel 也大多“放弃”它,解码为 6 uops(14c 延迟),高于 Skylake 中的 4(13c 延迟)vdpps xmm。仍然没有 Zen 的 8 微指令(15c 延迟)那么糟糕。

4 元素 SIMD 向量中的 3 个元素的几何向量得到(ab)使用了一些;这就是 dpps 的目的。 (有时可能是 3x3 或 4x4 矩阵之类的东西,甚至可能是 2x2。)vdpps ymm 的两个单独的通道内 DPPS 操作可能比获得结构数组 (AoS) 数据格式的一些 SIMD 优势更有用。单个 8 宽操作。

dpps 对于较大数组的点积没有用。 对于数组,FMA 到多个累加器中,你只能在最后水平组合, 就像 Improving performance of floating-point dot-product of an array with SIMD. See also 中的一些性能调整实验。


车道交叉点 vdpps 不值得在执行单元中构建更多专用硬件,而只是让软件处理 5 个或更多元素的数组或对其进行微编码。 AVX-512 掩码使 immediate control operand of dpps 的价值降低。 (立即数让您忽略一些输入元素,并将结果归零或广播到您选择的元素,使用两个 4 位位掩码。)

这又引出了另一点:vdpps已经使用了立即数中的所有位。(YMM 版本对两半使用相同的立即数控制)。因此,如果不改变 immediate 的工作方式,就没有空间将其扩展到 8 个范围的操作。 (例如,可能总是广播,丢弃输出 0 掩码,所以你为 YMM 中的 8 个浮点数中的每一个都设置了一个输入控制掩码位?但这将需要与 xmm 版本所需的硬件分开的自定义硬件)。

请注意,无需任何特殊指令/微指令,您可以使用 vmulps 执行与 vdpps 相同的操作(忽略立即数的功能),然后进行水平求和。 (vshufps / vaddps / vshufps / vaddps 将结果广播到每个元素。)英特尔的硬件支持将其从 5 微指令降低到 4 微指令(包括处理屏蔽) 在 Skylake 上,3p01(FP 数学执行单元)加上 1 p5(洗牌单元)。

(不幸的是 haddps 无法利用任何水平 FP 硬件 :/)

Ice Lake 一定放弃了一些这种专用硬件,因为它很少使用;那里是 6 微秒。 (这 2 个额外的 uops 用于 p0/p6 和 p1/p5,所以也许是洗牌,也许是将立即数变成掩码的东西?端口 6 即使在 Ice Lake 中也没有任何向量 ALU 执行单元,AFAIK .)

将 dpps 使用的专用硬件复制到 AVX-512 的更宽矢量宽度可能不值得晶体管成本。 512 位对于 CPU 来说非常宽; FMA 单元已经占据了很大的面积,并且 AVX-512 引入了一系列新指令,包括更多的车道交叉洗牌,这些指令在大多数情况下比更宽的 vdpps zmm 平均更有用代码。

通常 dpps 仅在您使用 SIMD 时首先有用 错误