Messages in this thread | | | Date | 12 Jan 1999 05:28:49 -0000 | From | Robert Woodcock <> | Subject | Re: 'Detected 19943xxx Hz processor'-fluctuations... |
| |
Charles Cazabon <charlesc-linux@qcc.sk.ca> wrote: >Dag Wieers <dag@digibel.be> wrote: >> i don't think it really is random, maybe it differs beause the state of >> the processor differs little. can't we use this to statistically measure >> something about that processor ? >> >> the real question is: what causes these fluctuations ? >> >You're talking +-1000 cycles out of 200 million. This could easily be due >to ambient temperature differences or other environmental factors.
Just for kicks I decided to let mhz.estimate run for a while in a loop, that way I get thousands more quite-possibly-less-accurate statistics. Out of 59000 runs, here are the most deviant 20:
374.865421 374.865944 374.865967 374.866508 374.866577 374.867146 374.867292 374.867333 374.867610 374.867645 [...] 374.947681 374.947712 374.947716 374.947962 374.952847 374.960404 378.688356 378.688474 378.689010 378.725015
Another interesting statistic:
cat mhz.estimate.output | wc -l 59218 cat mhz.estimate.output | cut -f1 -d' ' | sort | uniq | wc -l 11147
After running gnuplot over it, I see a very straight line. It appears my motherboard's clock is not affected by temperature. There are some interesting dips and jolts but nothing resembling a curve.
Adding up all the numbers and dividing by 59218 gives us: 374.929090476, meaning the max deviation is -.063669476/+3.795924524. The average deviation, something much more useful, I'm too lazy to calculate. :)
Stripping out anything so deviant to not be in the 374 range, our plot looks like so:
http://frantica.lly.org/~rcw/mhz-plot-19990111.png
mhz.estimate.c is below:
#include <stdio.h> #include <unistd.h> #include <sys/time.h>
/* returns number of clock cycles since last reboot */ __inline__ unsigned long long int rdtsc() { unsigned long long int x; __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x; }
main () { /* find out the MHz of the processor by dividing * clock cycles by seconds */ struct timezone tz; struct timeval tvstart, tvstop; unsigned long long int cycles[2]; /* gotta be 64 bit */ unsigned int microseconds; /* total time taken */ bzero(&tz, sizeof(tz));
gettimeofday(&tvstart, &tz); cycles[0] = rdtsc(); gettimeofday(&tvstart, &tz); #ifdef VERBOSE printf("Clock cycles at start: %Lu\n", cycles[0]); #endif usleep(1000000); cycles[1] = rdtsc(); gettimeofday(&tvstop, &tz); microseconds = ((tvstop.tv_sec-tvstart.tv_sec)*1000000)+(tvstop.tv_usec-tvstart.tv_usec);
#ifdef VERBOSE printf("Clock cycles at end: %Lu\n", cycles[1]); printf("Microseconds elapsed: %u\n", microseconds); #endif printf("%f MHz processor.\n", (float)(cycles[1]-cycles[0])/microseconds); } -- Robert Woodcock - rcw@debian.org "Unix and C are the ultimate computer viruses" -- Richard Gabriel
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |