在其中一个解决方案中,他/她发现AVX矢量的abs(inp(为
__m256 sign_bit=_mm256_set1_ps(-0.0f(;__m256 inp_abs=_mm256-andnot_ps(sign_bit,inp(;
这背后的逻辑是什么?。
SSE/AVX:根据每个元素的最小和最大绝对值,从两个__m256浮动矢量中进行选择
IEEE 754表示带有符号位、有效位和指数的浮点数。符号位设置为负数,清除为正数。所以绝对值可以通过简单地清除数字的符号位来计算。
数字-0.0f
的有效位幅度和指数都是零位和负号,因此其二进制表示将设置符号位,并清除所有其他位。因此,它可以用作符号位的掩码。_mm256_set1_ps
内在向256位矢量sign_bit
的所有元素广播这个32位值,而_mm256_andnot_ps(sign_bit, inp)
计算inp
与sign_bit
的NOT的逐位and,即inp & ~sign_bit
,这有效地清除了每个元素的符号位,并且不改变任何其他内容。