我需要日志功能的开源(无许可证限制)实现,带有签名的东西
__m128d _mm_log_pd(__m128d);
它在英特尔短向量数学库(ICC 的一部分)中可用,但 ICC 既不是免费的也不是开源的。我正在寻找仅使用内在函数的实现。
它应该使用特殊的有理函数逼近。我需要一些几乎与 cmath 日志一样准确的东西,比如 9-10 位十进制数字,但速度更快。
我需要日志功能的开源(无许可证限制)实现,带有签名的东西
__m128d _mm_log_pd(__m128d);
它在英特尔短向量数学库(ICC 的一部分)中可用,但 ICC 既不是免费的也不是开源的。我正在寻找仅使用内在函数的实现。
它应该使用特殊的有理函数逼近。我需要一些几乎与 cmath 日志一样准确的东西,比如 9-10 位十进制数字,但速度更快。
我相信log2
更容易计算。您可以将您的数字乘以/除以 2 的幂(非常快),使其位于 (0.5, 2],然后使用Pade 近似值(将 M 接近 N),这很容易一劳永逸地得出, 并且您可以根据需要选择其顺序。您只需要可以使用 SSE 内在函数进行的算术运算。不要忘记根据上述比例因子添加/删除常量。
如果你想要自然对数,除以log2(e)
,你可以一劳永逸地计算。
在某些特定项目中看到自定义日志功能的情况并不少见。标准库函数解决了一般情况,但您需要更具体的东西。我真诚地认为自己做这件事并不难。
看看AMD LibM。它不是开源的,而是免费的。AFAIK,它适用于英特尔 CPU。在同一网页上,您可以找到指向 ACML 的链接,这是 AMD 的另一个免费数学库。它拥有 AMD LibM + Matrix 算法、FF 和发行版的所有内容。
我不知道双精度矢量化数学函数的任何开源实现。我猜 Intel 和 AMD 库是由 CPU 制造商手动优化的,当速度很重要时,每个人都会使用它们。IIRC,曾尝试在 GCC 中实现矢量化数学函数的内在函数。我不知道他们能走多远。显然,这不是一项微不足道的任务。
Framewave 项目获得 Apache 2.0 许可,旨在成为英特尔 IPP 的开源等效项。它具有接近您正在寻找的实现。检查文档中的固定精度算术函数。
这是对应的__m256d
:https ://stackoverflow.com/a/45898937/1915854 。将其剪切为__m128d
. 如果您遇到任何问题,请告诉我。
或者您可以将我的实现视为__m128d
一次获得两个数字的东西。
如果您找不到现有的开源实现,则使用泰勒级数的标准方法创建自己的实现相对容易。有关此方法和各种其他方法,请参见Wikipedia 。