tweaked some testapps
authorMatthias Braun <matze@braunis.de>
Fri, 17 Nov 2006 12:01:59 +0000 (12:01 +0000)
committerMatthias Braun <matze@braunis.de>
Fri, 17 Nov 2006 12:01:59 +0000 (12:01 +0000)
ir/be/test/HeapSort.c
ir/be/test/simd1.c
ir/be/test/simd2.c

index 723982c..3879b78 100644 (file)
 /**
  * Heapsort-Algorithmus laut Vorlesung.
  */
-/** Array mit Heap */
-int *a;
 /** Größe des Heaps */
 int N;
 
 /**
  * Tauscht die Elemente a[i] und a[j].
  */
-void exchange(int i,int j) {
-  int v;
-  v = a[i];
-  a[i] = a[j];
-  a[j] = v;
+void exchange(int *a, int i, int j) {
+       int v;
+       v = a[i];
+       a[i] = a[j];
+       a[j] = v;
 }
 
 /**
  * Läßt a[k] im Feld aufsteigen.
  */
-void upheap(int k) {
-  while ((k > 0) && (a[k] < a[k / 2])) {
-    exchange(k, k / 2);
-    k = k / 2;
-  }
+void upheap(int *a, int k) {
+       while ((k > 0) && (a[k] < a[k / 2])) {
+               exchange(a, k, k / 2);
+               k = k / 2;
+       }
 }
 
 /**
  * Fügt das neue Element v in den Heap der Größe N
  * ein und erhöht N um 1
  */
-void insert(int v) {
-  a[N] = v;
-  upheap(N);
-  N++;
+void insert(int *a, int v) {
+       a[N] = v;
+       upheap(a, N);
+       N++;
 }
 
 /**
 * Läßt a[k] im Feld versickern.
 */
-void downheap(int k) {
-  int j = 2 * k;
-  if (j < N) {    // a[k] hat linken Sohn a[j]
-    if (j + 1 < N)   // a[k] hat auch rechten Sohn a[j+1]
-      if (a[j] > a[j + 1])
-       j++;        // Jetzt ist a[j] der kleinere Sohn von a[k]
-    if (a[k] > a[j]) {
-      exchange(k, j);
-      downheap(j);
-    }
-  }
+void downheap(int *a, int k) {
+       int j = 2 * k;
+       if (j < N) {    // a[k] hat linken Sohn a[j]
+               if (j + 1 < N)   // a[k] hat auch rechten Sohn a[j+1]
+                       if (a[j] > a[j + 1])
+                               j++;        // Jetzt ist a[j] der kleinere Sohn von a[k]
+               if (a[k] > a[j]) {
+                       exchange(a, k, j);
+                       downheap(a, j);
+               }
+       }
 }
 
 /**
  * Liefert als Resultat das Heap-Element a[k], entfernt a[k]
  * aus dem Heap und stellt die Heap-Eigenschaft wieder her.
  */
-int removeh(int k) {
-  int v = a[k];
-  a[k] = a[--N];
-  if ((k > 0) && (a[k] < a[k / 2]))
-    upheap(k);
-  else
-    downheap(k);
-  return v;
+int removeh(int *a, int k) {
+       int v = a[k];
+       a[k] = a[--N];
+       if ((k > 0) && (a[k] < a[k / 2]))
+               upheap(a, k);
+       else
+               downheap(a, k);
+
+       return v;
 }
 
 /**
  * Aufbau des Heaps durch downheap.
  */
-void heapaufbau1(void) {
-  int k;
+void heapaufbau1(int *a) {
+       int k;
 
-  for (k = N / 2; k >= 1; k--)
-    downheap(k);
+       for (k = N / 2; k >= 1; k--)
+               downheap(a, k);
 }
 
 /**
  * Aufbau des Heaps durch insert.
  */
-void heapaufbau2(int *b, int len) {
-  int k;
-  N = 0;
-  for (k = 0; k < len; ++k)
-    insert(b[k]);
+void heapaufbau2(int *a, int *b, int len) {
+       int k;
+       N = 0;
+       for (k = 0; k < len; ++k)
+               insert(a, b[k]);
 }
 
 /**
@@ -108,18 +107,32 @@ void heapaufbau2(int *b, int len) {
  * Heap-Methoden und gibt das sortierte Feld zurück.
  */
 int *heapsort(int *b, int len) {
-  int i, k;
-  int *c;
-
-  // Globale Variablen für die Heap-Methoden setzen
-  a = (void *)malloc(sizeof(*a) * len);
-  heapaufbau2(b, len);
-
-  // Ergebnis in c kopieren
-  c = (void *)malloc(sizeof(*c) * len);
-  for (k = 0; k < len; k++)
-    c[k] = removeh(0);
-  return c;
+       int i, k;
+       int *c;
+       int *a;
+
+       // Globale Variablen für die Heap-Methoden setzen
+       a = malloc(sizeof(a[0]) * len);
+       heapaufbau2(a, b, len);
+
+       // Ergebnis in c kopieren
+       c = malloc(sizeof(c[0]) * len);
+       for (k = 0; k < len; k++)
+               c[k] = removeh(a, 0);
+
+       return c;
+}
+
+int verify(int* fld, int count) {
+    int i;
+    int last = fld[0];
+    for(i = 1; i < count; ++i) {
+        if(fld[i] < last)
+            return 0;
+        last = fld[i];
+    }
+
+    return 1;
 }
 
 /**
@@ -132,50 +145,40 @@ int *heapsort(int *b, int len) {
  * </pre>
  */
 int main (int argc, char *argv[]) {
-  // Umwandeln der Argumente in Zahlen
-  int *b;
-  int i, len;
-
-  printf("Heap.c\n");
-
-  len = argc - 1;
-
-  if (len < 1) {
-      static int _b[] = {3, 18, 5, 99, 104, 2};
-      printf("Usage: HeapSort <list of numbers>\n");
-      printf("Continuing with default input.\n");
-      b = _b;
-      len = sizeof(_b)/sizeof(_b[0]);
-  }
-  else {
-    b = (void *)malloc(len * sizeof(*b));
-
-    for(i = 0; i < argc-1; i++) {
-      b[i] = atoi(argv[i+1]);
-      printf(" %d\n", b[i]);
-    }
-  }
-
-  // Ausgabe
-  //System.out.print("array={");
-  // printf("length of array to sort: %d -- first element b[0]: %d\n", len, b[0]);
-  printf(" array = ");
-  for(i = 0; i < len - 1; i++) {
-    printf(" %d,", b[i]);
-  }
-  if (len > 0) {
-    printf(" %d\n", b[len - 1]);
-  }
-  // Sortieren
-  b = heapsort(b, len);
-
-  // Ausgabe
-  printf(" sorted array = ");
-  for(i = 0; i < len - 1; i++) {
-    printf(" %d,", b[i]);
-  }
-  if (len > 0) {
-    printf(" %d\n", b[len - 1]);
-  }
-  return 0;
+       // Umwandeln der Argumente in Zahlen
+       int *b;
+       int i, count, seed;
+
+       printf("Heap.c\n");
+
+       if(argc > 1)
+               count = atoi(argv[1]);
+       else
+               count = 10000;
+
+       if(argc > 2)
+               seed = atoi(argv[2]);
+       else
+               seed = 123456;
+
+       srand(seed);
+
+       b = (void*) malloc(sizeof(b[0]) * count);
+       for(i = 0; i < count; ++i)
+               b[i] = rand();
+
+       printf("Sorting %d random numbers (seed %d)\n",
+          count, seed);
+
+       // Sortieren
+       b = heapsort(b, count);
+
+       printf("Sorted.\n");
+
+       if(verify(b, count))
+               printf("Verify succeeded.\n");
+       else
+               printf("Verify failed.\n");
+
+       return 0;
 }
index ebadd47..c704853 100644 (file)
@@ -30,12 +30,17 @@ unsigned int sse8_16bit_c(  const short * b1,
 //#define MAX 65536
 #define MAX (ITERS * STRIDE)
 
-int main(){
+int main(int argc, char** argv){
        short cur[MAX];
        short ref[MAX];
        int sum = 0;
        int numofruns = 10;
        int i,ii;
+
+       if(argc > 1) {
+               numofruns = atoi(argv[1]);
+       }
+
        for (i=0;i < numofruns; i++){
                // Reset cache. Alles andere ist unrealistisch.
                for(ii = 0; ii < MAX; ++ii) {
@@ -43,7 +48,8 @@ int main(){
                        ref[ii]=(ii+i+3)&0xff;
                }
                sum = sse8_16bit_c(cur, ref, STRIDE);
-               printf("sum[%i] = %i\n",i, sum);
+               if(i < 10)
+                       printf("sum[%i] = %i\n",i, sum);
        }
 
        return 0 ;
index 39ce28c..a4d56d5 100644 (file)
@@ -44,12 +44,17 @@ unsigned int sad16_c(       const unsigned char * const cur,
 
 }
 
-int main(){
+int main(int argc, char** argv){
   unsigned char cur[65536];
   unsigned char ref[65536];
   int sum = 0;
   int numofruns = 100;
   int i,ii;
+
+  if(argc > 1) {
+         numofruns = atoi(argv[1]);
+  }
+
   for (i=0;i < numofruns; i++){
    // Reset cache. Alles andere ist unrealistisch.
     for(ii = 0; ii<65536;ii++){