SSE2:双精度日志功能

时间:2010-12-13 17:17:24

标签: c++ c optimization sse simd

我需要开源(没有许可限制)日志功能的实现,带签名

__m128d _mm_log_pd(__m128d);

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

它应该使用特殊的有理函数近似。我需要的东西几乎和cmath log一样准确,比如9-10十进制数字,但更快。

5 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

看看AMD LibM。它不是开源的,而是免费的。 AFAIK,适用于Intel CPU。在同一个网页上,您可以找到ACML的链接,这是来自AMD的另一个免费数学库。它拥有AMD LibM + Matrix algos,FF和发行版的所有功能。

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

答案 2 :(得分:1)

Framewave project获得Apache 2.0许可,旨在成为与英特尔IPP等效的开源软件。它的实现与您正在寻找的一致。 检查文档中的固定精度算术函数。

答案 3 :(得分:1)

这里是__m256dhttps://stackoverflow.com/a/45898937/1915854的对应部分。将它剪切到__m128d应该是非常简单的。如果您遇到任何问题,请告诉我。

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

答案 4 :(得分:0)

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