我正在尝试编译这个项目,它用C++和SIMD内嵌(SSE4.1)实现。该项目在GitHub上以Visual Studio解决方案的形式提供,但我正在尝试使用CMake在QtCreator中对其进行移植。当我试图编译它时,我遇到了以下错误:
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include/smmintrin.h:520:1: error: inlining failed in call to always_inline '__m128i _mm_cvtepu8_epi32(__m128i)': target specific option mismatch
_mm_cvtepu8_epi32 (__m128i __X)
我相信这与SSE优化有关,但由于我对这个主题不是很熟悉,我真的不知道它的含义以及如何解决它,而且在我搜索的网络上,我并没有找到有用的东西。引起以下问题的代码如下:
static void cvt8u32f(const Mat& src, Mat& dest, const float amp)
{
const int imsize = src.size().area()/8;
const int nn = src.size().area()- imsize*8 ;
uchar* s = (uchar*)src.ptr(0);
float* d = dest.ptr<float>(0);
const __m128 mamp = _mm_set_ps1(amp);
const __m128i zero = _mm_setzero_si128();
for(int i=imsize;i--;)
{
__m128i s1 = _mm_loadl_epi64((__m128i*)s);
_mm_store_ps(d,_mm_mul_ps(mamp,_mm_cvtepi32_ps(_mm_cvtepu8_epi32(s1))));
_mm_store_ps(d+4,_mm_mul_ps(mamp,_mm_cvtepi32_ps(_mm_cvtepu8_epi32(_mm_srli_si128(s1,4)))));
s+=8;
d+=8;
}
for(int i=0;i<nn;i++)
{
*d = (float)*s * amp;
s++,d++;
}
}
有人能解释一下问题是什么,我哪里出了错吗?提前谢谢。
-msse4.1
来进行pmovzx
操作。这是针对你没有告诉编译器目标支持的内部函数的常见信息。同时,这也告诉编译器在自动向量化时可以使用最高到SSE4.1。如果这会带来问题(运行时CPU分派),那么就使用单独的编译单元。另外,-march=nehalem
可以启用SSE4.2支持,而-mpopcnt
则可以启用POPCNT指令支持。 - Peter Cordesset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
似乎解决了问题。再次感谢。 - ttsesm