Redian新闻
>
请教:double比float算起来还快?
avatar
请教:double比float算起来还快?# Programming - 葵花宝典
l*e
1
我在dual core Opetron 64位 Ubuntu 机器上用g++ -O3 ./test.cpp -o test 编译的
两个程序。time显示第一个只用0.195s 但第二个却用了0.668s。有人知道为什么么?
难道说如果用64位机器把所有用float的地方换成double反而会节省时间? 谢谢。
int main()
{
for(double b=0;b<1;b+=1e-4) for(double a=0;a<1;a+=1e-4);
}
int main()
{
for(float b=0;b<1;b+=1e-4) for(float a=0;a<1;a+=1e-4);
}
avatar
f*Q
2
把汇编贴上来看看吧,俺感觉这个循环会被优化掉,俺这里是gcc4.0,就不献丑了。
avatar
l*e
3
我试了一下不开 -O3 ,float 还是比 double 慢一倍。 对了,我用的是gcc 4.1.2
这是不开 -O3 的 float:
.file "test.cpp"
.section .rodata
.align 8
.LC1:
.long 3944497965
.long 1058682594
.align 4
.LC2:
.long 1065353216
.text
.align 2
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $0x00000000, %eax
movl %eax, -8(%rbp)
jmp .L2
.L3:
movl $0x00000000, %eax
movl %eax, -4(%rbp)
jmp .L4
.L5:
cvtss2sd -4(%rbp), %xmm0
movsd .LC1(%rip), %xmm1
addsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %x
avatar
t*t
4
你程序写得不对, 要用float就全用float, 如果float和double混用, 那float就先换算
成double, 再换回来, 当然慢了
你要写b+=1e-4f, a+=1e-4f就对了.



【在 l*****e 的大作中提到】
: 我在dual core Opetron 64位 Ubuntu 机器上用g++ -O3 ./test.cpp -o test 编译的
: 两个程序。time显示第一个只用0.195s 但第二个却用了0.668s。有人知道为什么么?
: 难道说如果用64位机器把所有用float的地方换成double反而会节省时间? 谢谢。
: int main()
: {
: for(double b=0;b<1;b+=1e-4) for(double a=0;a<1;a+=1e-4);
: }
: int main()
: {
: for(float b=0;b<1;b+=1e-4) for(float a=0;a<1;a+=1e-4);

avatar
f*Q
5
cvtss2sd? cvtsd2ss?
这个好像是把float转成double,然后用double的SSE指令算的(为什么编译器这么干俺
就不知道了,可能快,高手指教),然后在把算完的结果从double转成float。中间
float的比doble的多了两个转换,结果就慢了。
现在的编译器很牛嘛!
avatar
f*Q
6
原来如此。我还在想这换来换去的干啥呢。
avatar
l*e
7
试了一下改成1e-4f,两个时间基本一样了。谢谢。
那看来只在64位上跑的程序把float 改成double 只有好处没有坏处喽?不错不错
avatar
t*t
8
for single data, they are almost the same
however, SIMD instructions can process 4 float each time, for double, only 2
. you do the math.

【在 l*****e 的大作中提到】
: 试了一下改成1e-4f,两个时间基本一样了。谢谢。
: 那看来只在64位上跑的程序把float 改成double 只有好处没有坏处喽?不错不错

avatar
l*e
9
我把我程序的float全改double居然加速了25%。该加"f"的时候要加上是个好习惯。随
便编个程序让GCC编译的话,SIMD好象很难被用到啊。
avatar
d*z
10
不过现在能够支持SIMD的编译器应该还不多

2

【在 t****t 的大作中提到】
: for single data, they are almost the same
: however, SIMD instructions can process 4 float each time, for double, only 2
: . you do the math.

avatar
f*Q
11
但是你上面的汇编里面一堆SIMD指令啊。
avatar
t*t
12
是一堆SISD指令, 没有MD

【在 f*****Q 的大作中提到】
: 但是你上面的汇编里面一堆SIMD指令啊。
avatar
f*Q
13
不好意思。pd跟sd没走脑子,又丢人了。gcc的autovect好像至少应该在4.1还是4.2的
时候就有了吧?俺记得好像要给SSE/SSE2的参数就行。
另外这个循环没有被优化掉俺很诧异。俺试了试llvm,啥都没了,直接返回。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。