Re: Question: Using floating point in the kernel

From: Richard B. Johnson (root@chaos.analogic.com)
Date: Thu Sep 21 2000 - 17:51:48 EST


On Thu, 21 Sep 2000, Alan Cox wrote:

> > > > It is sufficient when you do tsk->flags |= PF_USEDFPU first.
> > >
> > > Unless you sleep
> >
> > Unless I'm missing something the lazy FPU state save in the 2.4 switch_to will
> > do the right thing at least on x86. Your kernel FPU state will overwrite the
> > user FPU state in current, but that's ok because it is undefined anyways
> > (and you restore the correct state when you wake up again)
>
> 2.4 maybe. Im not totally sure on that code. 2.2 wont
>

If you fire off about 20 copies of this, then execute the X-SERVER,
they will eventually all fail. Takes about 20 minutes on my machine.
I tried to update, but they don't support my screen-card anymore. This
was, I think, their first attempt at MMX stuff.

This is an old X-Server:

XFree86 Version 3.3.3.1 / X Window System
(protocol Version 11, revision 0, vendor release 6300)
Release Date: December 29 1998
        If the server is older than 6-12 months, or if your card is newer
        than the above date, look for a newer version before reporting
        problems. (see http://www.XFree86.Org/FAQ)

Here's the test code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>

#define ARRAY_LEN 0x10000

int main()
{
   double *d0, *d1;
   size_t i;
   if((d0 = malloc(ARRAY_LEN *sizeof(double))) == NULL)
   {
        fprintf(stderr, "Memory allocation error\n");
        exit(EXIT_FAILURE);
   }
   if((d1 = malloc(ARRAY_LEN *sizeof(double))) == NULL)
   {
        fprintf(stderr, "Memory allocation error\n");
        exit(EXIT_FAILURE);
   }
   for(;;)
   {
       for(i=0; i< ARRAY_LEN; i++)
          d0[i] = cos((double) (i % 60));
       for(i=0; i< ARRAY_LEN; i++)
          d1[i] = cos((double) (i % 60));
       if(memcmp((char*)d0, (char *)d1, ARRAY_LEN * sizeof(double)))
       {
            for(i=0; i< ARRAY_LEN; i++)
                if(d0[i] != d1[i]) break;
            fprintf(stderr, "Floating point error at offset %u ", i);
            fprintf(stderr, "d0[%u]=%f, d1[%u]=%f\n", i, d0[i], i, d1[i]);
            exit(EXIT_FAILURE);
       }
   }
}

Somebody who has RAID or whatever with MMX may want to try this.

Cheers,
Dick Johnson

Penguin : Linux version 2.2.15 on an i686 machine (797.90 BogoMips).

"Memory is like gasoline. You use it up when you are running. Of
course you get it all back when you reboot..."; Actual explanation
obtained from the Micro$oft help desk.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Sep 23 2000 - 21:00:25 EST