/*************************************************************************** * * * OpenMP MicroBenchmark Suite - Version 2.0 * * * * produced by * * * * Mark Bull and Fiona Reid * * * * at * * * * Edinburgh Parallel Computing Centre * * * * email: markb@epcc.ed.ac.uk or fiona@epcc.ed.ac.uk * * * * * * This version copyright (c) The University of Edinburgh, 2004. * * All rights reserved. * * * **************************************************************************/ #include #include #include #define MHZ 900 #define OUTERREPS 20 #define CONF95 1.96 int nthreads, delaylength, innerreps, itersperthr, cksz; double times[OUTERREPS+1], reftime, refsd; void delay(int); void getdelay(void); void refer(void); void stats(double*, double*); void teststatic(void); void teststaticn(void); void testdynamicn(void); void testguidedn(void); int main (int argv, char **argc) { #pragma omp parallel { #pragma omp master { nthreads = omp_get_num_threads(); } } printf("Running OpenMP benchmark on %d thread(s)\n", nthreads); /* TUNE LENGTH OF LOOP BODY */ getdelay(); itersperthr = 128; innerreps = 1000; /* GENERATE REFERENCE TIME */ refer(); /* TEST STATIC */ teststatic(); /* TEST STATIC,n */ cksz = 1; while (cksz <= itersperthr){ teststaticn(); cksz *= 2; } /* TEST DYNAMIC,n */ cksz = 1; while (cksz <= itersperthr){ testdynamicn(); cksz *= 2; } /* TEST GUIDED,n */ cksz = 1; while (cksz <= itersperthr/nthreads){ testguidedn(); cksz *= 2; } } void getdelay() { int i,reps; double actualtime, targettime, start; double getclock(void); /* CHOOSE delaylength SO THAT call delay(delaylength) TAKES APPROXIMATELY 100 CPU CLOCK CYCLES */ delaylength = 0; reps = 10000; actualtime = 0.; targettime = 100.0 / (double) MHZ * 1e-06; delay(delaylength); while (actualtime < targettime) { delaylength = delaylength * 1.1 + 1; start = getclock(); for (i=0; i< reps; i++) { delay(delaylength); } actualtime = (getclock() - start) / (double) reps; } start = getclock(); for (i=0; i< reps; i++) { delay(delaylength); } actualtime = (getclock() - start) / (double) reps; printf("Assumed clock rate = %d MHz \n",MHZ); printf("Delay length = %d\n", delaylength); printf("Delay time = %f cycles\n", actualtime * MHZ * 1e6); } void refer() { int i,j,k; double start; double meantime, sd; double getclock(void); printf("\n"); printf("--------------------------------------------------------\n"); printf("Computing reference time\n"); for (k=0; k<=OUTERREPS; k++){ start = getclock(); for (j=0; j times[i]) ? maxtime : times[i]; totaltime +=times[i]; } meantime = totaltime / OUTERREPS; sumsq = 0; for (i=1; i<=OUTERREPS; i++){ sumsq += (times[i]-meantime)* (times[i]-meantime); } sd = sqrt(sumsq/(OUTERREPS-1)); cutoff = 3.0 * sd; nr = 0; for (i=1; i<=OUTERREPS; i++){ if ( fabs(times[i]-meantime) > cutoff ) nr ++; } printf("\n"); printf("Sample_size Average Min Max S.D. Outliers\n"); printf(" %d %f %f %f %f %d\n",OUTERREPS, meantime, mintime, maxtime, sd, nr); printf("\n"); *mtp = meantime; *sdp = sd; }