]> git.somenet.org - pub/astra/parallel.git/blob - openmp/merge/sort.c
updated, funktioniert mit teilern von LISTLENGTH
[pub/astra/parallel.git] / openmp / merge / sort.c
1 /* implementation of parallel merge sort */
2 #include <stdio.h>
3 #include <omp.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6
7 #define LISTSIZE 10
8
9 void printlist(char * message, int * ptr) {
10         printf (message);
11         while (*ptr != -1) {
12                 printf (" %i", *ptr);
13                 ptr++;
14         }
15         printf ("\n");
16 }
17
18 int rank(int elem, int * list) {
19         int pos;
20         
21         pos = 0;
22         if (elem == -1) { return -1; }
23         while (*list >= 0) {
24                 /*printf ("elem_list: %i %i\n", elem, *list);*/
25                 if (elem <= *list) {
26                         return pos;
27                 }
28                 list++;
29                 pos++;
30         }
31         return -1;
32 }
33
34 /* merge(a,n,b,m,c): merges a of size n and b of size m into c */
35 void merge(int ti, int * a, int n, int * b, int m, int * c) {
36         int sum;
37         int i;
38         sleep (1);
39         /*printf ("sorting a:%i (%i) and b:%i (%i)\n", *a, n, *b, m);*/
40         if (m<0) { m=0;}
41         if (n<0) { n=0;}
42         sum = n + m;
43         //printf ("%i modifying %i (%i+%i) (c[%i]/0x%08x -> c[%i]/0x%08x)\n", ti, sum, n, m, 0, (unsigned int) &c, sum-1, ((unsigned int) &c)+sum);
44         i = 0;
45         while (i < sum) {
46                 if (*a < 0 && *b < 0) {
47                         printf ("%i Calculation failed somehow...\n", ti);
48                         return;
49                 }
50                 if (*a < 0) {
51                         c[i] = *b; m--;
52                         b++;
53                 } else {
54                         if (*b < 0) {
55                                 c[i] = *a; n--;
56                                 a++;
57                         } else {
58                                 if (*a < *b) {
59                                         c[i] = *a; n--;
60                                         a++;
61                                 } else {
62                                         c[i] = *b; m--;
63                                         b++;
64                                 }
65                         }
66                 }
67                 i++;
68         }
69         return;
70 }
71
72 int main ( int argc, char ** argv) {
73         int n = LISTSIZE;
74         int p = 1;
75         int opt, i;
76         int a_len, b_len, b_len_end, b_len_begin;
77         int a[] = {0,3,4,14,61,62,70,72,74,84,-1};
78         int b[] = {1,2,7,34,35,68,77,78,79,99,-1};
79         int * c;
80
81         while ((opt = getopt(argc, argv, "t:")) != -1) {
82                 switch (opt) {
83                         case 't':
84                                 p = atoi(optarg);
85                                 break;
86                         default: /* '?' */
87                                 fprintf(stderr, "Usage: %s [-t threads]\n", argv[0]);
88                                 exit(EXIT_FAILURE);
89                 }
90         }
91
92         printf ("----------------------------------\n");
93
94         c = (int *) malloc((LISTSIZE * 2 + 1) * (sizeof (int)));
95         c[LISTSIZE*2] = -1;
96
97         printlist("0 Sorted List A:", a);
98         printlist("0 Sorted List B:", b);
99
100         a_len = n/p;
101 #pragma omp parallel for shared(a,b,c,n,p,a_len) private(i,b_len_begin,b_len_end,b_len)
102         for (i = 0; i < p; i++) {
103                 b_len_begin = rank(a[i*a_len], b);
104                 b_len_end = rank(a[(i+1)*a_len], b);
105                 if (b_len_begin < 0) {
106                         printf ("Insert to end of list!\n");
107                         b_len_begin = n;
108                 }
109                 if (b_len_end < 0) {
110                         printf ("Reached end of list!\n");
111                         b_len_end = n;
112                 }
113                 b_len = b_len_end - b_len_begin;
114                 printf ("%i a_len: %i, b_len: %i (begin:%i ([%i]) -> end:%i [%i])\n", i+1, a_len, b_len, b_len_begin, b[b_len_begin], b_len_end, b[b_len_end]);
115                 merge(  i+1,
116                                 &a[i*a_len],
117                                 a_len,
118                                 &b[b_len_begin],
119                                 b_len,
120                                 &c[i*a_len+b_len_begin]);
121         }
122
123         printlist("Sorted List:", c);
124         free(c);
125         return 0;
126 }