Skip to content

Commit b982a9e

Browse files
rootroot
authored andcommitted
some fix
1 parent 63e9466 commit b982a9e

File tree

1 file changed

+48
-39
lines changed

1 file changed

+48
-39
lines changed

tasks/tbb/veselov_i_systemsgradmethod/src/systemsgradmethod_tbb.cpp

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,32 @@ using namespace std::chrono_literals;
1515

1616
namespace veselov_i_tbb {
1717
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;
3830
}
3931

4032
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);
4234
tbb::parallel_for(tbb::blocked_range<int>(0, n),
4335
[&](const tbb::blocked_range<int>& r) {
4436
for (int i = r.begin(); i != r.end(); ++i) {
4537
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];
4739
}
4840
}
4941
}
5042
);
51-
return result;
43+
return res;
5244
}
5345

5446
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
6355
double alpha = dotProduct(r, r) / dotProduct(Ap, p);
6456

6557
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) {
6860
res[i] += alpha * p[i];
6961
}
7062
}
7163
);
7264

7365
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) {
7668
r[i] = r_old[i] - alpha * Ap[i];
7769
}
7870
}
@@ -84,8 +76,8 @@ std::vector<double> SLEgradSolver(const std::vector<double> &Aa, const std::vect
8476
double beta = dotProduct(r, r) / dotProduct(r_old, r_old);
8577

8678
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) {
8981
p[i] = r[i] + beta * p[i];
9082
}
9183
}
@@ -159,27 +151,44 @@ bool checkSolution(const std::vector<double> &Aa, const std::vector<double> &bb,
159151
}
160152

161153
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);
162157
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+
}
166163
}
164+
);
167165
return res;
168166
}
169167

170168
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);
171172
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+
}
176180
}
177181
}
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+
}
181189
}
182190
}
191+
);
183192
return matrix;
184193
}
185194
} // namespace veselov_i_tbb

0 commit comments

Comments
 (0)