【问题标题】:SSE2: Double precision log functionSSE2:双精度对数功能
【发布时间】:2011-05-24 19:24:43
【问题描述】:

我需要开源(无许可证限制)实现日志功能,有签名的东西

__m128d _mm_log_pd(__m128d);

它在英特尔短向量数学库(ICC 的一部分)中可用,但 ICC 既不是免费的也不是开源的。我正在寻找仅使用内在函数的实现。

它应该使用特殊的有理函数逼近。我需要几乎与 cmath 日志一样准确的数据,比如 9-10 位十进制数字,但速度更快。

【问题讨论】:

  • 在索要开源代码时,通常需要为您的项目指定许可证,以便人们知道您是否能够在某个许可证下使用代码。
  • 许可证无关紧要。它适用于软管内项目。所有开源许可证都适用于此。
  • @Jefromi:相反,如果答案不是过于狭隘,将来更有可能对其他提问者有用。
  • 使用FPU的日志指令有什么问题?它们至少是双精度的。
  • @PhiS:您可以自己实现更快但不太准确的日志(或其他)。在分析之后,有时这样做是正确的。

标签: c++ c optimization sse simd


【解决方案1】:

我相信log2 更容易计算。您可以将您的数字乘以/除以 2 的幂(非常快),使其位于 (0.5, 2],然后您使用 Pade approximant(将 M 接近 N),这很容易导出一次全部,您可以根据需要选择其顺序。您只需要可以使用 SSE 内在函数进行的算术运算。不要忘记根据上述比例因子添加/删除常量。

如果你想要自然对数,除以log2(e),你可以一劳永逸地计算。

在某些特定项目中看到自定义日志功能的情况并不少见。标准库函数解决了一般情况,但您需要更具体的东西。我真诚地认为自己做并不难。

【讨论】:

    【解决方案2】:

    看看AMD LibM。它不是开源的,而是免费的。 AFAIK,它适用于英特尔 CPU。在同一个网页上,您可以找到指向 ACML 的链接,这是 AMD 的另一个免费数学库。它包含 AMD LibM + Matrix 算法、FF 和发行版的所有内容。

    我不知道任何双精度矢量化数学函数的开源实现。我猜 Intel 和 AMD 库是由 CPU 制造商手动优化的,当速度很重要时,每个人都会使用它们。 IIRC,曾尝试在 GCC 中实现矢量化数学函数的内在函数。我不知道他们能走多远。显然,这不是一项简单的任务。

    【讨论】:

      【解决方案3】:

      Framewave project 已获得 Apache 2.0 许可,旨在成为英特尔 IPP 的开源等效产品。它具有接近您正在寻找的实现。 检查文档中的固定精度算术函数。

      【讨论】:

        【解决方案4】:

        这是__m256d 的对应物:https://stackoverflow.com/a/45898937/1915854。将其剪切为__m128d 应该很简单。如果您遇到任何问题,请告诉我。

        或者您可以将我的实现视为一次获得两个__m128d 数字。

        【讨论】:

          【解决方案5】:

          如果您找不到现有的开源实现,使用泰勒级数的标准方法创建自己的实现相对容易。有关此方法和各种其他方法,请参阅Wikipedia

          【讨论】:

          • 我相信完全准确的实现需要多精度算术。
          • 泰勒级数不是正确的方法。应该使用特殊的有理函数逼近。我需要的东西几乎和 cmath 日志一样准确,但速度更快。否则我可以简单地将所有内容发送到 cmath 日志。 ICC 实施是准确和快速的。我需要类似但开源的东西。
          • @watson1180 显然有理函数逼近比现代硬件上的泰勒级数方法慢
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-08
          • 1970-01-01
          • 2016-08-17
          相关资源
          最近更新 更多