GCC Code Coverage Report


Directory: ./
File: tasks/chetverikova_e_sum_matrix_elem/mpi/src/ops_mpi.cpp
Date: 2026-01-09 01:27:18
Exec Total Coverage
Lines: 0 33 0.0%
Functions: 0 5 0.0%
Branches: 0 30 0.0%

Line Branch Exec Source
1 #include "chetverikova_e_sum_matrix_elem/mpi/include/ops_mpi.hpp"
2
3 #include <mpi.h>
4
5 #include <cstddef>
6 #include <vector>
7
8 #include "chetverikova_e_sum_matrix_elem/common/include/common.hpp"
9
10 namespace chetverikova_e_sum_matrix_elem {
11
12 ChetverikovaESumMatrixElemMPI::ChetverikovaESumMatrixElemMPI(const InType &in) {
13 SetTypeOfTask(GetStaticTypeOfTask());
14 GetInput() = in;
15 GetOutput() = 0.0;
16 }
17
18 bool ChetverikovaESumMatrixElemMPI::ValidationImpl() {
19 return (std::get<0>(GetInput()) > 0) && (std::get<1>(GetInput()) > 0) &&
20 (static_cast<size_t>(std::get<0>(GetInput())) * static_cast<size_t>(std::get<1>(GetInput())) ==
21 std::get<2>(GetInput()).size()) &&
22 !(std::get<2>(GetInput()).empty()) && (GetOutput() == 0.0);
23 }
24
25 bool ChetverikovaESumMatrixElemMPI::PreProcessingImpl() {
26 GetOutput() = 0.0;
27 return (GetOutput() == 0.0);
28 }
29
30 bool ChetverikovaESumMatrixElemMPI::RunImpl() {
31 int rank_proc = 0;
32 int size_proc = 0;
33 MPI_Comm_size(MPI_COMM_WORLD, &size_proc);
34 MPI_Comm_rank(MPI_COMM_WORLD, &rank_proc);
35
36 const auto &rows = std::get<0>(GetInput());
37 const auto &columns = std::get<1>(GetInput());
38 OutType &res = GetOutput();
39 const auto &matrix = std::get<2>(GetInput());
40
41 size_t size = static_cast<size_t>(rows) * static_cast<size_t>(columns);
42 size_t elem_on_proc = size / size_proc;
43
44 std::vector<double> local_data(elem_on_proc, 0);
45
46 MPI_Scatter(matrix.data(), static_cast<int>(elem_on_proc), MPI_DOUBLE, local_data.data(),
47 static_cast<int>(elem_on_proc), MPI_DOUBLE, 0, MPI_COMM_WORLD);
48 OutType res_proc{};
49 for (size_t i = 0; i < elem_on_proc; ++i) {
50 res_proc += local_data[i];
51 }
52 MPI_Reduce(&res_proc, &res, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
53
54 if ((rank_proc == 0) && (size % size_proc != 0)) {
55 size_t tail_ind = size - (size % size_proc);
56 for (size_t i = tail_ind; i < size; ++i) {
57 res += matrix[i];
58 }
59 }
60 MPI_Bcast(&res, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
61 MPI_Barrier(MPI_COMM_WORLD);
62 return true;
63 }
64
65 bool ChetverikovaESumMatrixElemMPI::PostProcessingImpl() {
66 return true;
67 }
68
69 } // namespace chetverikova_e_sum_matrix_elem
70