【发布时间】:2016-06-10 08:55:46
【问题描述】:
我一直在研究 C# 和 C++ 中 SIMD 算法的好处,发现在许多情况下,在 AVX 处理器上使用 128 位寄存器比在 AVX2 处理器上使用 256 位寄存器提供更好的改进,但是我不明白为什么。
我所说的改进是指 SIMD 算法相对于非 SIMD 算法在同一台机器上的加速。
【问题讨论】:
-
@eoinmullan 你似乎在不同的机器上测试东西。说使用 AVX 在 Ivy Bridge 上获得 2 倍加速并不意味着在使用 AVX2 的 Haswell 上获得超过 2 倍。如果机器具有不同数量的内存带宽,则肯定是这种情况。你需要按照本所说的去做。在同一台机器上运行所有测试。否则,您是在将苹果与橙子进行比较。
-
你的内存总线宽度是多少?几家银行?它们在两台机器上是否相同?
-
您仍然需要在同一台机器上进行比较,因为不同的机器(以及不同型号的处理器)在内存带宽、缓存大小、内存速度、缓存速度等方面具有不同的行为。如果您在同一台机器上使用 AVX 比 AVX2 获得更好的速度,那么这可能表明编译过程中有些地方不太正确 - 但仅比较具有各种不同属性的两台不同机器不会显示这一点。
-
这正是我期望看到的,假设您的基准测试是受内存限制的。如果您的 Ivy Bridge 机器的内存带宽比 Haswell 的多,那么 Ivy Bridge 的扩展性完全可以预期高于 Haswell。如果是这样,那就不足为奇了。
-
@LưuVĩnhPhúc 是的,但是 RyuJIT 在 AVX 上仅使用 128 位,而 _mm256_add_epi16 在我的 AVX 处理器上是无效指令。从 intel 内部函数指南中可以看出,在 AVX 的 256 位寄存器上只有 double 和 float 操作可用。