在 AVX 中寻找绝对

use*_*626 3 floating-point ieee-754 avx absolute-value avx2

在其中一个解决方案中,他/她发现AVX 向量的abs(inp)为,

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

其背后的逻辑是什么?

SSE/AVX:根据每个元素的最小和最大绝对值从两个 __m256 浮点向量中进行选择

Nat*_*dge 5

IEEE 754表示带有符号位、有效数和指数的浮点数。符号位设置为负数,清除为正数。因此,只需清除数字的符号位即可计算绝对值。

该数字-0.0f具有全位为零的有效数大小和指数以及负号,因此其二进制表示形式将设置符号位并清除所有其他位。因此它可以用作符号位的掩码。内在函数_mm256_set1_ps将此 32 位值广播到 256 位向量 的所有元素sign_bit,并_mm256_andnot_ps(sign_bit, inp)计算 的按位inp与 与 的 NOT sign_bit,即inp & ~sign_bit,这有效地清除了每个元素的符号位,并且不会更改任何其他内容。

  • 从技术上讲,根据 IEEE-754 3.4,页面底部的 e 项,0 的指数为 *emin*, −126。编码指数的字段中的位串为零。我提到这一点并不是因为它对于 0 特别重要,而是因为它对于人们理解有效数和指数的值以及编码它们的字段的位串之间的区别很重要。例如,牢记这一点可以帮助人们避免错误地认为有效数有 23 位而不是 24 位。 (2认同)