@@ -15,40 +15,32 @@ using namespace std::chrono_literals;
15
15
16
16
namespace veselov_i_tbb {
17
17
double dotProduct (const std::vector<double > &aa, const std::vector<double > &bb) {
18
- double result = 0.0 ;
19
- /* result = tbb::parallel_reduce(
20
- tbb::blocked_range<size_t>(0, aa.size()), 0.0,
21
- [&](const tbb::blocked_range<int>& range, double local_res) {
22
- for (int i = range.begin(); i != range.end(); ++i) {
23
- local_res += aa[i] * bb[i];
24
- }
25
- return local_res;
26
- },
27
- std::plus<>());*/
28
- tbb::parallel_for (tbb::blocked_range<int >(0 , aa.size ()),
29
- [&](const tbb::blocked_range<int >& r) {
30
- double local_result = 0.0 ;
31
- for (int i = r.begin (); i != r.end (); ++i) {
32
- local_result += aa[i] * bb[i];
33
- }
34
- result += local_result;
35
- }
36
- );
37
- return result;
18
+ double res = 0.0 ;
19
+ res = tbb::parallel_reduce (
20
+ tbb::blocked_range<size_t >(0 , aa.size ()), 0.0 ,
21
+ [&](const tbb::blocked_range<size_t >& r, double local_res) -> double {
22
+ for (size_t i = r.begin (); i != r.end (); ++i) {
23
+ local_res += aa[i] * bb[i];
24
+ }
25
+ return local_res;
26
+ },
27
+ std::plus<double >()
28
+ );
29
+ return res;
38
30
}
39
31
40
32
std::vector<double > matrixVectorProduct (const std::vector<double > &Aa, const std::vector<double > &xx, int n) {
41
- std::vector<double > result (n, 0.0 );
33
+ std::vector<double > res (n, 0.0 );
42
34
tbb::parallel_for (tbb::blocked_range<int >(0 , n),
43
35
[&](const tbb::blocked_range<int >& r) {
44
36
for (int i = r.begin (); i != r.end (); ++i) {
45
37
for (int j = 0 ; j < n; ++j) {
46
- result [i] += Aa[i * n + j] * xx[j];
38
+ res [i] += Aa[i * n + j] * xx[j];
47
39
}
48
40
}
49
41
}
50
42
);
51
- return result ;
43
+ return res ;
52
44
}
53
45
54
46
std::vector<double > SLEgradSolver (const std::vector<double > &Aa, const std::vector<double > &bb, int n,
@@ -63,16 +55,16 @@ std::vector<double> SLEgradSolver(const std::vector<double> &Aa, const std::vect
63
55
double alpha = dotProduct (r, r) / dotProduct (Ap, p);
64
56
65
57
tbb::parallel_for (tbb::blocked_range<int >(0 , n),
66
- [&](const tbb::blocked_range<int >& range ) {
67
- for (int i = range .begin (); i != range .end (); ++i) {
58
+ [&](const tbb::blocked_range<int >& r ) {
59
+ for (int i = r .begin (); i != r .end (); ++i) {
68
60
res[i] += alpha * p[i];
69
61
}
70
62
}
71
63
);
72
64
73
65
tbb::parallel_for (tbb::blocked_range<int >(0 , n),
74
- [&](const tbb::blocked_range<int >& range ) {
75
- for (int i = range .begin (); i != range .end (); ++i) {
66
+ [&](const tbb::blocked_range<int >& ra ) {
67
+ for (int i = ra .begin (); i != ra .end (); ++i) {
76
68
r[i] = r_old[i] - alpha * Ap[i];
77
69
}
78
70
}
@@ -84,8 +76,8 @@ std::vector<double> SLEgradSolver(const std::vector<double> &Aa, const std::vect
84
76
double beta = dotProduct (r, r) / dotProduct (r_old, r_old);
85
77
86
78
tbb::parallel_for (tbb::blocked_range<int >(0 , n),
87
- [&](const tbb::blocked_range<int >& range ) {
88
- for (int i = range .begin (); i != range .end (); ++i) {
79
+ [&](const tbb::blocked_range<int >& ra ) {
80
+ for (int i = ra .begin (); i != ra .end (); ++i) {
89
81
p[i] = r[i] + beta * p[i];
90
82
}
91
83
}
@@ -159,27 +151,44 @@ bool checkSolution(const std::vector<double> &Aa, const std::vector<double> &bb,
159
151
}
160
152
161
153
std::vector<double > genRandomVector (int size, int maxVal) {
154
+ std::random_device rd;
155
+ std::mt19937 gen (rd ());
156
+ std::uniform_real_distribution<> distrib (0 , maxVal);
162
157
std::vector<double > res (size);
163
- std::mt19937 gen (4140 );
164
- for (int i = 0 ; i < size; ++i) {
165
- res[i] = static_cast <double >(gen () % maxVal + 1 );
158
+ tbb::parallel_for (tbb::blocked_range<int >(0 , size),
159
+ [&](const tbb::blocked_range<int >& r) {
160
+ for (int i = r.begin (); i != r.end (); ++i) {
161
+ res[i] = distrib (gen);
162
+ }
166
163
}
164
+ );
167
165
return res;
168
166
}
169
167
170
168
std::vector<double > genRandomMatrix (int size, int maxVal) {
169
+ std::random_device rd;
170
+ std::mt19937 gen (rd ());
171
+ std::uniform_real_distribution<> distrib (0 , maxVal);
171
172
std::vector<double > matrix (size * size);
172
- std::mt19937 gen (4041 );
173
- for (int i = 0 ; i < size; ++i) {
174
- for (int j = i; j < size; ++j) {
175
- matrix[i * size + j] = static_cast <double >(gen () % maxVal + 1 );
173
+
174
+ tbb::parallel_for (tbb::blocked_range<int >(0 , size),
175
+ [&](const tbb::blocked_range<int >& r) {
176
+ for (int i = r.begin (); i != r.end (); ++i) {
177
+ for (int j = i; j < size; ++j) {
178
+ matrix[i * size + j] = distrib (gen);
179
+ }
176
180
}
177
181
}
178
- for (int i = 0 ; i < size; ++i) {
179
- for (int j = 0 ; j < i; ++j) {
180
- matrix[i * size + j] = matrix[j * size + i];
182
+ );
183
+ tbb::parallel_for (tbb::blocked_range<int >(0 , size),
184
+ [&](const tbb::blocked_range<int >& r) {
185
+ for (int i = r.begin (); i != r.end (); ++i) {
186
+ for (int j = 0 ; j < i; ++j) {
187
+ matrix[i * size + j] = matrix[j * size + i];
188
+ }
181
189
}
182
190
}
191
+ );
183
192
return matrix;
184
193
}
185
194
} // namespace veselov_i_tbb
0 commit comments