| Deutsch English Français Italiano |
|
<6729ED5E.30500@grunge.pl> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!news.misty.com!weretis.net!feeder9.news.weretis.net!news.nk.ca!rocksolid2!i2pn2.org!.POSTED!not-for-mail
From: fir <fir@grunge.pl>
Newsgroups: comp.lang.c
Subject: Re: is double slower?
Date: Tue, 05 Nov 2024 11:03:10 +0100
Organization: i2pn2 (i2pn.org)
Message-ID: <6729ED5E.30500@grunge.pl>
References: <4d5973952030c993c48f93329fc25be7f236e2c5@i2pn2.org> <vgck4n$1e7dd$1@dont-email.me> <6729EA1E.60703@grunge.pl>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Info: i2pn2.org;
logging-data="1040335"; mail-complaints-to="usenet@i2pn2.org";
posting-account="+ydHcGjgSeBt3Wz3WTfKefUptpAWaXduqfw5xdfsuS0";
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0 SeaMonkey/2.24
To: David Brown <david.brown@hesbynett.no>
X-Spam-Checker-Version: SpamAssassin 4.0.0
In-Reply-To: <6729EA1E.60703@grunge.pl>
Bytes: 6662
Lines: 169
fir wrote:
> David Brown wrote:
>> On 04/11/2024 08:53, fir wrote:
>>> float takes less space and when you keep arrays of floats for sure float
>>> is better (less spase and uses less memory bandwidth so i guess floats
>>> can be as twice faster in some aspects)
>>>
>>
>> Certainly if you have a lot of them, then the memory bandwidth and cache
>> it rate can make floats faster than doubles.
>>
>>> but when you do calculations on local variables not floats do the
>>> double is slower?
>>
>> I assume that for the calculations in question, the accuracy and range
>> of float is enough - otherwise the answer is obviously use doubles.
>>
>>
>> This is going to depend on the cpu, the type of instructions, the source
>> code in question, the compiler and the options. So there is no single
>> easy answer.
>>
>> You can, as Bonita suggested, look up instruction timing information at
>> agner.org for the cpu you are using (assuming it's an x86 device) to get
>> some idea of any fundamental differences in timings. Usually for modern
>> "big" processors, basic operations such as addition and multiplication
>> are single cycle or faster (i.e., multiple instructions can be done in
>> parallel) for float and double. But division, square root, and other
>> more complex operations can take a lot longer with doubles.
>>
>> Next, consider if you can be using vector or SIMD operations. On some
>> devices, you can do that with floats but not doubles - and even if you
>> can use doubles, you can usually run floats at twice the rate.
>>
>>
>> In the source code, remember it is very easy to accidentally promote to
>> double when writing in C. If you want to stick to floats, make sure you
>> don't use double-precision constants - a missing "f" suffix can change a
>> whole expression into double calculations. Remember that it takes time
>> to convert between float and double.
>>
>>
>> Then look at your compiler flags - these can make a big difference to
>> the speed of floating point code. I'm giving gcc flags, because those
>> are the ones I know - if you are using another compiler, look at the
>> details of its flags.
>>
>> Obviously you want optimisation enabled if speed is relevant - -O2 is a
>> good start. Make sure you are optimising for the cpu(s) you are using -
>> "-march=native" is good for local programs, but you will want something
>> more specific if the binary needs to run on a variety of machines. The
>> closer you are to the exact cpu model, the better the code scheduling
>> and instruction choice can be.
>>
>> Look closely at "-ffast-math" in the gcc manual. If that is suitable
>> for your code (and it often is), it can make a huge difference to
>> floating point intensive code. If it is unsuitable because you have
>> infinities, or need deterministic control of things like associativity,
>> it will make your results wrong.
>>
>> "-Wdouble-promotion" can be helpful to spot accidental use of doubles in
>> what you think is a float expression. "-Wfloat-equal" is a good idea,
>> especially if you are mixing floats and doubles. "-Wfloat-conversion"
>> will warn about implicit conversions from doubles to floats (or to
>> integers).
>>
>>
>>
> the code that seem to speeded up a bit when turning float to double is
>
> union Color
> {
> unsigned u;
> struct { unsigned char b,g,r,a;};
> };
>
>
> inline float distance2d_(float x1, float y1, float x2, float y2)
> {
> return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
> }
>
> inline unsigned GetPixelUnsafe_(int x, int y)
> {
> return frame_bitmap[y*frame_size_x+x];
> }
> inline void SetPixelUnsafe_(int x, int y, unsigned color)
> {
> frame_bitmap[y*frame_size_x+x]=color;
> }
>
> void DrawPoint(int i)
> {
> // if(!point[i].enabled) return;
>
> int xq = point[i].x;
> int yq = point[i].y;
>
> Color c;
> Color bc;
>
> if(d_toggler)
> {
> // DrawCircle(xq,yq,point[i].radius,0xffffff);
> FillCircle(xq,yq,point[i].radius,point[i].c.u);
>
> return;
> }
>
> float R = point[i].radius*5;
>
> int y_start = max(0, yq-R);
> int y_end = min(frame_size_y, yq+R);
> int x_start = max(0, xq-R);
> int x_end = min(frame_size_x, xq+R);
>
> for(int y = y_start; y<y_end; y++)
> {
> for(int x = x_start; x<x_end; x++)
> {
> //fere below was float ->
> double p = (R - distance2d_(x,y,point[i].x,point[i].y));
>
>
> if(!i_toggler)
> {
> if(p<0.4*R) continue;
> }
> else
> if(p<0) continue;
>
> p/=R;
>
> bc.u = GetPixelUnsafe_(x,y);
> int r = bc.r + (point[i].c.r)* p*p*p;
> int g = bc.g + (point[i].c.g)* p*p*p;
> int b = bc.b + (point[i].c.b)* p*p*p;
>
> if(!r_toggler)
> {
> if(r>255) r = 255;
> if(g>255) g = 255;
> if(b>255) b = 255;
> }
>
> c.r = r;
> c.g = g;
> c.b = b;
>
> SetPixelUnsafe_(x,y,c.u);
>
> }
> }
>
> }
>
> this just draws something like little light that darkens as 1/(r*r*r)
> and is able to add n-lights in place to mix colors end eventually
> "overlight" (so this is kinda blending)
>
> its very time consuming liek draving 100 of them (rhen r is 9) was
> taking 35 ms on old machine afair)
some can test it BTW
https://drive.google.com/file/d/1-Obb6F19h5yfCbCETP4-VFoV3XYGpRsN/view?usp=sharing
its for windows but worx under wine afair /and on linux wirtual machine
on windows also (afair, i dont know as i got only windows)