首页 > 后端开发 > C++ > 我们如何在 AVX2 中为 Intel 和 AMD 处理器高效实现 log2(__m256d)?

我们如何在 AVX2 中为 Intel 和 AMD 处理器高效实现 log2(__m256d)?

Mary-Kate Olsen
发布: 2024-11-27 15:49:10
原创
626 人浏览过

How Can We Efficiently Implement log2(__m256d) in AVX2 for Both Intel and AMD Processors?

AVX2 中 log2(__m256d) 的高效实现

SVML 的 __m256d _mm256_log2_pd (__m256d a) 仅限于 Intel 编译器,据报道在 AMD 处理器上速度较慢。存在替代实现,但它们通常关注 SSE 而不是 AVX2。本次讨论旨在为四个双精度数向量提供 log2() 的高效实现,该实现与各种编译器兼容,并且在 AMD 和 Intel 处理器上均表现良好。

传统策略

通常的方法利用公式 log2(a*b) = log2(a) log2(b),该公式可简化为指数log2(尾数) 对于双数。尾数的范围有限,为 1.0 到 2.0,因此适合通过多项式逼近来获得 log2(尾数)。

准确度和精度

所需的准确度和投入的范围影响实施。 Agner Fog 的 VCL 旨在使用误差避免技术实现高精度。但是,为了更快地近似 float log(),请考虑 JRF 的多项式实现(可在此处找到:http://jrfonseca.blogspot.ca/2008/09/fast-sse2-pow-tables-or-polynomials.html)。

VCL 算法

VCL 的 log float 和double 函数遵循两部分方法:

  1. 提取指数和尾数: 指数将转换回浮点数,并通过检查小于的值来调整尾数SQRT2*0.5。接下来从尾数中减去 1.0。
  2. 多项式近似: 将多项式近似应用于调整后的尾数,以计算 x=1.0 附近的 log(x)。对于双精度,VCL 使用两个 5 阶多项式的比率。

通过将指数添加到多项式近似值来获得最终结果。 VCL 包含额外的步骤来最小化舍入误差。

替代多项式近似

为了提高准确性,您可以直接使用 VCL。然而,为了更快地实现 float 的近似 log2(),请考虑使用 FMA 将 JRF 的 SSE2 函数移植到 AVX2。

避免舍入误差

VCL 使用各种技术来减少舍入误差。其中包括:

  • 将 ln2 拆分为更小的常数(ln2_lo 和 ln2_hi)
  • 添加行 res = nmul_add(x2, 0.5, x);多项式评估

去除不必要的步骤

如果已知您的值是有限且正的,则可以通过注释掉以下检查来显着提高性能下溢、溢出或非正规。

进一步正在阅读

  • [具有极小极大误差的多项式逼近](http://gallium.inria.fr/blog/fast-向量化-math-approx/)
  • [使用位的快速近似对数操纵](http://www.machinedlearnings.com/2011/06/fast-approximate-logarithm-exponential.html)

以上是我们如何在 AVX2 中为 Intel 和 AMD 处理器高效实现 log2(__m256d)?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板