调用always_inline';时内联失败__m128i _mm _cvtep8 _epi32(u m128i)和#x27;:目标特定选项不匹配\u mm\u cvtepu8\u epi32(\uuuuuM128i\uuux) 我尝试从Github编译,它是用C++实现的,SIMD内部(SSE4.1)。github中的项目是作为VisualStudio解决方案提供的,但我正在尝试使用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)

调用always_inline';时内联失败__m128i _mm _cvtep8 _epi32(u m128i)和#x27;:目标特定选项不匹配\u mm\u cvtepu8\u epi32(\uuuuuM128i\uuux) 我尝试从Github编译,它是用C++实现的,SIMD内部(SSE4.1)。github中的项目是作为VisualStudio解决方案提供的,但我正在尝试使用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),c++,compilation,sse,C++,Compilation,Sse,我确信这与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 ;

我确信这与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++;
    }

}
静态空隙cvt8u32f(常数垫和src、垫和dest、常数浮动放大器)
{
const int imsize=src.size().area()/8;
const int nn=src.size().area()-imsize*8;
uchar*s=(uchar*)src.ptr(0);
浮动*d=目的地ptr(0);
常量m128最大值=mm_u集ps1(安培);
常数m128i zero=_mm_setzero_si128();
对于(int i=imsize;i--;)
{
__m128i s1=_mm_loadl_epi64((u m128i*)s);
_存储区(d,多个存储区(mamp,多个存储区)(s1));
_(d+4,_-mm_-mul_-ps,_-mm_-cvtepi32_-ps(_-mm_-cvtepu8_-epi32(_-mm_-srli_-si128(s1,4 '))));
s+=8;
d+=8;
}
对于(int i=0;iadd-in file.pro:

QMAKE_cxflags+=-msse3

特定于目标的选项不匹配似乎表明您的(默认?)编译目标不支持SSE4.1。也许可以说服编译器?是的,对
pmovzx
使用
-msse4.1
。这是内部函数的常见消息,您没有告诉编译器目标支持。这也告诉编译器在自动向量化时最多可以使用SSE4.1。如果这是一个问题(运行时CPU调度),然后使用单独的编译单元。另外,
-march=nehalem
将启用SSE4.2支持,以及
-mpopnt
。感谢这两个确实添加了
集(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS}-msse4.1”)
在cmaklist中似乎做到了这一点。再次感谢。对于我来说,这可能意味着“不要在事故中包含xmmintrin.h文件"另外,请注意,此消息意味着您的CPU可能不支持指令,在这种情况下,您仍然可以尝试使用-msse4.1进行编译,但以后可能无法运行它。
pmovzx
需要SSE4.1,因此
-msse3
似乎不太可能有帮助。我刚才也遇到了这个问题。当我添加
-madx
参数时最后,它被成功地编译了。