GCC Code Coverage Report


Directory: ./
File: tasks/timur_a_cannon/tbb/src/ops_tbb.cpp
Date: 2026-04-02 17:12:27
Exec Total Coverage
Lines: 72 72 100.0%
Functions: 14 14 100.0%
Branches: 58 82 70.7%

Line Branch Exec Source
1 #include "timur_a_cannon/tbb/include/ops_tbb.hpp"
2
3 #include <tbb/tbb.h>
4
5 #include <cstddef>
6 #include <utility>
7 #include <vector>
8
9 #include "timur_a_cannon/common/include/common.hpp"
10
11 namespace timur_a_cannon {
12
13 namespace {
14
15 using Matrix = std::vector<std::vector<double>>;
16 using BlockGrid = std::vector<std::vector<Matrix>>;
17
18 304 void MultiplyBlocks(const Matrix &a, const Matrix &b, Matrix &c, int b_size) {
19
2/2
✓ Branch 0 taken 784 times.
✓ Branch 1 taken 304 times.
1088 for (int row = 0; row < b_size; ++row) {
20
2/2
✓ Branch 0 taken 2224 times.
✓ Branch 1 taken 784 times.
3008 for (int k = 0; k < b_size; ++k) {
21 2224 double temp = a[row][k];
22
2/2
✓ Branch 0 taken 6736 times.
✓ Branch 1 taken 2224 times.
8960 for (int col = 0; col < b_size; ++col) {
23 6736 c[row][col] += temp * b[k][col];
24 }
25 }
26 }
27 304 }
28
29 32 void DistributeBlocks(const Matrix &a, const Matrix &b, BlockGrid &bl_a, BlockGrid &bl_b, int b_size, int grid_sz) {
30 168 tbb::parallel_for(tbb::blocked_range2d<int>(0, grid_sz, 0, grid_sz), [&](const tbb::blocked_range2d<int> &r) {
31
2/2
✓ Branch 0 taken 136 times.
✓ Branch 1 taken 136 times.
272 for (int i = r.rows().begin(); i != r.rows().end(); ++i) {
32
2/2
✓ Branch 0 taken 136 times.
✓ Branch 1 taken 136 times.
272 for (int j = r.cols().begin(); j != r.cols().end(); ++j) {
33 136 int s = (i + j) % grid_sz;
34
2/2
✓ Branch 0 taken 344 times.
✓ Branch 1 taken 136 times.
480 for (int row = 0; row < b_size; ++row) {
35
2/2
✓ Branch 0 taken 968 times.
✓ Branch 1 taken 344 times.
1312 for (int col = 0; col < b_size; ++col) {
36 968 bl_a[i][j][row][col] = a[(i * b_size) + row][(s * b_size) + col];
37 968 bl_b[i][j][row][col] = b[(s * b_size) + row][(j * b_size) + col];
38 }
39 }
40 }
41 }
42 136 });
43 32 }
44
45 32 void RotateAll(BlockGrid &bl_a, BlockGrid &bl_b, int grid_sz) {
46 32 tbb::parallel_for(0, grid_sz, [&](int i) {
47 72 Matrix first = std::move(bl_a[i][0]);
48
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 72 times.
168 for (int j = 0; j < grid_sz - 1; ++j) {
49 96 bl_a[i][j] = std::move(bl_a[i][j + 1]);
50 }
51 72 bl_a[i][grid_sz - 1] = std::move(first);
52 72 });
53 32 tbb::parallel_for(0, grid_sz, [&](int j) {
54 72 Matrix first = std::move(bl_b[0][j]);
55
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 72 times.
168 for (int i = 0; i < grid_sz - 1; ++i) {
56 96 bl_b[i][j] = std::move(bl_b[i + 1][j]);
57 }
58 72 bl_b[grid_sz - 1][j] = std::move(first);
59 72 });
60 32 }
61
62 32 void AssembleResult(const BlockGrid &bl_c, Matrix &res, int b_size, int grid_sz) {
63 168 tbb::parallel_for(tbb::blocked_range2d<int>(0, grid_sz, 0, grid_sz), [&](const tbb::blocked_range2d<int> &r) {
64
2/2
✓ Branch 0 taken 136 times.
✓ Branch 1 taken 136 times.
272 for (int i = r.rows().begin(); i != r.rows().end(); ++i) {
65 272 for (int j = r.cols().begin(); j != r.cols().end(); ++j) {
66
2/2
✓ Branch 0 taken 344 times.
✓ Branch 1 taken 136 times.
480 for (int row = 0; row < b_size; ++row) {
67
2/2
✓ Branch 0 taken 968 times.
✓ Branch 1 taken 344 times.
1312 for (int col = 0; col < b_size; ++col) {
68 968 res[(i * b_size) + row][(j * b_size) + col] = bl_c[i][j][row][col];
69 }
70 }
71 }
72 }
73 136 });
74 32 }
75 } // namespace
76
77
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 TimurACannonMatrixMultiplicationTBB::TimurACannonMatrixMultiplicationTBB(const InType &in) {
78 SetTypeOfTask(GetStaticTypeOfTask());
79 GetInput() = in;
80 32 }
81
82 32 bool TimurACannonMatrixMultiplicationTBB::ValidationImpl() {
83 const auto &input = GetInput();
84 32 int b_size = std::get<0>(input);
85 const auto &mat_a = std::get<1>(input);
86 const auto &mat_b = std::get<2>(input);
87
3/6
✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 32 times.
32 if (b_size <= 0 || mat_a.empty() || mat_b.empty()) {
88 return false;
89 }
90 size_t n = mat_a.size();
91
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 32 times.
32 return mat_a[0].size() == n && mat_b.size() == n && (n % static_cast<size_t>(b_size) == 0);
92 }
93
94 32 bool TimurACannonMatrixMultiplicationTBB::PreProcessingImpl() {
95 32 return true;
96 }
97
98 32 bool TimurACannonMatrixMultiplicationTBB::RunImpl() {
99 const auto &input = GetInput();
100 32 int b_size = std::get<0>(input);
101 const auto &matrix_a = std::get<1>(input);
102 const auto &matrix_b = std::get<2>(input);
103 32 int n = static_cast<int>(matrix_a.size());
104 32 int grid_sz = n / b_size;
105
106
3/6
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
32 BlockGrid bl_a(grid_sz, std::vector<Matrix>(grid_sz, Matrix(b_size, std::vector<double>(b_size))));
107
4/8
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 11 not taken.
32 BlockGrid bl_b(grid_sz, std::vector<Matrix>(grid_sz, Matrix(b_size, std::vector<double>(b_size))));
108
4/8
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 11 not taken.
32 BlockGrid bl_c(grid_sz, std::vector<Matrix>(grid_sz, Matrix(b_size, std::vector<double>(b_size, 0.0))));
109
110
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 DistributeBlocks(matrix_a, matrix_b, bl_a, bl_b, b_size, grid_sz);
111
112
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
96 for (int step = 0; step < grid_sz; ++step) {
113
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
368 tbb::parallel_for(tbb::blocked_range2d<int>(0, grid_sz, 0, grid_sz), [&](const tbb::blocked_range2d<int> &r) {
114
2/2
✓ Branch 0 taken 304 times.
✓ Branch 1 taken 304 times.
608 for (int i = r.rows().begin(); i != r.rows().end(); ++i) {
115
2/2
✓ Branch 0 taken 304 times.
✓ Branch 1 taken 304 times.
608 for (int j = r.cols().begin(); j != r.cols().end(); ++j) {
116 304 MultiplyBlocks(bl_a[i][j], bl_b[i][j], bl_c[i][j], b_size);
117 }
118 }
119 304 });
120
4/4
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 32 times.
✓ Branch 3 taken 28 times.
64 if (grid_sz > 1 && step < grid_sz - 1) {
121
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 RotateAll(bl_a, bl_b, grid_sz);
122 }
123 }
124
125
2/4
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
32 Matrix result(n, std::vector<double>(n));
126
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 AssembleResult(bl_c, result, b_size, grid_sz);
127 32 GetOutput() = std::move(result);
128 32 return true;
129 32 }
130
131 32 bool TimurACannonMatrixMultiplicationTBB::PostProcessingImpl() {
132 32 return true;
133 }
134
135 } // namespace timur_a_cannon
136