我需要开源(没有许可限制)日志功能的实现,带签名
__m128d _mm_log_pd(__m128d);
它可以在英特尔短矢量数学库(ICC的一部分)中使用,但ICC既不是免费的也不是开源的。我正在寻找仅使用内在函数的实现。
它应该使用特殊的有理函数近似。我需要的东西几乎和cmath log一样准确,比如9-10十进制数字,但更快。
答案 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)
这里是__m256d
:https://stackoverflow.com/a/45898937/1915854的对应部分。将它剪切到__m128d
应该是非常简单的。如果您遇到任何问题,请告诉我。
或者您可以将我的实施视为一次获得两个__m128d
数字的内容。
答案 4 :(得分:0)
如果找不到现有的开源实现,使用泰勒系列的标准方法创建自己的实现相对容易。有关此内容以及其他各种方法,请参阅Wikipedia。