我目前正在研究一些优化并比较 DSP 应用程序的矢量化可能性,这对于 AVX512 来说似乎是理想的选择,因为这些只是简单的不相关数组处理循环。但在新的 i9 上,与 AVX2 相比,使用 AVX512 时我没有测量到任何合理的改进。有什么指点吗?有什么好的结果吗? (顺便说一句。我尝试了MSVC/CLANG/ICL,没有明显的区别,很多时候AVX512代码实际上看起来更慢)
这看起来太宽泛了,但实际上有一些微架构细节值得一提。
请注意,AVX512-VL(矢量长度)允许您使用新的 AVX512 指令(如打包uint64_t
double
128 和 256 位向量上的转换、掩码寄存器等)。现代编译器在针对 Skylake-AVX512(又名 Skylake-X)进行调整时通常会使用 256 位向量进行自动向量化。例如gcc -march=native
or gcc -march=skylake-avx512
,除非您覆盖调整选项以将首选向量宽度设置为 512,以便进行权衡的代码。请参阅@zam 的回答。
512 位向量的一些主要内容(不是 256 位的 AVX512 指令,例如vpxord ymm30, ymm29, ymm10
)在 Skylake-X 上是:
将数据与向量宽度对齐比 AVX2 更重要(每个未对齐的负载都会跨越缓存行边界,而不是在数组上循环时每隔一个)。在实践中,它会产生更大的差异。我完全忘记了我不久前测试过的具体结果,但可能有 20% 的速度减慢,而错位导致的速度减慢不到 5%。
-
运行 512 位微指令会关闭端口 1 上的矢量 ALU。(但不会关闭端口 1 上的整数执行单元)。某些 Skylake-X CPU(例如 Xeon Bronze)每个时钟只有 1 个 512 位 FMA 吞吐量,但 i7 / i9 Skylake-X CPU 和更高端的 Xeon 在端口 5 上有一个额外的 512 位 FMA 单元,可为AVX512“模式”。
因此,请相应地进行计划:从扩展到 AVX512,您不会获得双倍的速度,并且代码中的瓶颈现在可能位于后端。
运行 512 位微指令还会限制最大 Turbo,因此挂钟加速可能低于核心时钟周期加速。 Turbo 缩减有两个级别:任何 512 位操作,然后heavy512 位,如持续的 FMA。
-
FP除法执行单元为vsqrtps/pd zmm
and vdivps/pd
is not全屏宽度;它只有 128 位宽,因此 div/sqrt 与乘法吞吐量的比率大约差了 2 倍。参见浮点除法与浮点乘法。 SKX 吞吐量为vsqrtps xmm/ymm/zmm
每 3/6/12 个周期 1 次。double
-精度是相同的比率,但吞吐量和延迟更差。
对于 256 位 YMM 向量,延迟与 XMM 相同(sqrt 为 12 个周期),但对于 512 位 ZMM,延迟高达 20 个周期,并且需要 3 uops。 (https://agner.org/optimize/用于指令表。)
如果您在除法器上遇到瓶颈并且无法在混合中获得更多其他指令,VRSQRT14PS
即使您需要牛顿迭代才能获得足够的精度,也值得考虑。但请注意 AVX512 的近似值1/sqrt(x)
确实比 AVX/SSE 有更多的保证精度位。)
就自动向量化而言,如果需要任何洗牌,编译器可能会在使用更宽的向量时做得更差。对于简单的纯垂直内容,编译器可以使用 AVX512。
你之前的问题有一个sin
函数,也许如果编译器/SIMD 数学库只有 256 位版本,它就不会使用 AVX512 自动矢量化。
如果 AVX512 没有帮助,可能您遇到了内存带宽瓶颈。使用性能计数器进行分析并找出答案。或者尝试多次重复较小的缓冲区大小,看看当缓存中的数据很热时,速度是否会显着提高。如果是这样,请尝试缓存阻止您的代码,或者通过对数据进行一次更多操作来增加计算强度。
AVX512 在 i9 上实现了理论最大 FMA 吞吐量的两倍(以及整数乘法,以及在同一执行单元上运行的许多其他功能),使 DRAM 和执行单元之间的不匹配增加了一倍。因此,更好地利用 L2 / L1d 缓存可以获得两倍的收益。
在数据已经加载到寄存器中时处理数据是很好的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)