2017-12-27 4 views
2

次のコードを奇数の動作を_mm_and_ps:でSSE組み込み -

__m128 a = _mm_setr_ps(1, 2, 3, 4); 
__m128 b = _mm_set1_ps(2); 
__m128 res = _mm_and_ps(a, b); 
cout << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << endl; 
cout << b[0] << " " << b[1] << " " << b[2] << " " << b[3] << endl; 
cout << res[0] << " " << res[1] << " " << res[2] << " " << res[3] << endl; 
cout<<endl; 
cout << (1 & 2) << " " << (2 & 2) << " " << (3 & 2) << " " << (4 & 2) << endl; 

結果:

1 2 3 4 
2 2 2 2 
0 2 2 2 

0 2 2 0 

はSSE演算の結果は、0 2 2 02 = 010, 4 = 100 => 2&4 = 0ためすべきではありません。ドキュメントによれば

__m128 _mm_and_ps(__ M128 aは、__m128 b)は

ビット単位のAND及びB 4つの単精度浮動小数点値のを計算します。

R0 R1 R2 R3

A0 & B0 A1 & B1 A2 & B2 A3 & B3

+0

「a」と「b」の中間値を表示しないのはなぜですか? –

+0

編集をチェック..... – Blue

答えて

3

私が見つけたdocumentationは言う:

は、ビット単位で計算し、4 の単精度浮動小数点 aとbの値。

(私の強調)

2及び4は同じ仮数(0、プラス暗黙の先頭の1ビット)を有し、それぞれ128と129の指数。これらのビット単位のビットは0の仮数であり、指数は128(== 2.0)です。


編集

あなたはビット単位のAND非負整数のをしたい場合は、オフセットを追加することができます。 8388608(== 1 < < 23)のオフセットを使用する場合は、期待通りにビット単位の操作を0..8388607で行うことができます。

const float offset=8388608; 
__m128 mm_offset = _mm_set1_ps(); 
__m128 a = _mm_setr_ps(1, 2, 3, 4); 
a =_mm_add_ps(mm_offset,a); 
__m128 b = _mm_set1_ps(2+offset); 
__m128 res = _mm_and_ps(a, b); 
res = _mm_sub_ps(res,mm_offset); 
+0

または、必要に応じて整数データにSSE1 'andps'を使用できます。 ([マイナーなパフォーマンスの影響があります](https://stackoverflow.com/questions/26942952/difference-between-the-avx-instructions-vxorpd-and-vpxor))。これはまだANDですが、実際のFP命令を使用するまでビットの意味は気にしません。あなたが決してそれをしないで、結果を保存するだけなら、あなたは大丈夫です。 –

関連する問題