【问题标题】:Fast floating-point power of 2 on x86_64x86_64 上 2 的快速浮点幂
【发布时间】:2017-08-23 10:30:50
【问题描述】:

有没有一种快速的方法可以将2.0 提高到某个浮点数x?我的意思是比 pow(2.0, x) 更快的东西,最好是用 AVX2 很好地矢量化。

整数对应的是1<<n,但它仅适用于整数n

【问题讨论】:

  • 想一想,做1<<n 并投射到两倍怎么样。对不起,如果这听起来很愚蠢:-)
  • 我怀疑2 powered to x 在浮点中是否有更快的方法。整数版本利用它的存储方式来加速 pow(2,x) 我怀疑你是否会在浮点表示上获得这样的优势
  • @Malice,问题是x 不是整数,而是浮点数。
  • 对于整数,这只是写指数项。小数部分需要到非指数部分的对数映射(或倒数)。但实际上,如果可能有较大的加速,x^y = 2^(lg x * y);因此,您可以希望的最大加速是消除一个以 2 为底的对数和一个乘法。你希望做 2 的多少次幂?百万?
  • 了解 IEEE-754 您可以自己进行位操作...h-schmidt.net/FloatConverter/IEEE754.html

标签: c++ floating-point vectorization x86-64 pow


【解决方案1】:

有一个标准的std::exp2(double n)

计算2 的给定幂n

在特定环境中exp2(x) 可能不会比pow(2.0, x) 快,但它比一般pow 更具体。

【讨论】:

  • 在最近的一个 glibc 包含 libmvec 的 linux 上,g++ -Ofast 设法矢量化 std::exp(x*std::log(2)) 而不是 std::exp2(x),奇怪的是。
【解决方案2】:

对于整数幂,可以使用std::ldexp

 double x = std::ldexp(1.0, k); // 2 to the power of k

这比1<<k 和强制转换要好,因为它不会有中间溢出,并且还支持负幂。

【讨论】:

  • 挑战是取 2 的浮点幂 x,它不是整数 k
  • 如果 k 是一个整数,并且您不需要检查是否超出范围,您需要手动将偏置指数填充到 IEEE 754 double 中-shift 和加法(偏向指数并使用相同的操作设置尾数)。这会很好地自动矢量化。
猜你喜欢
  • 1970-01-01
  • 2012-10-23
  • 2016-10-15
  • 1970-01-01
  • 2012-10-30
  • 2011-07-11
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多