1

我有一个执行图像处理的繁重的数字运算程序。它主要是卷积。它是用 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 倍的加速。我弄错了吗?

4

2 回答 2

5

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

是的,你是。

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

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

N是详细级别,使其5可以查看所有可用的输出(可以在此处找到更多信息)。

此外,您可能想了解 GCC 的 vectorizer

请记住,对于代码的性能关键部分,直接使用 SSE/AVX 内在函数(此处有精彩记录)可能是最佳选择。

于 2015-07-29T14:26:13.013 回答
1

没有代码,没有关于测试过程的描述,但一般可以这样解释:

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

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

于 2015-07-29T14:57:40.820 回答