Newsgroups: | comp.compilers |
From: | dik@cwi.nl (Dik T. Winter) |
Keywords: | C, optimize |
Organization: | CWI, Amsterdam |
References: | <3aqv5k$e27@monalisa.usc.edu> 94-11-147 |
Date: | Thu, 24 Nov 1994 03:05:54 GMT |
zxu@monalisa.usc.edu (Zhiwei Xu) writes:
[ deleted ... except for inner loop: ]
> w = 1.0 / (double) N ;
> for(i=1;i<=N;i=i+1) {
> local = ( ((double) i) - 0.5 ) * w ;
> pi = pi + 4.0 / ( 1.0 + local * local ) ;
> }
>
weaver@weitek.COM (Michael Gordon Weaver) writes:
> I believe that on the machines you mention, double operations should be about
> the same speed as float.
No, on the RS6000 (and so also the SP2) single is in general slower than
double. On the Sparc they are about the same time.
>
> I investigated this on my workstation (Sun4), by looking at the assembly
> and found that:
> 1. the constants (0.5, 4.0, 1.0) were stored as double
> 2. in the expressions, the float variables were converted
> to double, rather than the constants being converted
> to single.
And this is the key for Sparc. C mandates that in expressions conversions
are performed to some common type before calculation. So, when you write
local = ( ((double) i) - 0.5) * w;
i is converted to double (that is what the program says), 0.5 is a double
constant (according to the standard), the result is a double, so one
operand of * is double and the other has to be converted to double (again
according to the standard), finally the result of the multiplication is
transformed to single.
> I was able
> the 'correct' code by replacing the constants (0.5,4.0,1.0) with
> (0.5f,4.0f,1.0f), respectively. Then the program ran about the same speed
> as the original, all double version.
>
Did you also change "(double) i" to "(float) i"?
--
dik t. winter, cwi, kruislaan 413, 1098 sj amsterdam, nederland, +31205924098
home: bovenover 215, 1025 jn amsterdam, nederland; e-mail: dik@cwi.nl
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.