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