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 | |
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 | |
t****t 发帖数: 6806 | 12 是一堆SISD指令, 没有MD
【在 f*****Q 的大作中提到】 : 但是你上面的汇编里面一堆SIMD指令啊。
|
f*****Q 发帖数: 1912 | 13 不好意思。pd跟sd没走脑子,又丢人了。gcc的autovect好像至少应该在4.1还是4.2的
时候就有了吧?俺记得好像要给SSE/SSE2的参数就行。
另外这个循环没有被优化掉俺很诧异。俺试了试llvm,啥都没了,直接返回。 |