GCC Code Coverage Report


Directory: ./
File: tasks/morozova_s_strassen_multiplication/tbb/src/ops_tbb.cpp
Date: 2026-06-04 20:25:32
Exec Total Coverage
Lines: 106 134 79.1%
Functions: 16 25 64.0%
Branches: 88 172 51.2%

Line Branch Exec Source
1 #include "morozova_s_strassen_multiplication/tbb/include/ops_tbb.hpp"
2
3 #include <tbb/blocked_range2d.h>
4 #include <tbb/parallel_for.h>
5
6 #include <cmath>
7 #include <cstddef>
8 #include <vector>
9
10 #include "morozova_s_strassen_multiplication/common/include/common.hpp"
11
12 namespace morozova_s_strassen_multiplication {
13
14 namespace {
15
16 44 Matrix AddMatrixImpl(const Matrix &a, const Matrix &b) {
17 44 int n = a.size;
18 Matrix result(n);
19
20
1/4
✓ Branch 1 taken 44 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12989 tbb::parallel_for(tbb::blocked_range2d<int>(0, n, 0, n), [&a, &b, &result](const tbb::blocked_range2d<int> &r) {
21
2/2
✓ Branch 0 taken 46080 times.
✓ Branch 1 taken 12945 times.
59025 for (int i = r.rows().begin(); i < r.rows().end(); ++i) {
22
2/2
✓ Branch 0 taken 180224 times.
✓ Branch 1 taken 46080 times.
226304 for (int j = r.cols().begin(); j < r.cols().end(); ++j) {
23 180224 result(i, j) = a(i, j) + b(i, j);
24 }
25 }
26 12945 });
27
28 44 return result;
29 }
30
31 28 Matrix SubtractMatrixImpl(const Matrix &a, const Matrix &b) {
32 28 int n = a.size;
33 Matrix result(n);
34
35
1/4
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
7971 tbb::parallel_for(tbb::blocked_range2d<int>(0, n, 0, n), [&a, &b, &result](const tbb::blocked_range2d<int> &r) {
36
2/2
✓ Branch 0 taken 29121 times.
✓ Branch 1 taken 7943 times.
37064 for (int i = r.rows().begin(); i < r.rows().end(); ++i) {
37
2/2
✓ Branch 0 taken 114688 times.
✓ Branch 1 taken 29121 times.
143809 for (int j = r.cols().begin(); j < r.cols().end(); ++j) {
38 114688 result(i, j) = a(i, j) - b(i, j);
39 }
40 }
41 7943 });
42
43 28 return result;
44 }
45
46 Matrix MultiplyStandardImpl(const Matrix &a, const Matrix &b) {
47 int n = a.size;
48 Matrix result(n);
49
50 tbb::parallel_for(tbb::blocked_range2d<int>(0, n, 0, n), [&a, &b, &result, n](const tbb::blocked_range2d<int> &r) {
51 for (int i = r.rows().begin(); i < r.rows().end(); ++i) {
52 for (int j = r.cols().begin(); j < r.cols().end(); ++j) {
53 double sum = 0.0;
54 for (int k = 0; k < n; ++k) {
55 sum += a(i, k) * b(k, j);
56 }
57 result(i, j) = sum;
58 }
59 }
60 });
61
62 return result;
63 }
64
65 8 void SplitMatrixImpl(const Matrix &m, Matrix &m11, Matrix &m12, Matrix &m21, Matrix &m22) {
66 8 int n = m.size;
67 8 int half = n / 2;
68
69 8 tbb::parallel_for(tbb::blocked_range2d<int>(0, half, 0, half),
70 2482 [&m, &m11, &m12, &m21, &m22, half](const tbb::blocked_range2d<int> &r) {
71
2/2
✓ Branch 0 taken 8414 times.
✓ Branch 1 taken 2474 times.
10888 for (int i = r.rows().begin(); i < r.rows().end(); ++i) {
72
2/2
✓ Branch 0 taken 32768 times.
✓ Branch 1 taken 8414 times.
41182 for (int j = r.cols().begin(); j < r.cols().end(); ++j) {
73 32768 m11(i, j) = m(i, j);
74 32768 m12(i, j) = m(i, j + half);
75 32768 m21(i, j) = m(i + half, j);
76 32768 m22(i, j) = m(i + half, j + half);
77 }
78 }
79 2474 });
80 8 }
81
82 4 Matrix MergeMatricesImpl(const Matrix &m11, const Matrix &m12, const Matrix &m21, const Matrix &m22) {
83 4 int half = m11.size;
84 4 int n = 2 * half;
85 Matrix result(n);
86
87 4 tbb::parallel_for(tbb::blocked_range2d<int>(0, half, 0, half),
88
1/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
1286 [&m11, &m12, &m21, &m22, &result, half](const tbb::blocked_range2d<int> &r) {
89
2/2
✓ Branch 0 taken 4260 times.
✓ Branch 1 taken 1282 times.
5542 for (int i = r.rows().begin(); i < r.rows().end(); ++i) {
90
2/2
✓ Branch 0 taken 16384 times.
✓ Branch 1 taken 4260 times.
20644 for (int j = r.cols().begin(); j < r.cols().end(); ++j) {
91 16384 result(i, j) = m11(i, j);
92 16384 result(i, j + half) = m12(i, j);
93 16384 result(i + half, j) = m21(i, j);
94 16384 result(i + half, j + half) = m22(i, j);
95 }
96 }
97 1282 });
98
99 4 return result;
100 }
101
102 60 Matrix MultiplyStandardParallelImpl(const Matrix &a, const Matrix &b) {
103 60 int n = a.size;
104 Matrix result(n);
105
106
1/4
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12528 tbb::parallel_for(tbb::blocked_range2d<int>(0, n, 0, n), [&a, &b, &result, n](const tbb::blocked_range2d<int> &r) {
107
2/2
✓ Branch 0 taken 37374 times.
✓ Branch 1 taken 12468 times.
49842 for (int i = r.rows().begin(); i < r.rows().end(); ++i) {
108
2/2
✓ Branch 0 taken 136568 times.
✓ Branch 1 taken 37374 times.
173942 for (int j = r.cols().begin(); j < r.cols().end(); ++j) {
109 double sum = 0.0;
110
2/2
✓ Branch 0 taken 8538512 times.
✓ Branch 1 taken 136568 times.
8675080 for (int k = 0; k < n; ++k) {
111 8538512 sum += a(i, k) * b(k, j);
112 }
113 136568 result(i, j) = sum;
114 }
115 }
116 12468 });
117
118 60 return result;
119 }
120
121 4 Matrix MultiplyStrassenIterative(const Matrix &a, const Matrix &b, int leaf_size) {
122 4 int n = a.size;
123
124
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
4 if (n <= leaf_size || n % 2 != 0) {
125 return MultiplyStandardParallelImpl(a, b);
126 }
127
128 4 int half = n / 2;
129
130 Matrix a11(half);
131 Matrix a12(half);
132 Matrix a21(half);
133 Matrix a22(half);
134 Matrix b11(half);
135 Matrix b12(half);
136 Matrix b21(half);
137 Matrix b22(half);
138
139
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 SplitMatrixImpl(a, a11, a12, a21, a22);
140
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 SplitMatrixImpl(b, b11, b12, b21, b22);
141
142
2/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
4 Matrix p1 = MultiplyStandardParallelImpl(a11, SubtractMatrixImpl(b12, b22));
143
2/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
4 Matrix p2 = MultiplyStandardParallelImpl(AddMatrixImpl(a11, a12), b22);
144
2/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
4 Matrix p3 = MultiplyStandardParallelImpl(AddMatrixImpl(a21, a22), b11);
145
2/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
4 Matrix p4 = MultiplyStandardParallelImpl(a22, SubtractMatrixImpl(b21, b11));
146
4/12
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
8 Matrix p5 = MultiplyStandardParallelImpl(AddMatrixImpl(a11, a22), AddMatrixImpl(b11, b22));
147
4/12
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
8 Matrix p6 = MultiplyStandardParallelImpl(SubtractMatrixImpl(a12, a22), AddMatrixImpl(b21, b22));
148
4/12
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
8 Matrix p7 = MultiplyStandardParallelImpl(SubtractMatrixImpl(a11, a21), AddMatrixImpl(b11, b12));
149
150
3/8
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
4 Matrix c11 = AddMatrixImpl(SubtractMatrixImpl(AddMatrixImpl(p5, p4), p2), p6);
151
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 Matrix c12 = AddMatrixImpl(p1, p2);
152
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 Matrix c21 = AddMatrixImpl(p3, p4);
153
3/8
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
4 Matrix c22 = SubtractMatrixImpl(SubtractMatrixImpl(AddMatrixImpl(p5, p1), p3), p7);
154
155
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 return MergeMatricesImpl(c11, c12, c21, c22);
156 }
157
158 } // namespace
159
160
1/2
✓ Branch 1 taken 44 times.
✗ Branch 2 not taken.
44 MorozovaSStrassenMultiplicationTBB::MorozovaSStrassenMultiplicationTBB(const InType &in) {
161 SetTypeOfTask(GetStaticTypeOfTask());
162
1/2
✓ Branch 1 taken 44 times.
✗ Branch 2 not taken.
44 GetInput() = in;
163 44 GetOutput() = OutType();
164 44 }
165
166 44 bool MorozovaSStrassenMultiplicationTBB::ValidationImpl() {
167 44 return true;
168 }
169
170
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 40 times.
44 bool MorozovaSStrassenMultiplicationTBB::PreProcessingImpl() {
171
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 40 times.
44 if (GetInput().empty()) {
172 4 valid_data_ = false;
173 4 return true;
174 }
175
176 40 double size_val = GetInput()[0];
177
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 36 times.
40 if (size_val <= 0.0) {
178 4 valid_data_ = false;
179 4 return true;
180 }
181
182
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 int n = static_cast<int>(size_val);
183
184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 if (GetInput().size() != 1 + (2 * static_cast<size_t>(n) * static_cast<size_t>(n))) {
185 valid_data_ = false;
186 return true;
187 }
188
189 36 valid_data_ = true;
190 36 n_ = n;
191
192 36 a_ = Matrix(n_);
193 36 b_ = Matrix(n_);
194
195 int idx = 1;
196
2/2
✓ Branch 0 taken 1032 times.
✓ Branch 1 taken 36 times.
1068 for (int i = 0; i < n_; ++i) {
197
2/2
✓ Branch 0 taken 87416 times.
✓ Branch 1 taken 1032 times.
88448 for (int j = 0; j < n_; ++j) {
198 87416 a_(i, j) = GetInput()[idx++];
199 }
200 }
201
202
2/2
✓ Branch 0 taken 1032 times.
✓ Branch 1 taken 36 times.
1068 for (int i = 0; i < n_; ++i) {
203
2/2
✓ Branch 0 taken 87416 times.
✓ Branch 1 taken 1032 times.
88448 for (int j = 0; j < n_; ++j) {
204 87416 b_(i, j) = GetInput()[idx++];
205 }
206 }
207
208 return true;
209 }
210
211 44 bool MorozovaSStrassenMultiplicationTBB::RunImpl() {
212
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 8 times.
44 if (!valid_data_) {
213 return true;
214 }
215
216 const int leaf_size = 64;
217
218
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 4 times.
36 if (n_ <= leaf_size) {
219 64 c_ = MultiplyStandardParallelImpl(a_, b_);
220 } else {
221 8 c_ = MultiplyStrassenIterative(a_, b_, leaf_size);
222 }
223
224 return true;
225 }
226
227
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
44 bool MorozovaSStrassenMultiplicationTBB::PostProcessingImpl() {
228 OutType &output = GetOutput();
229 output.clear();
230
231
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 8 times.
44 if (!valid_data_) {
232 return true;
233 }
234
235 36 output.push_back(static_cast<double>(n_));
236
237
2/2
✓ Branch 0 taken 1032 times.
✓ Branch 1 taken 36 times.
1068 for (int i = 0; i < n_; ++i) {
238
2/2
✓ Branch 0 taken 87416 times.
✓ Branch 1 taken 1032 times.
88448 for (int j = 0; j < n_; ++j) {
239 output.push_back(c_(i, j));
240 }
241 }
242
243 return true;
244 }
245
246 Matrix MorozovaSStrassenMultiplicationTBB::AddMatrix(const Matrix &a, const Matrix &b) {
247 return AddMatrixImpl(a, b);
248 }
249
250 Matrix MorozovaSStrassenMultiplicationTBB::SubtractMatrix(const Matrix &a, const Matrix &b) {
251 return SubtractMatrixImpl(a, b);
252 }
253
254 Matrix MorozovaSStrassenMultiplicationTBB::MultiplyStandard(const Matrix &a, const Matrix &b) {
255 return MultiplyStandardImpl(a, b);
256 }
257
258 void MorozovaSStrassenMultiplicationTBB::SplitMatrix(const Matrix &m, Matrix &m11, Matrix &m12, Matrix &m21,
259 Matrix &m22) {
260 SplitMatrixImpl(m, m11, m12, m21, m22);
261 }
262
263 Matrix MorozovaSStrassenMultiplicationTBB::MergeMatrices(const Matrix &m11, const Matrix &m12, const Matrix &m21,
264 const Matrix &m22) {
265 return MergeMatricesImpl(m11, m12, m21, m22);
266 }
267
268 Matrix MorozovaSStrassenMultiplicationTBB::MultiplyStrassen(const Matrix &a, const Matrix &b, int leaf_size) {
269 return MultiplyStrassenIterative(a, b, leaf_size);
270 }
271
272 Matrix MorozovaSStrassenMultiplicationTBB::MultiplyStandardParallel(const Matrix &a, const Matrix &b) {
273 return MultiplyStandardParallelImpl(a, b);
274 }
275
276 } // namespace morozova_s_strassen_multiplication
277