MP-Gadget  5.0.1.dev1-76bc7d4726-dirty
test_openmpsort.c
Go to the documentation of this file.
1 #include <stdarg.h>
2 #include <stddef.h>
3 #include <setjmp.h>
4 #include <cmocka.h>
5 #include <stdio.h>
6 #include <omp.h>
7 #include <stdlib.h>
8 
9 #include "stub.h"
10 
11 #if 0
12 static int checksorted(int * start, int nmemb) {
13  int i;
14  for(i = 1; i < nmemb; i ++) {
15  if( start[i-1] > start[i]) {
16  return i;
17  }
18  }
19  return 0;
20 }
21 #endif
22 static int compare(const void *a, const void *b) {
23  return ( *(int*)a - *(int*)b );
24 }
25 
26 struct __data
27 {
28  int dd[200];
29 };
30 /*This exists because large structs are sorted indirectly*/
31 static void test_openmpsort_struct(void ** state) {
32  int i;
33  // set up array to be sorted
34  //a bad case is 87763 threads = 12
35  int size = 187763;
36  struct __data *a = (struct __data *) malloc(size * sizeof(struct __data));
37 
38  srand48(8675309);
39  for(i = 0; i < size; i++)
40  a[i].dd[0] = (int) (size * drand48());
41 
42  double start, end;
43 
44  start = omp_get_wtime();
45  qsort_openmp(a, size, sizeof(struct __data), compare);
46  end = omp_get_wtime();
47 
48  message(1,"parallel sort time = %g s %d threads\n",end-start, omp_get_max_threads());
49  for(i=1; i<size; i++) {
50  if( a[i-1].dd[0] >a[i].dd[0] )
51  message(1,"BAD: %d %d %d\n",i,a[i-1].dd[0],a[i].dd[0]);
52  assert_true(a[i-1].dd[0] <= a[i].dd[0]);
53  }
54 
55  srand48(8675309);
56  for(i = 0; i < size; i++)
57  a[i].dd[0] = (int) (size * drand48());
58 
59  start = omp_get_wtime();
60  qsort(a, size, sizeof(struct __data), compare);
61  end = omp_get_wtime();
62 
63  message(1, "serial (glibc) sort time = %g s\n",end-start);
64 
65 }
66 static void test_openmpsort(void ** state) {
67  int i;
68  // set up array to be sorted
69  //a bad case is 87763 threads = 12
70  int size = 87763;
71  int *a = (int *) malloc(size * sizeof(int));
72 
73  srand48(8675309);
74  for(i = 0; i < size; i++)
75  a[i] = (int) (size * drand48());
76 
77  double start, end;
78 
79  start = omp_get_wtime();
80  qsort_openmp(a, size, sizeof(int), compare);
81  end = omp_get_wtime();
82 
83  message(1,"parallel sort time = %g s %d threads\n",end-start, omp_get_max_threads());
84  for(i=1; i<size; i++) {
85  if( a[i-1]>a[i] )
86  message(1,"BAD: %d %d %d\n",i,a[i-1],a[i]);
87  assert_true(a[i-1] <= a[i]);
88  }
89 
90  srand48(8675309);
91  for(i = 0; i < size; i++)
92  a[i] = (int) (size * drand48());
93 
94  start = omp_get_wtime();
95  qsort(a, size, sizeof(int), compare);
96  end = omp_get_wtime();
97 
98  message(1, "serial sort time = %g s\n",end-start);
99 
100 }
101 
102 int main(void) {
103  const struct CMUnitTest tests[] = {
104  cmocka_unit_test(test_openmpsort),
105  cmocka_unit_test(test_openmpsort_struct),
106  };
107  return cmocka_run_group_tests_mpi(tests, NULL, NULL);
108 }
void message(int where, const char *fmt,...)
Definition: endrun.c:175
int dd[200]
#define qsort_openmp
Definition: test_exchange.c:14
static int compare(const void *a, const void *b)
static void test_openmpsort_struct(void **state)
int main(void)
static void test_openmpsort(void **state)