GCC Code Coverage Report


Directory: ./
File: tasks/safronov_m_bubble_sort_odd_even/mpi/src/ops_mpi.cpp
Date: 2026-01-27 01:59:34
Exec Total Coverage
Lines: 109 111 98.2%
Functions: 13 13 100.0%
Branches: 75 102 73.5%

Line Branch Exec Source
1 #include "safronov_m_bubble_sort_odd_even/mpi/include/ops_mpi.hpp"
2
3 #include <mpi.h>
4
5 #include <algorithm>
6 #include <vector>
7
8 #include "safronov_m_bubble_sort_odd_even/common/include/common.hpp"
9
10 namespace safronov_m_bubble_sort_odd_even {
11
12
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
26 SafronovMBubbleSortOddEvenMPI::SafronovMBubbleSortOddEvenMPI(const InType &in) {
13 SetTypeOfTask(GetStaticTypeOfTask());
14
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
26 GetInput() = in;
15 26 }
16
17 26 bool SafronovMBubbleSortOddEvenMPI::ValidationImpl() {
18 26 return GetOutput().empty();
19 }
20
21
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
26 bool SafronovMBubbleSortOddEvenMPI::PreProcessingImpl() {
22 GetOutput().clear();
23 26 return true;
24 }
25
26 26 void SafronovMBubbleSortOddEvenMPI::SendingVector(int rank) {
27 26 int size_vec = 0;
28
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 13 times.
26 if (rank == 0) {
29 13 size_vec = static_cast<int>(GetInput().size());
30 }
31 26 MPI_Bcast(&size_vec, 1, MPI_INT, 0, MPI_COMM_WORLD);
32
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 13 times.
26 if (rank != 0) {
33 13 GetInput().resize(size_vec);
34 }
35 26 MPI_Bcast(GetInput().data(), size_vec, MPI_INT, 0, MPI_COMM_WORLD);
36 26 }
37
38 26 std::vector<int> SafronovMBubbleSortOddEvenMPI::CalculatingInterval(int size_prcs, int rank, int size_arr) {
39 26 std::vector<int> vec(2);
40 26 int whole_part = size_arr / size_prcs;
41 26 int real_part = size_arr % size_prcs;
42 26 int start = rank * whole_part;
43
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 20 times.
26 if ((rank - 1 < real_part) && (rank - 1 != -1)) {
44 6 start += rank;
45
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 13 times.
20 } else if (rank != 0) {
46 7 start += real_part;
47 }
48 26 int end = start + whole_part - 1;
49
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 20 times.
26 if (rank < real_part) {
50 end += 1;
51 }
52 26 vec[0] = start;
53 26 vec[1] = end;
54 26 return vec;
55 }
56
57 454 void SafronovMBubbleSortOddEvenMPI::OddEvenBubble(std::vector<int> &own_data, int own_size, int begin, int phase) {
58
2/2
✓ Branch 0 taken 450 times.
✓ Branch 1 taken 4 times.
454 if (own_size == 0) {
59 return;
60 }
61 450 int indent = begin % 2 == phase ? 0 : 1;
62
2/2
✓ Branch 0 taken 4384 times.
✓ Branch 1 taken 450 times.
4834 for (int j = 0 + indent; j < own_size - 1; j += 2) {
63
2/2
✓ Branch 0 taken 1456 times.
✓ Branch 1 taken 2928 times.
4384 if (own_data[j] > own_data[j + 1]) {
64 int tmp = own_data[j + 1];
65 1456 own_data[j + 1] = own_data[j];
66 1456 own_data[j] = tmp;
67 }
68 }
69 }
70
71 230 void SafronovMBubbleSortOddEvenMPI::DataExchange(std::vector<int> &own_data, int rank, int neighbor) {
72 MPI_Status status;
73
2/2
✓ Branch 0 taken 115 times.
✓ Branch 1 taken 115 times.
230 int elem_send = neighbor == 1 ? own_data.back() : own_data[0];
74 230 int elem_recv = 0;
75 230 MPI_Sendrecv(&elem_send, 1, MPI_INT, rank + neighbor, 0, &elem_recv, 1, MPI_INT, rank + neighbor, 0, MPI_COMM_WORLD,
76 &status);
77
2/2
✓ Branch 0 taken 115 times.
✓ Branch 1 taken 115 times.
230 if (neighbor == 1) {
78 int min = std::min(elem_send, elem_recv);
79 115 own_data.back() = min;
80 } else {
81 int max = std::max(elem_send, elem_recv);
82 115 own_data[0] = max;
83 }
84 230 }
85
86 234 void SafronovMBubbleSortOddEvenMPI::EvenPhase(std::vector<int> &own_data, std::vector<int> &interval, int size_arr,
87 int rank, int size) {
88 234 int own_size = static_cast<int>(own_data.size());
89 234 OddEvenBubble(own_data, own_size, interval[0], 0);
90
6/8
✓ Branch 0 taken 117 times.
✓ Branch 1 taken 117 times.
✓ Branch 2 taken 117 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 115 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 115 times.
✗ Branch 7 not taken.
234 if ((rank % 2 == 0) && (rank + 1 < size) && (interval[1] != size_arr - 1) && (interval[0] <= interval[1])) {
91 115 DataExchange(own_data, rank, 1);
92
4/4
✓ Branch 0 taken 116 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 115 times.
✓ Branch 3 taken 1 times.
119 } else if ((interval[0] <= interval[1]) && (rank % 2 == 1)) {
93 115 DataExchange(own_data, rank, -1);
94 }
95 234 }
96
97 220 void SafronovMBubbleSortOddEvenMPI::OddPhase(std::vector<int> &own_data, std::vector<int> &interval, int size_arr,
98 int rank, int size) {
99 220 int own_size = static_cast<int>(own_data.size());
100 220 OddEvenBubble(own_data, own_size, interval[0], 1);
101
3/8
✓ Branch 0 taken 110 times.
✓ Branch 1 taken 110 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 110 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
220 if ((rank % 2 == 1) && (rank + 1 < size) && (interval[1] != size_arr - 1) && (interval[0] <= interval[1])) {
102 DataExchange(own_data, rank, 1);
103
5/6
✓ Branch 0 taken 219 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 109 times.
✓ Branch 3 taken 110 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 109 times.
220 } else if ((interval[0] <= interval[1]) && (rank != 0) && (rank % 2 == 0)) {
104 DataExchange(own_data, rank, -1);
105 }
106 220 }
107
108 26 void SafronovMBubbleSortOddEvenMPI::BasisSortingLocalArrays(std::vector<int> &own_data, std::vector<int> &interval,
109 int size_arr, int rank, int size) {
110
2/2
✓ Branch 0 taken 454 times.
✓ Branch 1 taken 26 times.
480 for (int i = 0; i < size_arr + size - 1; i++) {
111
2/2
✓ Branch 0 taken 234 times.
✓ Branch 1 taken 220 times.
454 if (i % 2 == 0) {
112 234 EvenPhase(own_data, interval, size_arr, rank, size);
113 } else {
114 220 OddPhase(own_data, interval, size_arr, rank, size);
115 }
116 }
117 26 }
118
119 26 void SafronovMBubbleSortOddEvenMPI::SendingResult(int rank) {
120 26 int total_size = 0;
121
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 13 times.
26 if (rank == 0) {
122 13 total_size = static_cast<int>(GetOutput().size());
123 }
124
125 26 MPI_Bcast(&total_size, 1, MPI_INT, 0, MPI_COMM_WORLD);
126
127
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 13 times.
26 if (rank != 0) {
128 13 GetOutput().resize(total_size);
129 }
130
131 26 MPI_Bcast(GetOutput().data(), total_size, MPI_INT, 0, MPI_COMM_WORLD);
132 26 }
133
134 26 bool SafronovMBubbleSortOddEvenMPI::RunImpl() {
135 26 int size = 0;
136 26 int rank = 0;
137 26 MPI_Comm_size(MPI_COMM_WORLD, &size);
138 26 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
139
140 26 SendingVector(rank);
141
142
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 13 times.
26 if (rank == 0) {
143 13 int size_arr = static_cast<int>(GetInput().size());
144 13 std::vector<int> sizes_local_arrays(size);
145
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 13 times.
26 for (int i = 1; i < size; i++) {
146
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 std::vector<int> interval = CalculatingInterval(size, i, size_arr);
147 13 sizes_local_arrays[i] = (interval[1] + 1) - interval[0];
148
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 MPI_Send(interval.data(), 2, MPI_INT, i, 0, MPI_COMM_WORLD);
149 }
150
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 std::vector<int> interval = CalculatingInterval(size, 0, size_arr);
151
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
13 std::vector<int> own_data = {};
152
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
13 if (interval[0] <= interval[1]) {
153
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
24 own_data = std::vector<int>(GetInput().begin() + interval[0], GetInput().begin() + interval[1] + 1);
154 }
155
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 BasisSortingLocalArrays(own_data, interval, size_arr, rank, size);
156 13 GetOutput().insert(GetOutput().end(), own_data.begin(), own_data.end());
157 MPI_Status status;
158
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 13 times.
26 for (int i = 1; i < size; i++) {
159
1/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
13 std::vector<int> buf(sizes_local_arrays[i]);
160
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 MPI_Recv(buf.data(), sizes_local_arrays[i], MPI_INT, i, 2, MPI_COMM_WORLD, &status);
161
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 2 times.
13 GetOutput().insert(GetOutput().end(), buf.begin(), buf.end());
162 }
163 } else {
164 MPI_Status status;
165
1/2
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
13 std::vector<int> buf(2);
166
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 MPI_Recv(buf.data(), 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
167 13 std::vector<int> own_data = {};
168
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 2 times.
13 if (buf[0] <= buf[1]) {
169
1/4
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
22 own_data = std::vector<int>(GetInput().begin() + buf[0], GetInput().begin() + buf[1] + 1);
170 }
171 13 int size_arr = static_cast<int>(GetInput().size());
172
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 BasisSortingLocalArrays(own_data, buf, size_arr, rank, size);
173
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 MPI_Send(own_data.data(), static_cast<int>(own_data.size()), MPI_INT, 0, 2, MPI_COMM_WORLD);
174 }
175 26 SendingResult(rank);
176 26 return true;
177 }
178
179 26 bool SafronovMBubbleSortOddEvenMPI::PostProcessingImpl() {
180 26 return true;
181 }
182
183 } // namespace safronov_m_bubble_sort_odd_even
184