SSE没有为c++数字处理提供加速



我有一个用于图像处理的大量数字运算程序。它主要是卷积。它是用c++编写的,用Mingw GCC 4.8.1编译。我在一台配备英特尔酷睿i7 4900MQ的笔记本电脑上运行它(SSE高达SSE4.2和AVX2)。

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

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

我的理解是,SSE应该给我一个2x加速时使用浮点数而不是双。我错了吗?

我的理解是,SSE应该给我一个2x加速时使用浮点数而不是双。我错了吗?

是的,你是。

编译器和你的代码一样好——记住这一点。如果在设计算法时没有考虑向量化,编译器就无能为力。这不是那么容易:"打开开关,享受100%的性能提升"。

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

N是冗长级别,使5看到所有可用的输出(更多信息可以在这里找到)。

另外,您可能想要阅读有关GCC的矢量器。

请记住,对于代码的性能关键部分,直接使用SSE/AVX内部函数(这里有详细的文档说明)可能是最好的选择。

没有代码,没有对测试过程的描述,但通常可以这样解释:

  1. 这不仅仅是关于cpu的限制,它还受到内存速度的限制。图像处理通常有很大的工作集,超过了非xeon cpu的缓存量。最终cpu遇到饥饿意味着总吞吐量可以由内存速度限制。

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

最新更新