SSE 没有为 C++ 数字运算提供加速

SSE gives no speedup for C++ number crunching

我有一个很重的 number-c运行ching 程序可以进行图像处理。它主要是卷积。它是用 C++ 编写的,并使用 Mingw GCC 4.8.1 编译。我 运行 它是在配备 Intel Core i7 4900MQ 的笔记本电脑上使用的(SSE 高达 SSE4.2 和 AVX2)。

当我告诉 GCC 使用 SSE 优化(使用 -march=native -mfpmath=sse -msse2 )时,我发现与使用默认 x87 FPU 相比没有加速。

当我使用 double 而不是 float 时,没有减速。

我的理解是,当使用浮点数而不是双精度时,SSE 应该给我 2 倍的加速。我错了吗?

My understanding is that SSE should give me a 2x speedup when using floats instead of double. Am I mistaken?

是的,你是。

编译器与您的代码一样好 - 请记住这一点。如果您在设计算法时没有考虑到矢量化,那么编译器将无能为力。没那么简单:"turn the switch on and enjoy 100% performance boost".

首先,使用 -ftree-vectorizer-verbose=N 编译您的代码,看看编译器真正矢量化了什么。

N 是冗长级别,设为 5 以查看所有可用输出(更多信息 can be found here)。

此外,您可能还想阅读 about GCC's vectorizer

请记住,对于代码的性能关键部分,直接使用 SSE/AVX 内部函数 (brilliantly documented here) 可能是最佳选择。

没有代码,也没有测试过程的说明,但一般可以这样解释:

  1. 不仅受cpu的限制,还受内存速度的限制。 图像处理通常有很大的工作集,超过非至强 cpu 的缓存量。最终 cpu 遇到饥饿意味着整体吞吐量会受到内存速度的限制。

  2. 您可能使用了一种对矢量化不友好的算法。 并非每个算法都受益于矢量化。需要满足的条件很多——流依赖、内存布局等