-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreduction.cpp
141 lines (113 loc) · 3.06 KB
/
reduction.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include "reduction.h"
int MAX_OP(int i1, int i2, int first_call)
{
return (i1 < i2) ? i2 : i1;
}
int MIN_OP(int i1, int i2, int first_call)
{
return (i1 < i2) ? i1 : i2;
}
int NNZ_MIN_OP(int i1, int i2, int first_call)
{
return (i2 > 0) && (i2 < i1) ? i2 : i1;
}
int SUM_OP(int i1, int i2, int first_call)
{
return i1 + i2;
}
int UNIT_SUM_OP(int i1, int i2, int first_call)
{
return i2 > 0 ? i1 + 1 : i1;
}
int reduce_2d(int **arr, int num_elems, int *num_elems_2, int operation(const int, const int, const int), int initial_value)
{
if (num_elems <= 1)
return 0;
int reduction_val = operation(initial_value, arr[0][0], 1);
int init_j = 1;
for (int i = 0; i < num_elems; i++)
{
for (int j = init_j; j < num_elems_2[i]; j++)
{
reduction_val = operation(reduction_val, arr[i][j], 0);
}
init_j = 0;
}
return reduction_val;
}
int reduce(int *arr, TENSORSIZE_T num_elems, int operation(const int, const int, const int), int initial_value)
{
if (num_elems <= 1)
return 0;
int reduction_val = operation(initial_value, arr[0], 1);
TENSORSIZE_T i; // TT: there was a warning to compare i & num_elems
// for (int i = 1; i < num_elems; i++)
for (i = 1; i < num_elems; i++)
{
reduction_val = operation(reduction_val, arr[i], 0);
}
return reduction_val;
}
int reduce_min(int *arr, TENSORSIZE_T num_elems)
{
if (num_elems <= 1)
return 0;
int reduction_val = INT_MAX;
#pragma omp parallel for reduction(min \
: reduction_val)
// #pragma omp parallel for
for (TENSORSIZE_T i = 0; i < num_elems; i++)
{
if (arr[i] < reduction_val)
{
// #pragma omp critical
reduction_val = arr[i];
}
}
return reduction_val;
}
int reduce_max(int *arr, TENSORSIZE_T num_elems)
{
if (num_elems <= 1)
return 0;
int reduction_val = 0;
#pragma omp parallel for reduction(max \
: reduction_val)
for (TENSORSIZE_T i = 0; i < num_elems; i++)
{
if (arr[i] > reduction_val)
reduction_val = arr[i];
}
return reduction_val;
}
TENSORSIZE_T reduce_sum(int *arr, TENSORSIZE_T num_elems)
{
if (num_elems <= 1)
return 0;
TENSORSIZE_T reduction_val = 0;
#pragma omp parallel for reduction(+ \
: reduction_val)
for (TENSORSIZE_T i = 0; i < num_elems; i++)
{
reduction_val += arr[i];
}
return reduction_val;
}
int reduce_adjNnzPerSlice(int order, int *dim, TENSORSIZE_T num_slices, int *nnzPerSlice)
{
int total = 0;
int index_offset = 0;
for (int i = 0; i < order; i++)
{
for (int j = 1; j < dim[i]; j++)
{
total += abs(nnzPerSlice[index_offset + j] - nnzPerSlice[index_offset + j - 1]);
}
index_offset += dim[i];
}
return ((double)total) / num_slices;
}
int reduce_adjNnzPerFiber(int order, int *dim, TENSORSIZE_T num_fibers, int *nnzPerFiber)
{
return 0;
}