为什么对于许多 SIMD 算法,只有 AVX 的处理器的性能优于 AVX2 处理器

Why do processors with only AVX out-perform AVX2 processors for many SIMD algorithms?

本文关键字:处理器 性能 AVX2 AVX 只有 于许多 SIMD 算法 为什么      更新时间:2023-10-16

我一直在研究 C# 和 C++ 中 SIMD 算法的优势,发现在许多情况下,在 AVX 处理器上使用 128 位寄存器比在具有 AVX2 的处理器上使用 256 位寄存器提供更好的改进,但我不明白为什么。

我所说的改进是指 SIMD 算法相对于同一台机器上的非 SIMD 算法的加速。

在 AVX 处理器上,256 位寄存器和浮点单元的上半部分在不执行 AVX 指令(VEX 编码操作码)时由 CPU 关闭。当代码确实使用 AVX 指令时,CPU 必须为 FP 单元供电 - 这大约需要 70 微秒,在此期间 AVX 指令实际上使用 128 微操作执行两次。

当大约 700 微秒未使用 AVX 指令时,CPU 会再次关闭电路的上半部分。

现在它这样做是因为电路的上半部分消耗功率(doh!),因此产生热量(双doh!)。这意味着当使用 AVX 指令时,CPU 运行得更热。因此,鉴于CPU在具有热余量时可以"涡轮增压",使用AVX指令会减少这种机会,实际上,CPU实际上降低了"基本时钟速度"。因此,例如,如果你有一个正式时钟在2.3GHz的CPU可以涡轮增压到2.7,当你开始使用AVX指令时,芯片的时钟会降低到2.1,而升压到只有2.3,在极端情况下,基本时钟可能会减少到1.9(见本文第2-4页)。

在这个阶段,您的 CPU 执行所有指令大约 10-15%,甚至可能比不使用 AVX 指令时慢 20%。如果您要执行大量 SIMD 操作,那么 256 位宽的指令就值得这样做。但是,如果您正在执行一些AVX指令,然后是"正常"代码,然后再次执行一些AVX,那么这种时钟速度损失将超过您单独从AVX中获得的所有收益。

这就是为什么 128 位宽的 SIMD 可以比 256 位宽运行得更快的原因,除非您有长时间密集的 SIMD 主导的操作突发。使用其余的硅是有代价的......(或者更准确地说,是不使用它的奖励,我们有时会忘记我们得到了)。

(来自对问题的评论)

如果算术运算不是算法执行的瓶颈,那么使用 SIMD 将无法提供加速。其他瓶颈可能是内存带宽、缓存大小、内存速度、缓存速度。如果采用 AVX 的处理器在这些方面优于 AVX2 处理器,那么它将从使用 SIMD 内部函数中获益更多。