2013-03-19 21 views
8

私はWindowsからLinuxにいくつかのSSE最適化コードを移植しています。そして、私はMSVCでうまく動作する次のコードがGCCで動作しないことに気付きました。コードは、__m128iの配列を初期化することです。各__mi28iには16個のint8_tが含まれています。それはgccでコンパイルされますが、結果は期待どおりではありません。実際には、gccが__m128iを "long long int"として定義すると、コードはlong long int coeffs_ssse3 [4] = {64,83,64,36}のような配列を初期化します。私はグーグルで、「ベクトルを初期化する唯一の移植可能な方法は、_mm_set_XXX組み込み関数を使用することです」と言われました。しかし、__m128i配列を初期化する他の方法はありますか?静的に優れているので、次のコードを多く変更する必要はありません(次の形式のコードがたくさんあるため)。どんな提案も感謝しています。__m128i配列をgccで静的に初期化するには?

static const __m128i coeffs_ssse3[4] = 
{ 
    { 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0}, 
    { 83, 0, 36, 0,-36,-1,-83,-1, 83, 0, 36, 0,-36,-1,-83, -1}, 
    { 64, 0,-64,-1,-64,-1, 64, 0, 64, 0,-64,-1,-64,-1, 64, 0}, 
    { 36, 0,-83,-1, 83, 0,-36,-1, 36, 0,-83,-1, 83, 0,-36,-1} 
}; 

答えて

7

gccが集約初期化のための候補であるとして__m128*種類を扱っていないようです。標準的な型ではないため、この動作はコンパイラによって異なります。

static const int8_t coeffs[64] __attribute__((aligned(16))) = 
{ 
    64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 
    83, 0, 36, 0,-36,-1,-83,-1, 83, 0, 36, 0,-36,-1,-83, -1, 
    64, 0,-64,-1,-64,-1, 64, 0, 64, 0,-64,-1,-64,-1, 64, 0, 
    36, 0,-83,-1, 83, 0,-36,-1, 36, 0,-83,-1, 83, 0,-36,-1 
}; 
static const __m128i *coeffs_ssse3 = (__m128i *) coeffs; 

しかし、私はこの構文は、(__attribute__((aligned(x))))のVisual Studioによってサポートされているとは思わない:一つのアプローチは、それへのポインタをキャストし、8ビット整数の整列配列として配列を宣言することですだから、適切なディレクティブを使用してすべてのターゲットプラットフォームで必要なアライメントを達成するには、そこには#ifdefのトリッキーが必要です。

+0

ありがとうございます@ジェイソン!私はあなたの方法を試して、それは非常にうまくいった。 (あなたの答えではuint8_tは配列に負の値が入っているのでint8_tでなければなりません。これはタイプミスかもしれません。 – shengbinmeng

関連する問題