Jam*_*ana 1 c c++ optimization performance gcc
来自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;
}
Run Code Online (Sandbox Code Playgroud)
我应该使用什么gcc标签来使gcc自动使用自定义exp(x)实现?如果gcc无法实现,我该怎么办呢?
https://codingforspeed.com/using-faster-exponential-approximation/
别.此函数比本机实现慢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)
Run Code Online (Sandbox Code Playgroud)
虽然你从这个功能的网站声称"非常好的输入小于5"的协议,这是不正确的.1.21%的差异(for x=5)是巨大的,并且可能在使用此近似的任何计算中导致显着误差.