Math exp2应该比exp快吗?

Math exp2应该比exp快吗?,math,floating-point,Math,Floating Point,我最感兴趣的是C/C++中的“exp”和“exp2”函数,但这个问题可能与IEEE 754标准有关,而不是具体的语言特性 在我10年前做的一个家庭作业中,我试着按照所需的周期对不同的浮点运算进行排序,C函数 double exp2 (double) 似乎比 double exp (double) 考虑到“double”使用二进制表示尾数,我觉得这个结果是合理的 然而,今天,在以几种不同的方式再次测试了两者之后,我看不到任何可测量的差异。所以我的问题是 exp2(理论上)应该比exp快吗?及

我最感兴趣的是C/C++中的“exp”和“exp2”函数,但这个问题可能与IEEE 754标准有关,而不是具体的语言特性

在我10年前做的一个家庭作业中,我试着按照所需的周期对不同的浮点运算进行排序,C函数

double exp2 (double)
似乎比

double exp (double)
考虑到“double”使用二进制表示尾数,我觉得这个结果是合理的

然而,今天,在以几种不同的方式再次测试了两者之后,我看不到任何可测量的差异。所以我的问题是

  • exp2(理论上)应该比exp快吗?及
  • 是否存在任何可测量的差异?及
  • 近几年来,答案有变化吗

有许多平台不太关心它们的数学库,在这些平台上,
exp2(x)
被简单地实现为
exp(x*log(2))
,反之亦然。这些实现不能提供很好的准确性(或特别是性能),但它们相当常见。在这样做的平台上,一个函数的成本与另一个函数一样高,但额外乘法的成本是相同的,而获得额外乘法的函数将是两个函数中速度较慢的

在积极调整数学库并尝试提供良好精度的平台上,这两个函数的性能非常相似。使用
exp2
生成结果的指数更容易,但获取高精度有效位可能需要稍微多一些工作;这两个因素大致相当,性能通常在10-15%的范围内相当。从广义上讲,
exp2
通常是两者中速度较快的。

  • exp2(理论上)应该比exp快吗
是的。
x86 FPU对非整数幂执行幂运算的唯一方法是使用指令
F2XM1
,该指令计算2x-1
x86上不存在ex指令。
x86的任何C库代码都必须使用2x计算
exp
exp2


  • 是否存在任何可测量的差异
否。
不同之处仅在于单个FPU乘法,这对于现代处理器来说非常快


  • 近几年来,答案有变化吗
是的。

15-20年前,乘法运算的价格远远高于其他运算的价格。如今,乘法几乎和加法一样便宜。

我做了一些测量,希望你们中的一些人会发现它有用

条件:
  • (测试期间服务器的CPU负载较高)
  • 编译器版本:g++(Ubuntu 5.4.0-6ubuntu1~16.04.12)5.4.0 20160609
  • 编译器选项:
    -static-std=gnu++0x-ffast-math-Ofast-flto
守则:
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
双g=1/对数(2);
mt19937发动机(1000);
均匀实分布u(0,1);
双和=0;
自动开始=标准::时钟::高分辨率时钟::现在();
对于(inti=0;i<1e7/4;++i)//对于非并行,`for(inti=0;i<1e7;++i)`
{
sum+=exp2(u(引擎)*g);//对于exp版本,sum+=exp(u(引擎));对于空版本,sum+=u(引擎)*g;
sum+=exp2(u(引擎)*g);//因非并行而删除
sum+=exp2(u(引擎)*g);//因非并行而删除
sum+=exp2(u(引擎)*g);//因非并行而删除
}
自动结束=标准::时钟::高分辨率时钟::现在();

难道现在没有人使用F2XM1来实现
exp()
exp2()
,除非他们正在编写最慢的实现。基于SSE的实现速度明显更快,尽管没有特殊的指令支持。@Stephennon-为什么多项式近似(10-20 SSE指令)似乎比单个F2XM1 FPU指令快?因为F2XM1需要约50-70+个周期,这取决于微结构,并且根本不是流水线。在50个周期中,Haswell可以同时执行800个双精度触发器(向量;200个标量触发器可能更相关)和数百个整数指令。
|   name  | time (ms) | std (ms) | smallest (ms) |
|:-------:|:---------:|:--------:|:-------------:|
|  empty  |   244.7   |   26.2   |     130.9     |
|   exp   |   591.7   |   95.8   |     422.5     |
|   exp2  |   536.5   |   85.4   |     393.7     |
|  exp p4 |   612.3   |   89.6   |     433.2     |
| exp2 p4 |   557.2   |   87.6   |     396.8     |