[我对问题进行了全局编辑,以使其更加“有用”且清晰明了]

我想知道在cmath中实现功能exp的复杂性。

所谓复杂性,是指算法的复杂性。否则,与浮点运算相比,成本(例如,加法)

以下几行:

double x = 3;
double y = std::exp(x);

编译为:
...
19,23d16
       movq    %rax, -40(%rbp)
       movsd   -40(%rbp), %xmm0
       call    exp
       movsd   %xmm0, -40(%rbp)
       movq    -40(%rbp), %rax
...
exp必须在运行时动态加载,但是我找不到很多有关实现算法复杂性的信息。似乎没有对特殊处理器指令的调用(至少在我的带有gcc的x86_64平台上),因此必须有一个我找不到的实现。
在我看来,该算法很可能会使用输入的二进制表示形式来具有非常弱的复杂性,但是我未能找到关于该主题的有值(value)的引用。

也许在这种情况下实际上不可能实现算法复杂性,并且我们所能做的就是测试(请参阅下面的答案),但是我不知道我们如何客观地量化浮点运算和对exp的调用之间的差异?

最佳答案

由于MSVC9编译器进行了一些位魔术,涉及特定的表,位掩码和偏差,因此似乎实际上是恒定的。由于毕竟分支很少,所以指令流水线应该会有所帮助。下面是它的实际作用。

unpcklpd    xmm0,xmm0
movapd      xmm1,xmmword ptr [cv]
movapd      xmm6,xmmword ptr [Shifter]
movapd      xmm2,xmmword ptr [cv+10h]
movapd      xmm3,xmmword ptr [cv+20h]
pextrw      eax,xmm0,3
and         eax,7FFFh
mov         edx,408Fh
sub         edx,eax
sub         eax,3C90h
or          edx,eax
cmp         edx,80000000h
jae         RETURN_ONE
mulpd       xmm1,xmm0
addpd       xmm1,xmm6
movapd      xmm7,xmm1
subpd       xmm1,xmm6
mulpd       xmm2,xmm1
movapd      xmm4,xmmword ptr [cv+30h]
mulpd       xmm3,xmm1
movapd      xmm5,xmmword ptr [cv+40h]
subpd       xmm0,xmm2
movd        eax,xmm7
mov         ecx,eax
and         ecx,3Fh
shl         ecx,4
sar         eax,6
mov         edx,eax
subpd       xmm0,xmm3
movapd      xmm2,xmmword ptr Tbl_addr[ecx]
mulpd       xmm4,xmm0
movapd      xmm1,xmm0
mulpd       xmm0,xmm0
addpd       xmm5,xmm4
mulsd       xmm0,xmm0
addsd       xmm1,xmm2
unpckhpd    xmm2,xmm2
movdqa      xmm6,xmmword ptr [mmask]
pand        xmm7,xmm6
movdqa      xmm6,xmmword ptr [bias]
paddq       xmm7,xmm6
psllq       xmm7,2Eh
mulpd       xmm0,xmm5
addsd       xmm1,xmm0
orpd        xmm2,xmm7
unpckhpd    xmm0,xmm0
addsd       xmm0,xmm1
add         edx,37Eh
cmp         edx,77Ch
ja          ADJUST
mulsd       xmm0,xmm2
sub         esp,10h
addsd       xmm0,xmm2
movlpd      qword ptr [esp+4],xmm0
fld         qword ptr [esp+4]
add         esp,10h
ret

关于c++ - 与FLOP相比,以cmath进行exp的复杂性/实际成本是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3979942/

10-12 02:57