Найти Абсолют в AVX

В одном из решений он нашел abs(inp) для векторов AVX, например:

__m256 sign_bit = _mm256_set1_ps (-0.0f); __m256 inp_abs = _mm256_andnot_ps (sign_bit, inp);

Какая за этим логика?

SSE/AVX: выберите один из двух векторов с плавающей запятой __m256 на основе минимального и максимального абсолютного значения для каждого элемента


person user49626    schedule 26.08.2020    source источник


Ответы (1)


IEEE 754 представляет числа с плавающей запятой со знаковым битом, мантиссом и показателем степени. Бит знака устанавливается для отрицательного числа и очищается для положительного числа. Таким образом, абсолютное значение можно вычислить, просто очистив бит знака числа.

Число -0.0f имеет значащую величину и показатель степени, в которых все биты равны нулю, а знак отрицательный, поэтому в его двоичном представлении будет установлен знаковый бит, а все остальные биты очищены. Поэтому его можно использовать как маску для бита знака. Встроенная функция _mm256_set1_ps передает это 32-битное значение всем элементы 256-битного вектора sign_bit и _mm256_andnot_ps(sign_bit, inp) вычисляет побитовое И для inp с НЕ для sign_bit, то есть inp & ~sign_bit, что эффективно очищает знаковый бит каждого элемента и больше ничего не меняет.

person Nate Eldredge    schedule 26.08.2020
comment
Технически показатель степени для 0 равен emin, −126, согласно IEEE-754 3.4, пункт e внизу страницы. Битовая строка в поле, кодирующем показатель степени, равна нулю. Я упоминаю об этом не потому, что это особенно важно для 0, но важно, чтобы люди понимали различия между значениями мантиссы и экспоненты и битовыми строками полей, которые их кодируют. Имея это в виду, вы можете помочь людям ошибочно думать, что у мантиссы 23 бита вместо 24, например. - person Eric Postpischil; 26.08.2020