在其中一个解决方案中,他/她发现abs(inp)对于 AVX 向量,
__m256 符号位 = _mm256_set1_ps(-0.0f);
__m256 inp_abs = _mm256_andnot_ps(sign_bit, inp);
其背后的逻辑是什么?
SSE/AVX:根据每个元素的最小和最大绝对值从两个 __m256 浮点向量中进行选择 https://stackoverflow.com/questions/52415188/sse-avx-choose-from-two-m256-float-vectors-based-on-per-element-min-and-max-a
IEEE 754 https://en.wikipedia.org/wiki/IEEE_754表示带有符号位、有效数和指数的浮点数。符号位设置为负数,清除为正数。因此,只需清除数字的符号位即可计算绝对值。
号码-0.0f
具有全位为零的有效数字幅度和指数以及负号,因此其二进制表示形式将设置符号位并清除所有其他位。因此它可以用作符号位的掩码。这内在将此 32 位值广播到 256 位向量的所有元素sign_bit
, and 计算按位与inp
与非sign_bit
, 那是inp & ~sign_bit
,它有效地清除每个元素的符号位并且不会改变任何其他内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)