2017-12-27 7 views
2

Das folgende Stück Code:SSE-Spezifika - _mm_and_ps merkwürdiges Verhalten

__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; 

Ergebnisse in:

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

0 2 2 0 

Sollte nicht das Ergebnis des SSE Betriebes 0 2 2 0 weil 2 = 010, 4 = 100 => 2&4 = 0 sein.
Gemäß der Dokumentation:

__m128 _mm_and_ps (__ m128 a, __m128 b)

das bitweise berechnet und der vier SP FP-Werte von a und b.

R0 R1 R2 R3

a0 & b0 a1 & b1 a2 & b2 a3 & b3

+0

Warum zeigen Sie nicht die Zwischenwerte von 'a' und' b'? –

+0

Überprüfen Sie bearbeiten ..... – Blue

Antwort

3

Die documentation I gefunden sagt:

das bitweise berechnet und der vier Single-Precision, Gleitkomma Werte von a und b.

(Hervorhebung)

2 und 4 haben die gleichen Mantisse (0, plus einen implizierten führenden 1-Bit), und Exponenten von 128 und 129 jeweils. Die bitweise und von denen ist eine Null Mantisse und ein Exponent von 128 (= 2.0).


bearbeiten

Wenn Sie eine bitweise AND von nicht negativen ganzen Zahlen zu tun, können Sie einen Offset hinzufügen. Wenn Sie einen Offset von 8388608 (== 1 < < 23) verwenden, können Sie wie erwartet Bitoperationen auf 0..8388607 ausführen.

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

Oder Sie könnten SSE1 'andps' auf Integer-Daten verwenden, wenn Sie möchten. ([Es gibt geringfügige Auswirkungen auf die Leistung] (https://stackoverflow.com/questions/26942952/difference-between-the-avx-instructions-vxorpd-and-vpxor)). Es ist immer noch ein AND, es interessiert sich nicht für die Bedeutung der Bits, bis Sie einen tatsächlichen FP-Befehl verwenden. Wenn Sie das nie tun und nur das Ergebnis speichern, geht es Ihnen gut. –