在 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
,这有效地清除了每个元素的符号位并且不改变任何其他内容.
在其中一个解决方案中,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
,这有效地清除了每个元素的符号位并且不改变任何其他内容.