forked from IntelLabs/SpMP
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPrefixSum.cpp
65 lines (53 loc) · 1.17 KB
/
PrefixSum.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "Utils.hpp"
namespace SpMP
{
void prefixSum(int *in_out, int *sum, int *workspace)
{
int nthreads = omp_get_num_threads();
int tid = omp_get_thread_num();
workspace[tid + 1] = *in_out;
#pragma omp barrier
#pragma omp master
{
workspace[0] = 0;
int i;
for (i = 1; i < nthreads; i++) {
workspace[i + 1] += workspace[i];
}
*sum = workspace[nthreads];
}
#pragma omp barrier
*in_out = workspace[tid];
}
void prefixSumMultiple(int *in_out, int *sum, int n, int *workspace)
{
int nthreads = omp_get_num_threads();
int tid = omp_get_thread_num();
int i;
for (i = 0; i < n; i++) {
workspace[(tid + 1)*n + i] = in_out[i];
}
#pragma omp barrier
#pragma omp master
{
for (i = 0; i < n; i++) {
workspace[i] = 0;
}
int t;
// assuming n is not so big, we don't parallelize this loop
for (t = 1; t < nthreads; t++)
{
for (i = 0; i < n; i++) {
workspace[(t + 1)*n + i] += workspace[t*n + i];
}
}
for (i = 0; i < n; i++) {
sum[i] = workspace[nthreads*n + i];
}
}
#pragma omp barrier
for (i = 0; i < n; i++) {
in_out[i] = workspace[tid*n + i];
}
}
} // namespace SpMP