GCC Code Coverage Report


Directory: ./
File: tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp
Date: 2025-12-13 04:24:21
Exec Total Coverage
Lines: 64 64 100.0%
Functions: 6 6 100.0%
Branches: 55 76 72.4%

Line Branch Exec Source
1 #include "smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp"
2
3 #include <mpi.h>
4
5 #include <algorithm>
6 #include <string>
7 #include <vector>
8
9 #include "smyshlaev_a_str_order_check/common/include/common.hpp"
10
11 namespace smyshlaev_a_str_order_check {
12
13 namespace {
14
15 int CompareBuffers(const char *s1, const char *s2, int len) {
16
4/4
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
28 for (int i = 0; i < len; ++i) {
17
4/4
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
17 if (s1[i] < s2[i]) {
18 return -1;
19 }
20
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
14 if (s1[i] > s2[i]) {
21 return 1;
22 }
23 }
24 return 0;
25 }
26
27 int ResolveResult(int diff_res, int len1, int len2) {
28
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 if (diff_res != 0) {
29 return diff_res;
30 }
31
4/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 1 times.
10 if (len1 < len2) {
32 return -1;
33 }
34
4/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
7 if (len1 > len2) {
35 3 return 1;
36 }
37 return 0;
38 }
39
40 void CalculateDistribution(int total_len, int proc_count, std::vector<int> &counts, std::vector<int> &offsets) {
41 12 const int chunk = total_len / proc_count;
42 12 const int remainder = total_len % proc_count;
43 int offset = 0;
44
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 12 times.
36 for (int i = 0; i < proc_count; i++) {
45
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
36 counts[i] = chunk + (i < remainder ? 1 : 0);
46 24 offsets[i] = offset;
47 24 offset += counts[i];
48 }
49 }
50
51 } // namespace
52
53
1/2
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
22 SmyshlaevAStrOrderCheckMPI::SmyshlaevAStrOrderCheckMPI(const InType &in) {
54 SetTypeOfTask(GetStaticTypeOfTask());
55
56 22 int rank = 0;
57
1/2
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
22 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
58
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 11 times.
22 if (rank == 0) {
59 GetInput() = in;
60 }
61
62 22 GetOutput() = 0;
63 22 }
64
65 22 bool SmyshlaevAStrOrderCheckMPI::ValidationImpl() {
66 22 return true;
67 }
68
69 22 bool SmyshlaevAStrOrderCheckMPI::PreProcessingImpl() {
70 22 return true;
71 }
72
73 10 bool SmyshlaevAStrOrderCheckMPI::RunSequential(int min_len, int len1, int len2) {
74 10 int rank = 0;
75 10 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
76
77 10 int res = 0;
78
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10 if (rank == 0) {
79 const auto &str1 = GetInput().first;
80 const auto &str2 = GetInput().second;
81 int cmp = CompareBuffers(str1.data(), str2.data(), min_len);
82 5 res = ResolveResult(cmp, len1, len2);
83 }
84
85 10 MPI_Bcast(&res, 1, MPI_INT, 0, MPI_COMM_WORLD);
86 10 GetOutput() = res;
87 10 return true;
88 }
89
90 22 bool SmyshlaevAStrOrderCheckMPI::RunImpl() {
91 22 int proc_count = 0;
92 22 int rank = 0;
93 22 MPI_Comm_size(MPI_COMM_WORLD, &proc_count);
94 22 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
95
96 22 int len1 = 0;
97 22 int len2 = 0;
98
99
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 11 times.
22 if (rank == 0) {
100 const auto &input_data = GetInput();
101 11 len1 = static_cast<int>(input_data.first.length());
102 11 len2 = static_cast<int>(input_data.second.length());
103 }
104
105 22 MPI_Bcast(&len1, 1, MPI_INT, 0, MPI_COMM_WORLD);
106 22 MPI_Bcast(&len2, 1, MPI_INT, 0, MPI_COMM_WORLD);
107
108 const int min_len = static_cast<int>(std::min(len1, len2));
109
110
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 12 times.
22 if (proc_count > min_len) {
111 10 return RunSequential(min_len, len1, len2);
112 }
113
114 12 std::vector<int> sendcounts(proc_count);
115
1/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12 std::vector<int> offsets(proc_count);
116 12 CalculateDistribution(min_len, proc_count, sendcounts, offsets);
117
118
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 int local_size = sendcounts[rank];
119
1/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12 std::vector<char> local_str1(local_size);
120
1/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12 std::vector<char> local_str2(local_size);
121
122
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 const char *s1_ptr = (rank == 0) ? GetInput().first.data() : nullptr;
123
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 const char *s2_ptr = (rank == 0) ? GetInput().second.data() : nullptr;
124
125
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 MPI_Scatterv(s1_ptr, sendcounts.data(), offsets.data(), MPI_CHAR, local_str1.data(), local_size, MPI_CHAR, 0,
126 MPI_COMM_WORLD);
127
128
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 MPI_Scatterv(s2_ptr, sendcounts.data(), offsets.data(), MPI_CHAR, local_str2.data(), local_size, MPI_CHAR, 0,
129 MPI_COMM_WORLD);
130
131 12 int local_result = CompareBuffers(local_str1.data(), local_str2.data(), local_size);
132
133
2/6
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
12 std::vector<int> all_results(proc_count);
134
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 MPI_Allgather(&local_result, 1, MPI_INT, all_results.data(), 1, MPI_INT, MPI_COMM_WORLD);
135
136 int global_result = 0;
137
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
24 for (int res : all_results) {
138
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 6 times.
18 if (res != 0) {
139 global_result = res;
140 break;
141 }
142 }
143
144
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
18 GetOutput() = ResolveResult(global_result, len1, len2);
145
146 return true;
147 }
148
149 22 bool SmyshlaevAStrOrderCheckMPI::PostProcessingImpl() {
150 22 return true;
151 }
152
153 } // namespace smyshlaev_a_str_order_check
154