summaryrefslogtreecommitdiff
path: root/numsort.c
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2008-11-11 22:34:57 +0000
committerMatt Turner <mattst88@gmail.com>2008-11-11 22:34:57 +0000
commit1fa9357768c1b4b2301b7341656dbc81e531c9f6 (patch)
tree09866b6fc5eb52f13a44228fbbd7be543131942f /numsort.c
parent9e43555ab77b3a486948f2de4a878cc0d6d0c275 (diff)
-- Split nbench1.c into component files
-- Combine wordcat.h with huffman routines in huffman.c -- Readd NNET.DAT (oops) -- Update Makefile to build component files git-svn-id: svn://mattst88.com/svn/cleanbench/trunk@3 0d43b9a7-5ab2-4d7b-af9d-f64450cef757
Diffstat (limited to 'numsort.c')
-rw-r--r--numsort.c292
1 files changed, 292 insertions, 0 deletions
diff --git a/numsort.c b/numsort.c
new file mode 100644
index 0000000..936b390
--- /dev/null
+++ b/numsort.c
@@ -0,0 +1,292 @@
+#include <stdio.h>
+#include <stdint.h>
+/*
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <math.h>
+*/
+#include "nmglobal.h"
+#include "nbench1.h"
+
+/*********************
+** NUMERIC HEAPSORT **
+**********************
+** This test implements a heapsort algorithm, performed on an
+** array of longs.
+*/
+
+/**************
+** DoNumSort **
+***************
+** This routine performs the CPU numeric sort test.
+** NOTE: Last version incorrectly stated that the routine
+** returned result in # of longword sorted per second.
+** Not so; the routine returns # of iterations per sec.
+*/
+
+void DoNumSort(void)
+{
+SortStruct *numsortstruct; /* Local pointer to global struct */
+long *arraybase; /* Base pointers of array */
+long accumtime; /* Accumulated time */
+double iterations; /* Iteration counter */
+char *errorcontext; /* Error context string pointer */
+int systemerror; /* For holding error codes */
+
+/*
+** Link to global structure
+*/
+numsortstruct=&global_numsortstruct;
+
+/*
+** Set the error context string.
+*/
+errorcontext="CPU:Numeric Sort";
+
+/*
+** See if we need to do self adjustment code.
+*/
+if(numsortstruct->adjust==0)
+{
+ /*
+ ** Self-adjustment code. The system begins by sorting 1
+ ** array. If it does that in no time, then two arrays
+ ** are built and sorted. This process continues until
+ ** enough arrays are built to handle the tolerance.
+ */
+ numsortstruct->numarrays=1;
+ while(1)
+ {
+ /*
+ ** Allocate space for arrays
+ */
+ arraybase=(long *)AllocateMemory(sizeof(long) *
+ numsortstruct->numarrays * numsortstruct->arraysize,
+ &systemerror);
+ if(systemerror)
+ { ReportError(errorcontext,systemerror);
+ FreeMemory((void *)arraybase,
+ &systemerror);
+ }
+
+ /*
+ ** Do an iteration of the numeric sort. If the
+ ** elapsed time is less than or equal to the permitted
+ ** minimum, then allocate for more arrays and
+ ** try again.
+ */
+ if(DoNumSortIteration(arraybase,
+ numsortstruct->arraysize,
+ numsortstruct->numarrays)>global_min_ticks)
+ break; /* We're ok...exit */
+
+ FreeMemory((void *)arraybase,&systemerror);
+ if(numsortstruct->numarrays++>NUMNUMARRAYS)
+ { printf("CPU:NSORT -- NUMNUMARRAYS hit.\n");
+ }
+ }
+}
+else
+{ /*
+ ** Allocate space for arrays
+ */
+ arraybase=(long *)AllocateMemory(sizeof(long) *
+ numsortstruct->numarrays * numsortstruct->arraysize,
+ &systemerror);
+ if(systemerror)
+ { ReportError(errorcontext,systemerror);
+ FreeMemory((void *)arraybase,
+ &systemerror);
+ }
+
+}
+/*
+** All's well if we get here. Repeatedly perform sorts until the
+** accumulated elapsed time is greater than # of seconds requested.
+*/
+accumtime=0L;
+iterations=(double)0.0;
+
+do {
+ accumtime+=DoNumSortIteration(arraybase,
+ numsortstruct->arraysize,
+ numsortstruct->numarrays);
+ iterations+=(double)1.0;
+} while(TicksToSecs(accumtime)<numsortstruct->request_secs);
+
+/*
+** Clean up, calculate results, and go home. Be sure to
+** show that we don't have to rerun adjustment code.
+*/
+FreeMemory((void *)arraybase,&systemerror);
+
+numsortstruct->sortspersec=iterations *
+ (double)numsortstruct->numarrays / TicksToFracSecs(accumtime);
+
+if(numsortstruct->adjust==0)
+ numsortstruct->adjust=1;
+
+#ifdef DEBUG
+if (numsort_status==0) printf("Numeric sort: OK\n");
+numsort_status=0;
+#endif
+return;
+}
+
+/***********************
+** DoNumSortIteration **
+************************
+** This routine executes one iteration of the numeric
+** sort benchmark. It returns the number of ticks
+** elapsed for the iteration.
+*/
+static unsigned long DoNumSortIteration(long *arraybase,
+ unsigned long arraysize,
+ unsigned int numarrays)
+{
+unsigned long elapsed; /* Elapsed ticks */
+unsigned long i;
+/*
+** Load up the array with random numbers
+*/
+LoadNumArrayWithRand(arraybase,arraysize,numarrays);
+
+/*
+** Start the stopwatch
+*/
+elapsed=StartStopwatch();
+
+/*
+** Execute a heap of heapsorts
+*/
+for(i=0;i<numarrays;i++)
+ NumHeapSort(arraybase+i*arraysize,0L,arraysize-1L);
+
+/*
+** Get elapsed time
+*/
+elapsed=StopStopwatch(elapsed);
+#ifdef DEBUG
+{
+ for(i=0;i<arraysize-1;i++)
+ { /*
+ ** Compare to check for proper
+ ** sort.
+ */
+ if(arraybase[i+1]<arraybase[i])
+ { printf("Sort Error\n");
+ numsort_status=1;
+ break;
+ }
+ }
+}
+#endif
+
+return(elapsed);
+}
+
+/*************************
+** LoadNumArrayWithRand **
+**************************
+** Load up an array with random longs.
+*/
+static void LoadNumArrayWithRand(long *array, /* Pointer to arrays */
+ unsigned long arraysize,
+ unsigned int numarrays) /* # of elements in array */
+{
+long i; /* Used for index */
+long *darray; /* Destination array pointer */
+/*
+** Initialize the random number generator
+*/
+/* randnum(13L); */
+randnum(13);
+
+/*
+** Load up first array with randoms
+*/
+for(i=0L;i<arraysize;i++)
+ /* array[i]=randnum(0L); */
+ array[i]=randnum((int32_t)0);
+
+/*
+** Now, if there's more than one array to load, copy the
+** first into each of the others.
+*/
+darray=array;
+while(--numarrays)
+{ darray+=arraysize;
+ for(i=0L;i<arraysize;i++)
+ darray[i]=array[i];
+}
+
+return;
+}
+
+/****************
+** NumHeapSort **
+*****************
+** Pass this routine a pointer to an array of long
+** integers. Also pass in minimum and maximum offsets.
+** This routine performs a heap sort on that array.
+*/
+static void NumHeapSort(long *array,
+ unsigned long bottom, /* Lower bound */
+ unsigned long top) /* Upper bound */
+{
+unsigned long temp; /* Used to exchange elements */
+unsigned long i; /* Loop index */
+
+/*
+** First, build a heap in the array
+*/
+for(i=(top/2L); i>0; --i)
+ NumSift(array,i,top);
+
+/*
+** Repeatedly extract maximum from heap and place it at the
+** end of the array. When we get done, we'll have a sorted
+** array.
+*/
+for(i=top; i>0; --i)
+{ NumSift(array,bottom,i);
+ temp=*array; /* Perform exchange */
+ *array=*(array+i);
+ *(array+i)=temp;
+}
+return;
+}
+
+/************
+** NumSift **
+*************
+** Peforms the sift operation on a numeric array,
+** constructing a heap in the array.
+*/
+static void NumSift(long *array, /* Array of numbers */
+ unsigned long i, /* Minimum of array */
+ unsigned long j) /* Maximum of array */
+{
+unsigned long k;
+long temp; /* Used for exchange */
+
+while((i+i)<=j)
+{
+ k=i+i;
+ if(k<j)
+ if(array[k]<array[k+1L])
+ ++k;
+ if(array[i]<array[k])
+ {
+ temp=array[k];
+ array[k]=array[i];
+ array[i]=temp;
+ i=k;
+ }
+ else
+ i=j+1;
+}
+return;
+}
+