由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教:double比float算起来还快?
相关主题
问个double和long double的问题问几个问题
《Intel® 64 and IA-32体系结构:软件开发人员手册》文字版[PDF]一个小问题
在图像算法领域,纯java没戏,用java和c++混合编程很恶心float -> double, double -> long double (C++)
黑c++的人是不是坐井观天?double's equality
C++ Builder支持MMX/SSE/SSE2命令吗?一个dot net浮点运算的问题
瓶颈在哪儿?c++ 中如何把str转换为float?
震惊:java 的矩阵操作比 c++ 快?请版上的C++牛人讲一下g++的优化参数
怎么提高C++计算精度? C++ vs Matlab (转载)怎样提高C#计算程序的performance?
相关话题的讨论汇总
话题: float话题: double话题: 1e话题: rbp话题: main
进入Programming版参与讨论
1 (共1页)
l*****e
发帖数: 276
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);
}
f*****Q
发帖数: 1912
2
把汇编贴上来看看吧,俺感觉这个循环会被优化掉,俺这里是gcc4.0,就不献丑了。
l*****e
发帖数: 276
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
t****t
发帖数: 6806
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);

f*****Q
发帖数: 1912
5
cvtss2sd? cvtsd2ss?
这个好像是把float转成double,然后用double的SSE指令算的(为什么编译器这么干俺
就不知道了,可能快,高手指教),然后在把算完的结果从double转成float。中间
float的比doble的多了两个转换,结果就慢了。
现在的编译器很牛嘛!
f*****Q
发帖数: 1912
6
原来如此。我还在想这换来换去的干啥呢。
l*****e
发帖数: 276
7
试了一下改成1e-4f,两个时间基本一样了。谢谢。
那看来只在64位上跑的程序把float 改成double 只有好处没有坏处喽?不错不错
t****t
发帖数: 6806
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 只有好处没有坏处喽?不错不错

l*****e
发帖数: 276
9
我把我程序的float全改double居然加速了25%。该加"f"的时候要加上是个好习惯。随
便编个程序让GCC编译的话,SIMD好象很难被用到啊。
d*z
发帖数: 150
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.

f*****Q
发帖数: 1912
11
但是你上面的汇编里面一堆SIMD指令啊。
t****t
发帖数: 6806
12
是一堆SISD指令, 没有MD

【在 f*****Q 的大作中提到】
: 但是你上面的汇编里面一堆SIMD指令啊。
f*****Q
发帖数: 1912
13
不好意思。pd跟sd没走脑子,又丢人了。gcc的autovect好像至少应该在4.1还是4.2的
时候就有了吧?俺记得好像要给SSE/SSE2的参数就行。
另外这个循环没有被优化掉俺很诧异。俺试了试llvm,啥都没了,直接返回。
1 (共1页)
进入Programming版参与讨论
相关主题
怎样提高C#计算程序的performance?C++ Builder支持MMX/SSE/SSE2命令吗?
请教关于float的精度和比较瓶颈在哪儿?
In C++, how to do matrix computation?震惊:java 的矩阵操作比 c++ 快?
c++11有了shared_ptr,可以当java用了怎么提高C++计算精度? C++ vs Matlab (转载)
问个double和long double的问题问几个问题
《Intel® 64 and IA-32体系结构:软件开发人员手册》文字版[PDF]一个小问题
在图像算法领域,纯java没戏,用java和c++混合编程很恶心float -> double, double -> long double (C++)
黑c++的人是不是坐井观天?double's equality
相关话题的讨论汇总
话题: float话题: double话题: 1e话题: rbp话题: main