Próbuję skompilować this project z github, który jest zaimplementowany w C++ z SIMD wewnętrznej (SSE4.1). Projekt w github jest podany jako rozwiązanie Visual Studio, ale próbuję przenieść go do Qtcreatora za pomocą cmake. Chociaż staram się go pojawia się następujący błąd kompilacji:inline udało się wezwanie do always_inline '__m128i _mm_cvtepu8_epi32 (__ m128i)': celospecyficznych _mm_cvtepu8_epi32 opcja niedopasowania (__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)
której jestem pewien, że ma do czynienia z częścią optymalizacji SSE, ale ponieważ nie jestem zaznajomiony z tym tematem ja naprawdę nie wiem co to znaczy i jak mogę to rozwiązać, aw sieci, którą przeszukałem, nie mogłem dostać czegoś pożytecznego. Kod, który daje następujący problem jest następujący:
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++;
}
}
Czy ktoś może mi wyjaśnić, o co chodzi i czego mi brakuje. Z góry dziękuję.
* specyficzny cel niedopasowanie opcja * wskazuje na to, że (domyślnie?) Skompilować cel nie obsługuje SSE4.1. Być może parametr "-mxxx" (http://stackoverflow.com/questions/10686638/whats-the-differrence-among-cflgs-sse-options-of-msse-msse2-mssse3-msse4) może przekonać kompilator ? –
Yup, użyj '-msse4.1' dla' pmovzx'. Jest to zwykły komunikat dla właściwości wewnętrznych, który nie powiedział kompilatorowi, który obsługuje dany cel. To również mówi kompilatorowi, że może użyć do sse4.1 podczas automatycznego wektoryzacji. Jeśli jest to problem (wysłanie procesora w czasie wykonywania), użyj oddzielnych jednostek kompilacji. Również '-march = nehalem' umożliwi obsługę SSE4.2 i' -mpopcnt'. –
dzięki, że rzeczywiście dodając 'set (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -msse4.1 ")' w cmakelist wydaje się, że to podstęp. Dzięki jeszcze raz. – ThT