I don't recall seeing an error where the obs and exp were equal. I saw plenty where they were not equal.
The code is pretty simple:
double observed = a[i];
double expected = (double) i;
if (observed != expected) {
printf ("failed at i=%u, k=%u (obs %.18g vs exp %.18g)\n",i, k,observed, expected);
};
Maybe it is just some unexpected handling on the != operator with doubles?
Are you seeing cases where obs!=exp? And difference if you run it on a uni-proc server vs. a smp server?
No. I just found a problem in SKAS sigcontext handling. The fp-registers are not restored correctly. Then, I remembered the problems with memtest, which uses floatpoint. I modified the test to have sighandlers being started evey 10ms, using the fpu in the sighandler. Then, *many* error occured in my "memtest2". Without the modification, I couldn't reproduce the problems.
Two questions: 1) are you able to reproduce the problems in TT-mode? 2) do you have any idea, why a signal handler using floatpoint should be started, while running the original memtest?
Have attached my memtest2.c
Regards Bodo
P.S.: Mail with full description of the problem I've found will follow soon.
Regards, Peter
Bodo Stroesser wrote:
Carl wrote:
Hi,
Running the piece of code from the URL below is generating errors on various UML kernels:
http://downloads.rimuhosting.com/memtest.c
Kernels tested are: 2.4.27, 2.4.27-bs1, 2.6.9-bb4.
Different UML host servers have been tried too, and only UMLs running on SMP (dual Xeon) servers seem to have the problem (P4s with HT are fine).
Can anyone else reproduce the errors? Any ideas?
Thanks, Carl
Do you see messages like this one
"failed at i=17240, k=85 (obs 17240 vs exp 17240)"
with obs and exp being equal?
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/time.h>
#define N (20*1024) void sighdlr(int sig) { double a; a = 256; double observed = a; double expected = 257; if ( observed == expected ) printf("Error in sighdlr()\n"); } int main (void) { size_t i, k; struct itimerval itimer = { { 0, 10000}, { 0, 10000} }; signal(SIGALRM, sighdlr); setitimer( ITIMER_REAL, &itimer, NULL); for (k = 1; k < 1000; k++) { double *a = malloc (N * sizeof (double)); if (a == 0) { printf ("malloc failed at k=%u\n", k); exit (1); } for (i = 0; i < N; i++) { a[i] = (double) i; double observed = a[i]; double expected = (double) i; if (observed != expected) { printf ("failed at i=%u, k=%u (obs %.18g vs exp %.18g)\n", i, k, observed, expected); } } for (i = 0; i < N; i++) { double observed = a[i]; double expected = (double) i; if (observed != expected) { printf ("failed at i=%u, k=%u (obs %.18g vs exp %.18g)\n", i, k, observed, expected); // exit (1); } } free (a); } exit (0); }