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

Posted

技术标签:

【中文标题】调用 always_inline \'__m128i _mm_cvtepu8_epi32(__m128i)\' 时内联失败:目标特定选项不匹配 _mm_cvtepu8_epi32 (__m128i __X) [重复]【英文标题】:inlining failed in call to always_inline '__m128i _mm_cvtepu8_epi32(__m128i)': target specific option mismatch _mm_cvtepu8_epi32 (__m128i __X) [duplicate]调用 always_inline '__m128i _mm_cvtepu8_epi32(__m128i)' 时内联失败:目标特定选项不匹配 _mm_cvtepu8_epi32 (__m128i __X) [重复] 【发布时间】:2016-03-03 12:45:38 【问题描述】:

我正在尝试从 github 编译 this project,它是在 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++;
    


有人可以解释一下问题是什么以及我缺少什么。提前致谢。

【问题讨论】:

target specific option mismatch 似乎表明您的(默认?)编译目标不支持 SSE4.1。或许an -mxxx parameter可以说服编译器? 是的,将-msse4.1 用于pmovzx。这是您没有告诉编译器目标支持的内在函数的常见消息。这也告诉编译器在自动矢量化时它最多可以使用 sse4.1。如果这是一个问题(运行时 CPU 调度),那么使用单独的编译单元。 -march=nehalem 也将启用 SSE4.2 支持,-mpopcnt 感谢两者确实在 cmakelist 中添加 set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -msse4.1") 似乎起到了作用。再次感谢。 FWIW 对我来说可能意味着“让它不包括意外的 xmmintrin.h 文件” 另外,请注意,此消息意味着您的 CPU 可能不支持这些指令,在这种情况下,您仍然可以尝试使用 -msse4.1 进行编译,但之后可能无法运行它。 【参考方案1】:

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

【讨论】:

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

以上是关于调用 always_inline '__m128i _mm_cvtepu8_epi32(__m128i)' 时内联失败:目标特定选项不匹配 _mm_cvtepu8_epi32 (__m128i __X的主要内容,如果未能解决你的问题,请参考以下文章

g ++ inlined在调用always_inline“int _rdrand16_step()”时失败

SSE:如何将 _m128i._i32[4] 减少到 _m128i._i8

将 __m256i 设置为两个 __m128i 值的值

将 __m256i 设置为两个 __m128i 值的值

两个 __m128i 的两个位到一个 __m128i 的四个位 -SSE

清除 __m128i 的高字节