首页 >后端开发 >C++ >如何在不依赖 Intel 编译器的情况下在 AVX2 中高效实现 log2(__m256d)?

如何在不依赖 Intel 编译器的情况下在 AVX2 中高效实现 log2(__m256d)?

Patricia Arquette
Patricia Arquette原创
2024-12-15 12:03:10948浏览

How to Efficiently Implement log2(__m256d) in AVX2 without Intel's Compiler Dependencies?

AVX2 中 log2(__m256d) 的高效实现

在 AVX2 环境下,Intel 的 __m256d _mm256_log2_pd (__m256d a) 函数与除 Intel 之外的其他编译器不兼容据报道,AMD 处理器的性能有所下降。为了解决这个问题,让我们探索一种提供效率和广泛兼容性的替代实现。

log2 近似策略

通常,log2(ab) 计算为 log2(a) log2 (二)。由于a由2^指数尾数表示,因此计算简化为指数log2(尾数)。尾数的有限范围(1.0 到 2.0)允许定制多项式近似来计算 log2(尾数)。

多项式近似

泰勒级数展开式通常用作系数的起点,但是建议使用极小极大拟合来最小化目标范围内的误差。为了获得接近 1.0 的值的更高精度,可以使用尾数 1.0 作为多项式输入,从而无需常数项。

精度注意事项

所需的精度级别将影响实现选择。由于额外的计算步骤,更高的精度通常会以速度为代价。 Agner Fog 的 VCL 库提供了高度精确的函数,但采用了复杂的技术,这些技术可能不是所有应用程序都必需的。

log2 的 VCL 算法

VCL 的 log2 函数涉及以下步骤:

  1. 提取指数位并将其转换为float。
  2. 将尾数调整为 [0.5, 1.0) 或 (0.5, 1.0],然后减去 1.0。
  3. 应用多项式近似计算 x=1.0 附近的 log(x) ,使用单个五阶多项式(双精度)或两个五阶多项式的比率(float)。
  4. 添加指数多项式_approx_log(尾数)以获得最终结果。

提高准确性和速度的步骤

提高准确性:

  • 考虑使用更准确的多项式近似值。
  • 避免减 1.0(保留尾数 - 1.0)以减少潜在的精度损失。

要优化速度:

  • 使用截断多项式具有较少项的近似值。
  • 采用矢量化指令进行处理同时多个值。
  • 如果已知输入值是有限且正的,则消除对特殊情况(例如下溢、溢出、非正规)的不必要检查。

以上是如何在不依赖 Intel 编译器的情况下在 AVX2 中高效实现 log2(__m256d)?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn