当前位置:  开发笔记 > 编程语言 > 正文

如何从源代码或库中替换__ieee754_exp_avx调用?

如何解决《如何从源代码或库中替换__ieee754_exp_avx调用?》经验,为你挑选了1个好方法。

来自libm*.so的__ieee754_exp_avx在某个源代码中被密集使用,我想用更快的exp(x)实现替换它?

自定义exp(x):

inline
double exp2(double x) {
   x = 1.0 + x / 1024;
   x *= x; x *= x; x *= x; x *= x;
   x *= x; x *= x; x *= x; x *= x;
   x *= x; x *= x;
return x;
}

我应该使用什么gcc标签来使gcc自动使用自定义exp(x)实现?如果gcc无法实现,我该怎么办呢?

https://codingforspeed.com/using-faster-exponential-approximation/



1> duskwuff..:

别.此函数比本机实现慢exp,并且是非常差的近似值.

首先是速度.我的基准测试表明,根据你的编译器和CPU,这个实现exp2可能比本机 1.5到4.5倍exp.我不确定网站在哪里得到他们的数据 - "比传统的快360倍exp"似乎很荒谬,并且与我的测试完全不一致.

第二,准确性.exp2(x)是相当接近exp(x)x ? 1,但是没有很糟糕的较大值.例如:

exp(1)   = 2.7182818
exp2(1)  = 2.7169557 (0.05% too low)

exp(2)   = 7.3890561
exp2(2)  = 7.3746572 (0.20% too low)

exp(5)   = 148.41316
exp2(5)  = 146.61829 (1.21% too low)

exp(10)  = 22026.466
exp2(10) = 20983.411 (4.74% too low)

exp(20)  = 4.851652e+08
exp2(20) = 4.0008755e+08 (17.5% too low)

虽然你从这个功能的网站声称"非常好的输入小于5"的协议,这是不正确的.1.21%的差异(for x=5)是巨大的,并且可能在使用此近似的任何计算中导致显着误差.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有