问题描述
在一种解决方案中,他/她为AVX向量找到了 abs(inp),
__ m256 sign_bit = _mm256_set1_ps(-0.0f); __m256 inp_abs = _mm256_andnot_ps(sign_bit,inp);
其背后的逻辑是什么?
SSE/AVX: Choose from two __m256 float vectors based on per-element min and max absolute value
解决方法
IEEE 754表示具有符号位,有效数和指数的浮点数。符号位设置为负数,清除为正数。因此,只需清除数字的符号位即可计算绝对值。
数字-0.0f
的有效位数和指数均为全零位,并且为负号,因此其二进制表示形式将设置符号位,并将所有其他位清除。因此,它可用作符号位的掩码。 _mm256_set1_ps
内在函数将此32位值广播到256位向量sign_bit
的所有元素,而_mm256_andnot_ps(sign_bit,inp)
用{的NOT来计算inp
的按位与。 {1}},即sign_bit
,可以有效清除每个元素的符号位,并且不进行其他任何更改。