Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sdd.hp.com!spool2.mu.edu!news.cs.indiana.edu!noose.ecn.purdue.edu!cidmac.ecn.purdue.edu!3ksnn64 From: 3ksnn64@cidmac.ecn.purdue.edu (Joe Cychosz) Newsgroups: comp.arch Subject: Re: reliable/reproduceable benchmarks on SGI MIPS box Message-ID: <1991Jan3.035143.18865@noose.ecn.purdue.edu> Date: 3 Jan 91 03:51:43 GMT References: <11737@alice.att.com> <44383@mips.mips.COM> Sender: news@noose.ecn.purdue.edu (USENET news) Organization: Purdue University Engineering Computer Network Lines: 127 In article <11737@alice.att.com> andrew@alice.att.com (Andrew Hume) writes: > > I am running some benchmarks on a variety of machines >and in particular, on a SGI 4D/380, a multiprocesor with 8 >33MHz R3000 cpus. ... > my problem is that I see quite large variations over >multiple runs of the same benchmark, sometimes as much as >1.26%. Now, the resolution of the timer is .01s and i should se >an accuracy of about .01/40 or .025%. I am a factor of 50 off this. >does anyone know how i can run these benchmarks so as to get reproducible >timings? (i note as an aside that just running the benchmarks on the cray >in multi-user mode yields variations of the order of .15% which is >satisfactory). I am puzzled why you think the accuracy should be .01/40? Anyway my experience with the 60hz and 100hz clocks is that they are not exceptionally accurate and are suseptable to process switching. Someone gets the whole interval, even though they may have used only a small portion of that interval. The Cray uses a very accurate clock which runs at the cycle time of the machine (~6ns for YMP). I do not know if SGI has made access to the hi-res clock on the MIPS chip yet. This doesn't really solve your problem here, but it may come in handy when running benchmarks. /* ---- second - Return user CPU time in seconds. --------------------- */ /* */ /* Runction to return the elapse CPU time in seconds. To properly */ /* compute the elapse CPU time, the function should be called */ /* twice, once in the beginning to get the initial CPU time, and */ /* a second time to get the ending time. The elapse time is then */ /* the computed difference between the two times. */ /* between the two times. */ /* */ /* */ /* machine low-res hi-res */ /* Ardent Titan 100Hz 62.5ns */ /* BBN Butterfly TC-2000 100Hz */ /* Convex C220 60Hz 1us */ /* Cray 2, XMP, YMP ~6ns YMP */ /* ETA 10 100Hz P 24ns, P* 21, Q 19, E 10.5 */ /* F 8.5, G 7 */ /* Gould 9080 and NP1 60Hz */ /* Silicon Graphics 4D 100Hz */ /* Sun 3 and 4 60Hz */ /* Vax 11/780 60Hz */ /* */ /* Author: */ /* J. M. Cychosz 12/15/89. */ /* Purdue University CADLAB */ /* */ /* -------------------------------------------------------------------- */ #include #include /* HZ defined here */ #include /* used by times() */ #include /* used by getrusage() */ #include #if ardent extern double fputim ( double ); #endif #if butterfly /* HZ not defined for BBN TC2000*/ #define HZ 100.0 #endif #if eta10 #include static int Pico_per_Cycle; /* ETA10 ps per machine cycle */ int asm q8ic7 () { tfc %18 } #endif #if gould /* HZ not defined for Gould 9080*/ #define HZ 60.0 /* or NP1 */ #endif /* ---- second - Return user CPU time in seconds. --------------------- */ double second () { #if ardent /* Ardent Titan: use internal MIPS clock*/ return ( (double) fputim (0.0) ); #define _CLOCK_ #endif #if convex /* Convex C220: use 1us clock */ struct rusage res; getrusage (0,&res); return ( (double) (res.ru_exutime.tv_sec + res.ru_exutime.tv_usec*1e-6) ); #define _CLOCK_ #endif #if eta10 /* ETA 10: use real time clock */ if (!Pico_per_Cycle) (void) syseta (ETA_PSPERCYCLE, &Pico_per_Cycle); return ( (double) q8ic7 () * (Pico_per_Cycle * 1e-12) ); #define _CLOCK_ #endif #ifndef _CLOCK_ /* Default: use low-res times() clock */ struct tms clock; times (&clock); /* HZ = 60.0 Convex, Sun, Gould, Vax */ /* HZ = 100.0 SGI, Ardent, BBN Butterfly, ETA 10 */ /* HZ = function(cycle_time) on Cray 2, XMP, and YMP */ return ( (double) clock.tms_utime / HZ ); #endif }