2

SSE2組み込み関数を使用してビット単位の演算を行う場合、からint*へのポインタをキャストする必要があり__m128i*ます。このコードは厳密なエイリアシングルールに違反していますか?

void bit_twiddling_func(int size, int const* input, int* output) {
    const __m128* x = (const __m128*)input;
    const __m128* y = (const __m128*)output;

    for (int i=0; i < size/4; ++i, ++x, ++y) {
        __m128i x4 = _mm_load_si128(x); // load 4 integers

        // do some bit twiddling

        _mm_store_si128(y, x4); // store 4 integers
    }
}

ありがとうございました!

4

1 に答える 1

2

はい; 厳密なエイリアシングルールに違反します。2つの異なるタイプは、メモリ内の同じ場所を指すことはできません。ここでは、xが入力を指し、yが出力を指しますが、これらはタイプが異なります。

関数のシグネチャを変更して__m128*パラメータを取得することもできますが、そのままにしておくのがおそらく最も簡単です。入力/出力引数が適切な配置とサイズの制約でメモリを指していることに注意すれば、うまくいく可能性があります(つまり、ループが最後からインデックスを付けたり、初期化されていないデータをロードしたりしないものをそれぞれ指す必要があります。)

于 2011-06-23T04:21:33.080 に答える