2016-05-08 13 views
1

Wenn versuchen:Ist AVX intrinsic _mm256_cmp_ps soll NaN zurückgeben, wenn es wahr ist? i

__m256 a = _mm256_set_ps(1, 1, 1, 1, 1, 1, 1, 1); 
__m256 b = _mm256_set_ps(0, 0, 0, 0, 0, 0, 0, 0); 

__m256 c = _mm256_cmp_ps(a, b, _CMP_LT_OQ); 

, die eine < b ich die Ausgabe erhalten:

[0, 0, 0, 0, 0, 0, 0, 0] 

Aber wenn man versucht:

__m256 a = _mm256_set_ps(1, 1, 1, 1, 1, 1, 1, 1); 
__m256 b = _mm256_set_ps(0, 0, 0, 0, 0, 0, 0, 0); 

__m256 c = _mm256_cmp_ps(b, a, _CMP_LT_OQ); 

oder

__m256 a = _mm256_set_ps(1, 1, 1, 1, 1, 1, 1, 1); 
__m256 b = _mm256_set_ps(0, 0, 0, 0, 0, 0, 0, 0); 

__m256 c = _mm256_cmp_ps(a, b, _CMP_GT_OQ); 

I get

[NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN] 

ist dieses erwartete Verhalten? Die Dokumentation unter https://software.intel.com/en-us/node/524077 sagt nur, dass es das Ergebnis ohne Angabe zurückgibt.

+2

Das Ergebnis ist alle 1s, für wahr, was zufällig ein NaN ist. Bei false sind es 0, was 0,0 ist. Normalerweise verwenden Sie das Ergebnis als bitweise Maske, daher ist der Gleitkommawert nicht wirklich sinnvoll. –

Antwort

3

Ja, der zurückgegebene Wert ist eine Bitmaske: Er wird auf alle Nullen für false oder alle Einsen für wahr gesetzt. 32 Bits von Einsen sind zufällig kodiert von NaN, wenn sie als 32-Bit-Gleitkommazahl interpretiert werden.

Bitmasken sind nützlich, weil Sie sie verwenden können, um einige Ergebnisse auszublenden, z. (A & M) | (B & ~M) wählt den Wert A, wenn die Maske M wahr war (alle Einsen) und der Wert B, wenn die Maske falsch war (alle Nullen).