/*************************************************************************** * * * 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 OUTERREPS 20 #define CONF95 1.96 int nthreads, delaylength, innerreps; double times[OUTERREPS+1], reftime, refsd; void delay(int); void refer(void); void referatom(void); void referred(void); void testpr(void); void testfor(void); void testpfor(void); void testbar(void); void testsing(void); void testcrit(void); void testlock(void); void testorder(void); void testatom(void); void testred(void); void stats(double*, double*); 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); delaylength = 500; innerreps = 10000; /* GENERATE REFERENCE TIME */ refer(); /* TEST PARALLEL REGION */ innerreps = 1000; testpr(); /* TEST FOR */ testfor(); /* TEST PARALLEL FOR */ testpfor(); /* TEST BARRIER */ testbar(); /* TEST SINGLE */ testsing(); /* TEST CRITICAL*/ innerreps = 100000; testcrit(); /* TEST LOCK/UNLOCK */ testlock(); /* TEST ORDERED SECTION */ innerreps = 1000; testorder(); /* GENERATE NEW REFERENCE TIME */ innerreps = 100000; referatom(); /* TEST ATOMIC */ testatom(); /* GENERATE NEW REFERENCE TIME */ innerreps = 10000; referred(); /* TEST REDUCTION (1 var) */ innerreps = 1000; testred(); } void refer() { int j,k; double start; double meantime, sd; double getclock(void); printf("\n"); printf("--------------------------------------------------------\n"); printf("Computing reference time 1\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; }