在 AVX 中找到绝对

Find Absolute in AVX

在其中一个解决方案中,he/she 发现 abs(inp) 用于 AVX 向量,

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

背后的逻辑是什么?

IEEE 754 表示 floating-point 带有符号位、尾数和指数的数字。符号位设置为负数,清除为正数。因此可以通过简单地清除数字的符号位来计算绝对值。

-0.0f 的有效位数和指数为 all-bits-zero 和负号,因此其二进制表示将设置符号位并清除所有其他位。因此它可以用作符号位的掩码。 _mm256_set1_ps intrinsic broadcasts this 32-bit value to all the elements of a 256-bit vector sign_bit, and _mm256_andnot_ps(sign_bit, inp) 计算 inp 的按位与与 sign_bit 的非,即 inp & ~sign_bit,这有效地清除了每个元素的符号位并且不改变任何其他内容.