7

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

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

4

2 回答 2

13

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

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

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

在这个阶段,你的 CPU 执行所有指令大约比不使用 AVX 指令时慢 10-15%,甚至可能慢 20%。如果您正在执行大量 SIMD 操作,那么 256 位宽的指令会让这一切变得有价值。但是,如果您正在执行一些 AVX 指令,然后是“正常”代码,然后又是一些 AVX,那么这种时钟速度损失将比您仅从 AVX 获得的所有收益都要多。

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

于 2017-06-04T11:43:55.320 回答
3

(来自对问题的评论)

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

于 2016-03-16T09:09:16.590 回答