1

SSE2では次のユニオン宣言を使用しています。

typedef unsigned long uli;  
typedef uli v4si __attribute__ ((vector_size(16)));  
typedef union  
{  
    v4si v;  
    uli data[2];  
} uliv;  

uliv a, b, c;

アイデアは、2つの符号なしlong変数(64ビット長)をそれぞれaとbに割り当て、それらをXORして、結果をcに配置することです。

ここでは明示的な割り当て(a.data[0] = something)が機能しますが、より多くの時間が必要です。

組み込み関数を使用する予定です。を使用する_mm_set_epi64 (unsigned long x, unsigned long y)と、変数を要求し__m64ます。これらの変数をキャストすると正常に(__m64)x機能しますが、間違った結果になります。

for (k = 0; k < 10; k++)  
{  
    simda.v = _mm_set_epi64 (_mulpre1[u1][k], _mulpre2[u2][k]);  
    simdb.v = _mm_set_epi64 (res1[i+k], res2[i+k]);  
    simdc.v = _mm_xor_si128 (simda.v, simdb.v);  
}

上記のコードはエラーになります:

/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/emmintrin.h:578: note: expected ‘__m64’
but argument is of type ‘long unsigned int’

いくつかの代替案(組み込み関数)を提案できますか?

4

1 に答える 1

1

あなたのシステムunsigned longは 64 ビットですか? おそらく、より安全に使用できるunsigned long longuint64_t<stdint.h>.

私のシステムでは、2 つのパラメーターを_mm_set_epi64取り、 .unsigned long long__m128i

(a) 2 つの 64 ビット値を XOR したいのか、(b) 2 x 64 ビット値の 2 つのベクトルを XOR したいだけなのか、あなたの質問からは明らかではありません。

ケース(a)の場合、スカラーコードを使用してください。

uint64_t a, b, c;

c = a ^ b;

ケース(b)の場合、ユニオンなどは必要ありません。これを行うだけです:

__m128i va, vb, vc;

va = _mm_set_epi64(a1, a2);
vb = _mm_set_epi64(b1, b2);
vc = _mm_xor_si128(va, vb);
于 2010-12-08T17:10:57.840 に答える