【问题标题】:Bitwise operation on a floating point usefulness浮点数的按位运算
【发布时间】:2015-05-25 13:49:54
【问题描述】:

我注意到存在用于浮点的 SSE 指令,这让我感到疑惑。您可以对 fp/integer union 中的标量做同样的事情。

这个想法让我印象深刻,如果你对浮点数组的分量进行按位或运算,你可以通过查看结果的符号位来快速确定它们中的任何一个是否为负。

浮点值的按位运算还有哪些其他用途?

【问题讨论】:

  • SSE 寄存器的内容可以是任何你喜欢的。因此,您可以用整数填充它们,并对它们并行执行按位运算。例如,图像处理可能会发现这很有用。
  • 绝对值、取反、符号转移、多路复用器,可能还有一堆其他的......

标签: assembly x86 floating-point bit-manipulation bitwise-operators


【解决方案1】:

很多。例如,当您只需要对仅浮点指令集(如 AVX)进行按位运算时,这些就变得非常方便。

另一个应用:制作常量。您可以在Agner Fog's optimization guide for x86 platforms 的表 13.10 和 13.11 中看到很多示例。一些例子:

pcmpeqd xmm0, xmm0
psrld   xmm0, 30   ; 3 (32-bit)

pcmpeqd xmm0, xmm0 ; -1

pcmpeqw xmm0, xmm0 ; 1.5f
pslld   xmm0, 24
psrld   xmm0, 2

pcmpeqw xmm0, xmm0 ; -2.0f
pslld   xmm0, 30

您还可以使用它来检查浮点值是否为 2 的幂。

Harold 等其他一些应用说:取绝对值和减绝对值、复制符号、复用...我将在单个数据中进行演示以便于理解

// Absolute:
abs = x & ~(1U << 31);
// Muxing
v = (x & mask) | (y & ~mask); // v = mask ? x : y; with mask = 0 or -1
// Copy sign
y = (y & ~(1U << 31)) | (x & (1U << 31));

【讨论】:

  • 你有一个有趣的abs :)
  • @harold 哎呀那个负绝对值。固定
【解决方案2】:

它可用于使用所谓的"double double" arithmetic 扩展浮点精度,尤其是当您无法访问融合乘加 (FMA) 指令时。

如果您有两个浮点数,其中有效数的后半部分为零,则它们的乘积是精确的。所以一个常见的技巧是把浮点数的一部分归零,从原始数字中减去它,你有两个数字和原始值相加,但每个数字只使用一半的有效数。通过适当安排操作顺序,您可以获得两个浮点数,它们的总和为精确乘积:例如,参见Dekker (1971)

我使用 Julia 对 here 进行了一些粗略的速度测试:浮点 AND 至少比转移到整数寄存器、使用整数 AND 并向后转移快 50%。

猜你喜欢
  • 2011-07-17
  • 2017-06-17
  • 2010-12-15
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2022-07-17
相关资源
最近更新 更多