在 AVX 中查找绝对值
Posted
技术标签:
【中文标题】在 AVX 中查找绝对值【英文标题】:Find Absolute in AVX 【发布时间】:2020-08-26 14:04:02 【问题描述】:在其中一个解决方案中,他/她发现 abs(inp) 用于 AVX 向量,
__m256 符号位 = _mm256_set1_ps(-0.0f); __m256 inp_abs = _mm256_andnot_ps(sign_bit, inp);
这背后的逻辑是什么?
SSE/AVX: Choose from two __m256 float vectors based on per-element min and max absolute value
【问题讨论】:
【参考方案1】:IEEE 754 表示带有符号位、有效数和指数的浮点数。负数设置符号位,正数清零。因此,可以通过简单地清除数字的符号位来计算绝对值。
数字-0.0f
具有所有位为零和负号的有效位和指数,因此其二进制表示将设置符号位并清除所有其他位。因此它可以用作符号位的掩码。 _mm256_set1_ps
内在函数将此 32 位值广播到 256 位向量 sign_bit
的所有元素,_mm256_andnot_ps(sign_bit, inp)
计算 inp
与 sign_bit
的非的按位与,即 inp & ~sign_bit
,这有效地清除了每个元素的符号位,并且不会改变任何其他内容。
【讨论】:
技术上,0 的指数是 emin,-126,根据 IEEE-754 3.4,页面底部的 e 项。编码指数的字段中的位串为零。我提到这一点并不是因为它对 0 特别重要,而是让人们理解有效数字和指数的值与编码它们的字段的位串之间的区别很重要。例如,记住这一点可以帮助人们避免错误地认为有效数字是 23 位而不是 24 位。以上是关于在 AVX 中查找绝对值的主要内容,如果未能解决你的问题,请参考以下文章
找到绝对最小值的最短方法。两个数,并乘以它在 AVX 中的输入符号
LeetCode 530. Minimum Absolute Difference in BST(在二叉查找树中查找两个节点之差的最小绝对值)