问题描述
我只能找到 128 位版本的 Vector Dot Product AVX/SIMD 指令
- 有 512 位版本吗?
- 如果没有(我找不到它们),您有什么想法吗?这似乎是一个相当重要的指令族,至少在我看来,对于各种应用程序,其中最重要的是对 zmm 的元素求和?向量。
解决方法
dpps
通常只有在您“错误地”使用 SIMD 时才会有用(效率低下),用于向量内的水平操作而不是跨多个向量的垂直操作。 (有时,如果您可以在不重新设计许多现有代码使用的某些数据结构的情况下获得一些加速,或者如果数据的其他用例更重要,那么您无论如何都会这样做。)
Slides + text: SIMD at Insomniac Games (GDC 2015) 有一些关于将数据结构设计为 SIMD 友好的好东西(SoA 与 AoS),以及如何比滥用 SIMD 向量来保存 x,y,z 几何体提供更好的加速矢量。
我只能找到 128 位版本的 Vector Dot Product AVX/SIMD 指令
AVX1 includes vdpps ymm,ymm,ymm/m256,imm8
。它在 YMM 的两个通道中执行两个独立的 128 位 DPPS 操作,就像大多数其他水平/混洗指令一样,这些指令在 AVX,尤其是 AVX2 中以不太有用的方式扩展。也许这就是你的意思?
这似乎是一个相当重要的指导家庭
完全没有。它仅对 2 到 4 个元素的点积有用,并且无论如何解码为多个 uops。如果它完全满足您的需要,那么值得在 Intel 上使用,但 AMD 只是对其进行了微编码。 https://uops.info/ / https://agner.org/optimize/。或者至少在 Ice Lake 之前的 Intel 也大多“放弃”了它,解码为 6 uop(14c 延迟),高于 Skylake 中的 4(13c 延迟)vdpps xmm
。仍然没有 Zen 的 8 uops(15c 延迟)那么糟糕。
4 元素 SIMD 向量中 3 个元素的几何向量 get (ab)used some;这就是 dpps 的用途。 (有时可能是 3x3 或 4x4 矩阵之类的东西,甚至可能是 2x2。)vdpps ymm
的两个单独的车道内 DPPS 操作可能比为结构数组 (AoS) 数据格式获得一些 SIMD 好处更有用单个 8 宽操作。
dpps
对较大数组的点积没有用。 对于数组,FMA 到多个累加器中,您只能在最后水平组合, 就像在 Improving performance of floating-point dot-product of an array with SIMD 中一样。另请参阅 this Q&A 以了解一些性能调整实验。
交叉路口 vdpps
不值得在执行单元中构建更多专用硬件,而只是让软件处理 5 个或更多元素的数组或对其进行微编码。 AVX-512 屏蔽使 immediate control operand of dpps
的价值降低。 (立即数让您忽略一些输入元素,零与广播结果到您选择的元素,带有两个 4 位位掩码。)
这就引出了另一点:vdpps
已经使用了立即数中的所有位。(YMM 版本对两半使用相同的立即数控制)。因此,在不改变直接工作方式的情况下,没有空间将其扩展到 8 宽操作。 (例如,可能总是广播,丢弃输出 0 掩码,因此您为 YMM 中的 8 个浮点数中的每一个输入控制掩码位?但这需要与 xmm 版本所需的硬件分开的自定义硬件。
请注意,无需任何特殊说明/uop,您可以使用 vdpps
和水平总和执行与 vmulps
相同的操作(忽略立即数的功能)。 (vshufps
/ vaddps
/ vshufps
/ vaddps
将结果广播到每个元素。)英特尔的硬件支持将其从 5 uop 降低到 4 uop(包括处理屏蔽) 在 Skylake 上,3p01(FP 数学执行单元)加上 1 p5(shuffle 单元)。
(不幸的是 haddps
无法利用任何水平 FP 硬件:/)
Ice Lake 肯定放弃了一些这种专用硬件,因为它很少使用;那里是 6 uop。 (这 2 个额外的 uops 用于 p0/p6 和 p1/p5,所以也许是洗牌,也许是将立即数变成掩码的东西?即使在冰湖,AFAIK,端口 6 也没有任何向量 ALU 执行单元。)>
将 dpps 使用的专用硬件复制到更宽的 AVX-512 向量宽度可能不值得花费晶体管成本。 512 位对于 CPU 来说非常宽; FMA 单元已经占据了很大的面积,并且 AVX-512 引入了一系列新指令,包括更多的车道交叉洗牌,这些指令在大多数情况下比更宽的 vdpps zmm
在大多数情况下更有用代码。
通常 dpps
仅在您使用 SIMD 错误时才有用。