[我对问题进行了全局编辑,以使其更加“有用”且清晰明了]
我想知道在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/