我正在与一家公司合作创建一组使用 SSE 指令的专用代码。他们正在使用 Qt Creator IDE。我为他们提供了一个 C 头文件和相应的 *.c 文件,可以在 XCode 和 Visual Studio 中编译;它们不在 Qt Creator 中编译。
如何更改适当的编译器设置,以便 SSE 指令能够在 Qt Creator 中编译?
导致第一个错误的行如下:
_mm_store_ps(outData, _mm_add_ps(*l, *r));
错误语句如下:
Inlining failed in call to always_inline ‘__mm_add_ps’: target specific option mismatch
Inlining failed in call to always_inline ‘_mm_store_ps’: target specific option mismatch
我们也收到此警告:
SSE vector return without SSE enabled changes the ABI [-Wpsabi]
gcc 和 clang 等编译器要求在编译使用内部函数和向量类型的代码时启用相关的指令集扩展。例如
-msse2
。这也让编译器可以使用 SSE2 自动矢量化。
SSE2 是 x86-64 的基线,所以我猜你出于某种原因正在构建 32 位二进制文件?
我认为某些编译器(也许是 MSVC)会让您使用内在函数,而不使编译器自动生成指令。
如果你想进行运行时CPU调度,那么你有一些使用SSE4.1或AVX的函数,但需要你的程序在没有这些函数的计算机上运行:将你的SSE4和AVX函数放在单独的文件中,这样你就可以构建这些编译带有
-msse4.1
和 -mavx
的单位。
通常最好启用
-march=nehalem
或 -march=haswell
来启用 -mpopcnt
之类的功能(如果这是您想要的),更重要的是设置 -mtune=haswell
以针对可能的目标 CPU 进行优化以及使用它支持的扩展。