9

SSE 最適化コードを Windows から Linux に移植しています。そして、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配列を初期化する他の方法はありますか? 静的に優れており、次のコードをあまり変更する必要はありません (次の形式のコードが大量にあるため)。どんな提案でも大歓迎です。

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

1 に答える 1

9

タイプを集約初期化の候補としてgcc扱っていないようです。__m128*これらは標準タイプではないため、この動作はコンパイラーごとに異なります。1つのアプローチは、配列を8ビット整数の整列された配列として宣言し、それへのポインターをキャストすることです。

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でサポートされていないと思います#ifdef。そのため、すべてのターゲットプラットフォームで必要な配置を実現するために適切なディレクティブを使用するには、いくつかのトリックが必要になります。

于 2013-03-19T12:49:04.547 に答える