]> git.somenet.org - pub/jan/parprog.git/blob - prefix/hillis_partial.c
mpiscan now has timings.
[pub/jan/parprog.git] / prefix / hillis_partial.c
1 /*
2  * O(nlog n) work algorithm (Hillis-Steele)
3  */
4 #include "hillis_partial.h"
5
6 /*
7  * Hillis/Steele, partial prefix sum version
8  */
9 void algorithm (numtype x[], unsigned long size, unsigned int ops[]) {
10         numtype *y;
11         unsigned long k;
12         unsigned long i;
13
14         y = malloc(size * sizeof(numtype));
15         y[0] = x[0];
16
17         for (k=1; k<size; k<<=1) {
18                 #pragma omp parallel for shared (x, y, ops, k) private (i)
19                 for (i=k; i<size; i++) {
20 #ifdef DEBUG
21                         printf ("y[%li] = x[%li] + x[%li]; // %li + %li\n", i, i-k, i, x[i-k], x[i]);
22 #endif
23                         y[i] = x[i-k]+x[i];
24                 }
25                 memcpy (x, y, size * sizeof(numtype));
26         }
27
28         if (y != NULL) {
29                 free(y);
30                 y = NULL;
31         }else{
32                 printf ("Has not been freed!!!\n");
33         }
34 }