gnucap-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnucap-devel] Re: [Ngspice-devel] ngspice and GNUcap


From: al davis
Subject: [Gnucap-devel] Re: [Ngspice-devel] ngspice and GNUcap
Date: Thu, 7 Dec 2006 14:59:46 -0500
User-agent: KMail/1.9.5

I am also posting a copy this to the gnucap developer list.

On Thursday 07 December 2006 11:01, John Doe wrote:
> "-floatstore" is the slowest possible way to ensure 64 bit.
>  It writes to memory after every math operation.  To ensure
> 64 bit in the FPU use the code from the link I mentioned:
> http://www.wrcad.com/linux_numerics.txt
>
>       #ifdef linux
>       #include <fpu_control.h>
>       #endif
>
>       main(argc, **argv)
>       {
>       #ifdef linux
>         /*
>         This puts the X86 FPU in 64-bit precision mode.  The
> default under Linux is to use 80-bit mode, which produces
> subtle differences from FreeBSD and other systems, eg,
> (int)(1000*atof("0.3")) is 300 in 64-bit mode, 299 in 80-bit
> mode.
>         */
>         fpu_control_t cw;
>         _FPU_GETCW(cw);
>         cw &= ~_FPU_EXTENDED;
>         cw |= _FPU_DOUBLE;
>         _FPU_SETCW(cw);
>       #endif
>
>
> This is much faster. 

Thanks, you are correct.  It runs at the same speed as with 
only -O2, and has 6 test differences relative to the AMD.

One of the differences was the time step I mentioned before.  In 
one test it chose different time stepping.  This is not an 
error.  I guess it just shows that the issue doesn't go away 
completely, you can only minimize it.

Another difference was a Fourier analysis of a pure sine wave.  
We all know that there is one frequency and nothing anywhere 
else, but calculating it there is a small noise component at 
every frequency.  In either case, noise is about 300 dB below 
the desired component, but with insignificant variations.

I made a plugin, so I could try it without recompiling or 
relinking.  That was the easiest way to try it.

> Also, I would never use "-fastmath" as 
> it is not IEEE compliant.

That alone does not say to never use it, but rather to be aware 
of the problems.  I would not use it in this case because it 
appears to have problems and provides no benefit.

Now the big question ..  should it be forced to 64 bit mode?

I am not sure of the answer here.  In favor of 64 bit mode, it 
is more predictable, in the sense of a better match of text 
based comparisons.  In favor of the 80 bit mode, it is in 
theory more accurate, less prone to rounding errors that might 
be caused by something like poor conditioning of the matrix.  
It could be argued that the 80 bit mode is an improvement.

As far as ng-spice is concerned, someone else can make that 
decision.

For gnucap, I try to keep machine specific stuff out of the 
core, and consider increased precision to be an advantage.  I 
see your point about consistency, meaning it should at least be 
available as an option.  The ability to turn it on and off is 
valuable in evaluating the robustness of algorithms.  I now 
know how to do it.  Thank you for making me look at it again.  
I will make it available as a plug-in.  I have not decided 
whether it will be installed by default or not.

I am leaning toward not installing it by default.  This is 
consistent with other defaults, such as turning on all of the 
mixed-mode and what is now known as "fast-spice" options by 
default.  comments???

I also made a plugin that converts it to single precision, just 
to see what would happen.  I don't recommend it.  A lot of 
tests fail with real errors.  It didn't run any faster.  I 
think the limited range of single precision was a bigger factor 
than the reduced number of digits, but I did not do any more 
than run the test suite.  It wasn't just reduced accuracy.  
There were convergence failures, obviously incorrect results, 
time stepping problems, ...  It might be useful to developers 
to check robustness of algorithms.  To a regular user, it makes 
the whole thing useless.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]