GCC Code Coverage Report


Directory: ./
File: tasks/boltenkov_s_gaussian_kernel/stl/src/ops_stl.cpp
Date: 2026-06-04 20:25:32
Exec Total Coverage
Lines: 64 64 100.0%
Functions: 9 9 100.0%
Branches: 46 76 60.5%

Line Branch Exec Source
1 #include "boltenkov_s_gaussian_kernel/stl/include/ops_stl.hpp"
2
3 #include <algorithm>
4 #include <cstddef>
5 #include <thread>
6 #include <vector>
7
8 #include "boltenkov_s_gaussian_kernel/common/include/common.hpp"
9 #include "util/include/util.hpp"
10
11 namespace boltenkov_s_gaussian_kernel {
12
13
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 BoltenkovSGaussianKernelSTL::BoltenkovSGaussianKernelSTL(const InType &in)
14
5/12
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 48 times.
✓ Branch 4 taken 16 times.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 16 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
64 : kernel_{{{1, 2, 1}, {2, 4, 2}, {1, 2, 1}}} {
15 SetTypeOfTask(GetStaticTypeOfTask());
16 GetInput() = in;
17 16 GetOutput() = std::vector<std::vector<int>>();
18
3/10
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
32 }
19
20 16 bool BoltenkovSGaussianKernelSTL::ValidationImpl() {
21 16 std::size_t n = std::get<0>(GetInput());
22
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 std::size_t m = std::get<1>(GetInput());
23
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 if (std::get<2>(GetInput()).size() != n) {
24 return false;
25 }
26
2/2
✓ Branch 0 taken 440 times.
✓ Branch 1 taken 16 times.
456 for (std::size_t i = 0; i < n; i++) {
27
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 440 times.
440 if (std::get<2>(GetInput())[i].size() != m) {
28 return false;
29 }
30 }
31 return true;
32 }
33
34 16 bool BoltenkovSGaussianKernelSTL::PreProcessingImpl() {
35 16 GetOutput().resize(std::get<0>(GetInput()));
36
2/2
✓ Branch 0 taken 440 times.
✓ Branch 1 taken 16 times.
456 for (std::size_t i = 0; i < std::get<0>(GetInput()); i++) {
37 440 GetOutput()[i].resize(std::get<1>(GetInput()));
38 }
39 16 return true;
40 }
41
42 16 void BoltenkovSGaussianKernelSTL::CopyRowsToPaddedBuffer(const std::vector<std::vector<int>> &data,
43 std::vector<std::vector<int>> &tmp_data, std::size_t n,
44 unsigned int num_threads) {
45 16 std::vector<std::thread> threads;
46 16 std::size_t rows_per_thread = n / num_threads;
47 16 std::size_t remainder = n % num_threads;
48 std::size_t start = 1;
49
50
2/2
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 16 times.
56 for (unsigned int tid = 0; tid < num_threads; ++tid) {
51
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 16 times.
40 std::size_t count = rows_per_thread + (tid < remainder ? 1 : 0);
52 40 std::size_t end = start + count;
53
1/2
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
40 threads.emplace_back([&data, &tmp_data, start, end] {
54
2/2
✓ Branch 0 taken 440 times.
✓ Branch 1 taken 40 times.
480 for (std::size_t i = start; i < end; ++i) {
55 440 std::copy(data[i - 1].begin(), data[i - 1].end(), tmp_data[i].begin() + 1);
56 }
57 40 });
58 start = end;
59 }
60
2/2
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 16 times.
56 for (auto &th : threads) {
61
1/2
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
40 th.join();
62 }
63 16 }
64
65 16 void BoltenkovSGaussianKernelSTL::ApplyGaussianKernel(const std::vector<std::vector<int>> &tmp_data,
66 std::vector<std::vector<int>> &res, std::size_t n, std::size_t m,
67 unsigned int num_threads) {
68 16 auto kernel = kernel_;
69 16 int shift = shift_;
70 16 std::vector<std::thread> threads;
71 16 std::size_t rows_per_thread = n / num_threads;
72 16 std::size_t remainder = n % num_threads;
73 std::size_t start = 1;
74
2/2
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 16 times.
56 for (unsigned int tid = 0; tid < num_threads; ++tid) {
75
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 16 times.
40 std::size_t count = rows_per_thread + (tid < remainder ? 1 : 0);
76 40 std::size_t end = start + count;
77
3/6
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 40 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 40 times.
✗ Branch 8 not taken.
80 threads.emplace_back([&tmp_data, &res, kernel, shift, start, end, m] {
78
2/2
✓ Branch 0 taken 440 times.
✓ Branch 1 taken 40 times.
480 for (std::size_t i = start; i < end; ++i) {
79
2/2
✓ Branch 0 taken 28280 times.
✓ Branch 1 taken 440 times.
28720 for (std::size_t j = 1; j <= m; ++j) {
80 28280 int sum = (tmp_data[i - 1][j - 1] * kernel[0][0]) + (tmp_data[i - 1][j] * kernel[0][1]) +
81 28280 (tmp_data[i - 1][j + 1] * kernel[0][2]) + (tmp_data[i][j - 1] * kernel[1][0]) +
82 28280 (tmp_data[i][j] * kernel[1][1]) + (tmp_data[i][j + 1] * kernel[1][2]) +
83 28280 (tmp_data[i + 1][j - 1] * kernel[2][0]) + (tmp_data[i + 1][j] * kernel[2][1]) +
84 28280 (tmp_data[i + 1][j + 1] * kernel[2][2]);
85 28280 res[i - 1][j - 1] = sum >> shift;
86 }
87 }
88 40 });
89 start = end;
90 }
91
2/2
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 16 times.
56 for (auto &th : threads) {
92
1/2
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
40 th.join();
93 }
94 16 }
95
96 16 bool BoltenkovSGaussianKernelSTL::RunImpl() {
97 16 std::size_t n = std::get<0>(GetInput());
98 16 std::size_t m = std::get<1>(GetInput());
99 16 std::vector<std::vector<int>> data = std::get<2>(GetInput());
100
3/6
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
32 std::vector<std::vector<int>> tmp_data(n + 2, std::vector<int>(m + 2, 0));
101 std::vector<std::vector<int>> &res = GetOutput();
102
103
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 auto num_threads = static_cast<unsigned int>(ppc::util::GetNumThreads());
104 16 if (num_threads == 0) {
105 num_threads = 1;
106 }
107
108
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 CopyRowsToPaddedBuffer(data, tmp_data, n, num_threads);
109
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 ApplyGaussianKernel(tmp_data, res, n, m, num_threads);
110
111 16 return true;
112 16 }
113
114 16 bool BoltenkovSGaussianKernelSTL::PostProcessingImpl() {
115 16 return true;
116 }
117
118 } // namespace boltenkov_s_gaussian_kernel
119