在调用'__m128i _mm_cvtepu8_epi32(__m128i)'时,内联失败:目标特定选项不匹配_mm_cvtepu8_epi32 (__m128i __X)。

18

我正在尝试编译这个项目,它用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++;
    }

}

有人能解释一下问题是什么,我哪里出了错吗?提前谢谢。


4
"target specific option mismatch" 看起来暗示着您的(默认?)编译目标不支持SSE4.1。也许可以通过一个“-mxxx”参数来说服编译器?请注意,我已经尽力将翻译变得更通俗易懂,但并没有改变原意。 - Bo Persson
5
可以使用-msse4.1来进行pmovzx操作。这是针对你没有告诉编译器目标支持的内部函数的常见信息。同时,这也告诉编译器在自动向量化时可以使用最高到SSE4.1。如果这会带来问题(运行时CPU分派),那么就使用单独的编译单元。另外,-march=nehalem可以启用SSE4.2支持,而-mpopcnt则可以启用POPCNT指令支持。 - Peter Cordes
2
非常感谢,确实在cmakelist中添加set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")似乎解决了问题。再次感谢。 - ttsesm
对我来说,FWIW可能意味着“不要无意中包含xmmintrin.h文件”。 - rogerdpack
此外,请注意,此消息意味着您的CPU可能不支持该指令,如果是这种情况,您仍然可以尝试使用-msse4.1进行编译,但之后可能无法运行。 - Romeo Valentin
使用 -mavx 对我很有帮助。 - Pawan Nirpal
1个回答

6
在file.pro文件中添加: QMAKE_CXXFLAGS +=-msse3

1
pmovzx 需要 SSE4.1,因此 -msse3 似乎不太可能有所帮助。 - Peter Cordes
我刚刚也遇到了这个问题。当我添加了“-madx”参数时,它成功编译了。 - Land

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接