【发布时间】:2015-07-29 14:10:06
【问题描述】:
我有一个执行图像处理的繁重的数字运算程序。它主要是卷积。它是用 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 倍的加速。我弄错了吗?
【问题讨论】:
-
您是否检查了生成的程序集以查看代码是否真的被矢量化了?您是否尝试过 GCC 的调试选项 (
-ftree-vectorizer-verbose) 来查看代码是否真的被矢量化了? -
在这种情况下,浮点运算可能不会限制您的性能。从您的问题来看,您似乎是在没有其他优化的情况下进行编译?
-
你确定 gcc 以前甚至使用过 x87 FP 吗?至少对于 x86-64,默认值一直是
fpmath=sse,这对于标量代码来说应该只会比 x87 提供一点加速。如果编译器可以向量化任何东西,并且它不受内存限制,那么您可以期待-march=native的加速 -
如果你不是为 x86-64 编译,你真的应该。 x86 调用约定在堆栈中包含 args,而不是在寄存器中,因此使用 FP args 和 FP 返回值调用非内联函数意味着将 args 从堆栈加载到 xmm 寄存器,然后将结果存储到临时缓冲区,然后加载结果进入 x87 FPU,ABI 说返回值必须去。 (
-mfpmath=sse不会更改 ABI,只会更改函数内部发生的情况。不过,如果您的热循环具有内联的任何函数调用,这才是最重要的)。 -
Mingw GCC 是 32 位的,因此它针对的是 x86 系统,默认情况下 SSE 是禁用的。我会研究 Mingw-64 看看我是否能从中得到改进。