2016-05-08 10 views
1

Когда я попробовать:Является ли AVX встроенным _mm256_cmp_ps, который должен возвращать NaN, когда это правда?

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

Который является < б я получаю выход:

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

Но при попытке:

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

или

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

Iget

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

Ожидаемое поведение? В документации по адресу https://software.intel.com/en-us/node/524077 просто говорится, что он возвращает результат без указания.

+2

В результате получается все 1s, для истины, которое является NaN. Для false это все 0s, что бывает 0.0. Обычно вы используете результат в виде побитовой маски, поэтому значение float не имеет смысла. –

ответ

3

Да, возвращаемое значение является битовой маской: оно установлено для всех нулей для false или всех для true. 32 бита из них являются кодированием NaN при интерпретации 32-битного поплавка.

Битмакс полезен, потому что вы можете использовать их для маскировки некоторых результатов, например. (A & M) | (B & ~M) выберет значение A, когда маска M была истинной (все) и значением B, когда маска была ложной (все нули).

 Смежные вопросы

  • Нет связанных вопросов^_^