私は(SSE4.1)固有のSIMDとC++で実装されてgithubのからthis projectをコンパイルしようとしています。 githubのプロジェクトはVisual Studioのソリューションとして提供されていますが、Qtcreatorでcmakeを使って移植しようとしています。私はそれをコンパイルしようとしている一方で、私は次のエラーを取得する:インライン化は '__m128i _mm_cvtepu8_epi32(__ m128i)' をalways_inlineの呼び出しに失敗しました:ターゲットの特定のオプションの不一致_mm_cvtepu8_epi32(__m128i __X)
私はそれがSSE最適化の一部に関係している確信しているが、私はこの主題とそのなじみのないですので、私は本当にわからない/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)
それは私がそれを解決することを意味し、どのようにそれを解決することができ、私が検索したネットでは、何か有用なものを実際に得ることができませんでした。次のような問題を与えるコードは以下の通りです:
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++;
}
}
誰かが問題と私が行方不明ですが何であるかを私に説明することができます。前もって感謝します。
*ターゲットの特定のオプションの不一致が*あなたの(?デフォルト)SSE4.1をサポートしていないターゲットをコンパイルすることを示していると思われます。おそらく['-mxxx'パラメータ](http://stackoverflow.com/questions/10686638/whats-the-differrence-among-cflgs-sse-options-of-msse-msse2-mssse3-msse4)コンパイラを説得することができます? –
うん、 'pmovzx'には' -msse4.1'を使います。これはコンパイラにターゲットがサポートしていないことを示す組み込み関数の通常のメッセージです。これは、自動ベクトル化するときにsse4.1まで使用できるコンパイラにも伝えます。それが問題(ランタイムCPUディスパッチ)の場合は、別々のコンパイル単位を使用してください。また '-march = nehalem'はSSE4.2のサポートと' -mpopcnt'を有効にします。 –
本当に両方とも 'set(CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -msse4.1 ")'をcmakelistに追加してくれてありがとう。再度、感謝します。 – ThT