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

标签 c++ c performance gcc optimization

来自 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/

最佳答案

不要。此函数比 exp 的 native 实现慢,并且是一个极差的近似值。

首先,速度。我的基准测试表明,根据您的编译器和 CPU,exp2 的这种实现可能比原生 exp 快 1.5 到 4.5 倍>。我不确定网站从哪里得到他们的数据——“比传统的 exp 快 360 倍”似乎很荒谬,而且与我的测试完全不一致。

其次,准确性。对于 x ≤ 1exp2(x) 相当接近 exp(x),但对于较大的值则严重失败。例如:

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% 的差异(对于 x=5)是巨大的,并且很可能在使用此近似值的任何计算中导致重大错误。

关于c++ - 如何从源代码或库中替换 __ieee754_exp_avx 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41723001/

相关文章:

c++ - 在 VC2010 中初始化 boost::random::discrete_distribution

java - 使用 Qt Android 控制平板电脑的亮度

我可以像访问数组一样访问指针吗?

mysql - 慢 SELECT ... LIMIT 联合表上没有 WHERE 子句

c - 一个简单的附加分支会导致性能下降

c++ - 是否可以循环遍历模板参数?

c++ - 使用从源字符串中提取的子字符串选择性地填充 vector

c - swift |获取struct中c char数组的指针

android 内部套接字连接因守护进程服务失败

c++ - 登录 C++(性能考虑)