2016-03-03 29 views
8

Sto cercando di compilare this project da github che è implementato in C++ con SIMD intrinseca (SSE4.1). Il progetto in github viene fornito come soluzione di Visual Studio, ma sto cercando di portarlo in Qtcreator con cmake. Mentre sto cercando di compilarlo ottengo il seguente errore:inlining fallito nel chiamata a always_inline '__m128i _mm_cvtepu8_epi32 (__ m128i)': obiettivo specifico _mm_cvtepu8_epi32 opzione non corrispondente (__m128i __X)

/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) 

che sono sicuro che ha a che fare con la parte di ottimizzazione SSE, ma siccome non sono che la familiarità con questo argomento io non so davvero cosa significa e come posso risolverlo e nella rete che ho cercato non ho potuto ottenere qualcosa di utile. Il codice che dà il seguente problema è il seguente:

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++; 
    } 

} 

Qualcuno mi può spiegare qual è il problema e quello che mi manca. Grazie in anticipo.

+3

* target specifico non corrispondente opzione * sembra indicare che il vostro (di default?) Compilazione di destinazione non supporta SSE4.1. Forse [un parametro '' -mxxx'] (http://stackoverflow.com/questions/10686638/whats-the-differrence-among-cflgs-sse-options-of-msse-msse2-mssse3-msse4) può convincere il compilatore ? –

+5

Sì, usare '-msse4.1' per' pmovzx'. Questo è il solito messaggio per gli intrinsechi che non hai detto al compilatore che il target supporta. Ciò indica anche al compilatore che può utilizzare fino a sse4.1 durante l'auto-vettorizzazione. Se questo è un problema (dispatching della CPU in runtime), quindi utilizzare unità di compilazione separate. Anche '-march = nehalem' abiliterebbe il supporto SSE4.2 e' -mpopcnt'. –

+1

grazie entrambi aggiungendo 'set (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -msse4.1 ")' nel cmakelist sembra che abbia fatto il trucco. Grazie ancora. – ThT

risposta

0

aggiungere in file.pro: QMAKE_CXXFLAGS + = - msse3

+0

'pmovzx' richiede SSE4.1, quindi' -msse3' sembra improbabile che aiuti. –