Я пытаюсь что-то вроде этого:
__m128 cA = _mm_set_ps1(-2.0f);
__m128 cB = _mm_set_ps1(2.0f);
__m128 df = _mm_cmpgt_ps(cA, cB);
В этом случае df
возвращается с нулями.
Но если я сделаю:
__m128 cA = _mm_set_ps1(2.0f);
__m128 cB = _mm_set_ps1(-2.0f);
__m128 df = _mm_cmpgt_ps(cA, cB);
Он возвращает все -nan
. Это ожидаемое поведение? Если да, то как мне оценить этих бабушек?
Использование процессора Intel, MS VisualStudio 2017
Маска всех установленных битов также является отрицательным значением nan, если читается как число с плавающей запятой.
SIMD сравнивает создание маски. Все биты — это битовый шаблон для -NaN
. Все нулевые биты - это битовый шаблон для +0.0
Они не предназначены для интерпретации как float
. Используйте их с _mm_movemask_ps
, смесями или чем-то вроде _mm_and_ps
.
например _mm_and_ps( vec, cmp_result)
обнуляет элементы, где сравнение было ложным. Вы можете использовать это, чтобы выполнить условное добавление, обнулив некоторые элементы ввода перед добавлением.
Чтобы узнать больше о том, как использовать SIMD, найдите руководство/учебник. https://stackoverflow.com/tags/sse/info
@MarcGlisse «Сравните упакованные элементы с плавающей запятой одинарной точности (32-разрядные) в a и b на предмет «больше чем» и сохраните результаты в dst». Я предполагаю, что он возвращает маску. Нет?