AVX: «1, если не ноль» - PullRequest
       55

AVX: «1, если не ноль»

4 голосов
/ 26 февраля 2020

Как я могу превратить значения массива чисел float32 в 1, если они не равны нулю, используя AVX?

Например: -0.2134f, -1.23f, -0.0f, 12.0f ...

становится 1.0f, 1.0f, 0.0f, 1.0f ...

Полагаю, нам следует объединить _mm256_or_ps с какой-то другой инструкцией, но как?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

Первой идеей, которую я бы придумал, является сравнение значений с 0, а затем И, что с регистром, полным 1 с:

y = _mm256_and_ps(_mm256_cmp_ps(_mm256_setzero_ps(), x, _CMP_NEQ_OQ), _mm256_set1_ps(1.f));

Это будет И все 1 с в местах, где х равен 0 с кучей 0 и, к счастью, ноль IEEE 754 также является целым нулем. Другие значения получат плавающую точку 1 AND с набором из 1 и, следовательно, операцию идентификации.

2 голосов
/ 26 февраля 2020

Вероятно vcmpps с предикатом NE , тогда _mm256_and_ps с битовым шаблоном для 1.0f - ваша лучшая ставка.

Предикат ложного сравнения дает вам нулевой бит- шаблон, который также удобно представляет 0.0f.

все-единицы & 1.0f = 1.0f.

Всего 2 инструкции по одной операции. Использование результата сравнения для переменной blend будет лучше, если вы захотите что-то отличное от 0.0f для ложного случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...