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

时间:2015-07-29 14:10:07

标签: c++ gcc sse x87

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

当我告诉GCC使用SSE优化(使用-march = native -mfpmath = sse -msse2)时,与使用默认的x87 FPU相比,我看不到加速。

当我使用双打而不是浮点数时,没有减速。

我的理解是SSE在使用浮动而不是双倍时应该给我2倍的加速。我错了吗?

2 个答案:

答案 0 :(得分:5)

  

我的理解是SSE在使用浮动而不是双倍时应该给我2倍的加速。我错了吗?

是的,你是。

编译器和你的代码一样好 - 记住这一点。如果你没有考虑到矢量化设计你的算法,编译器是无能为力的。这并不容易:“打开开关,享受100%的性能提升”。

首先,使用-ftree-vectorizer-verbose=N编译代码,看看编译器真正实现了什么。

N是详细级别,请5查看所有可用输出(更多信息can be found here)。

另外,您可能需要阅读about GCC's vectorizer

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

答案 1 :(得分:1)

没有代码,没有关于测试程序的描述,但通常可以用这种方式解释:

  1. 并非所有关于cpu绑定的,它也受内存速度的限制。 图像处理通常具有较大的工作集并超过非xeon cpu的缓存量。最终cpu遭遇饥饿意味着整体吞吐量可以受内存速度的限制。

  2. 您可能正在使用对矢量化不友好的算法。 并非每种算法都能从矢量化中受益。有许多条件必须满足 - 流依赖性,内存布局等。