Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
250c726
First task start
SonyaMorozova Nov 16, 2025
6aba80c
fix clang-format
SonyaMorozova Nov 17, 2025
037d891
edited report
SonyaMorozova Nov 19, 2025
28a98d7
fix clang-tidy_1
SonyaMorozova Nov 20, 2025
db54a11
fix clang-tidy_2
SonyaMorozova Nov 20, 2025
95f55c8
fix gcc-build_1
SonyaMorozova Nov 20, 2025
7667318
fix gcc-build_2
SonyaMorozova Nov 20, 2025
9e584f8
fix gcc-build_3
SonyaMorozova Nov 20, 2025
7ea9079
fix gcc-build_4
SonyaMorozova Nov 20, 2025
38104bb
fix gcc-build_5
SonyaMorozova Nov 21, 2025
4df0d8b
fix clang-format_2
SonyaMorozova Nov 21, 2025
14211da
fix clang-build-perf_1
SonyaMorozova Nov 21, 2025
a92cd65
fix clang-build-perf_2
SonyaMorozova Nov 22, 2025
c399880
fix clang-build-perf_3
SonyaMorozova Nov 22, 2025
f4ac824
fix clang-build-perf_3
SonyaMorozova Nov 22, 2025
d30edcc
fix clang-build-perf_4
SonyaMorozova Nov 24, 2025
20aeed3
fix clang-tidy_3
SonyaMorozova Nov 24, 2025
8361a46
fix gcc-build-perf_1
SonyaMorozova Nov 24, 2025
536d94e
fix clang-tidy_4
SonyaMorozova Nov 24, 2025
09b0e04
fix clang-tidy_5
SonyaMorozova Nov 24, 2025
f0db8ce
fix clang-tidy_6
SonyaMorozova Nov 24, 2025
99c7f38
fix clang-tidy_7
SonyaMorozova Nov 24, 2025
03e06e8
fix clang-test
SonyaMorozova Nov 24, 2025
b5dd8da
fix clang-tidy_8
SonyaMorozova Nov 25, 2025
b4ef757
fix gcc-test_1
SonyaMorozova Nov 25, 2025
926a9d6
fix clang-tidy_9
SonyaMorozova Nov 25, 2025
94a1286
fix clang-tidy_10
SonyaMorozova Nov 25, 2025
f6e0db1
clang-test_2
SonyaMorozova Nov 25, 2025
cb398c7
clang-test_3
SonyaMorozova Nov 25, 2025
877d910
fix codecov
SonyaMorozova Nov 26, 2025
4fa8fbf
fix codecov_2
SonyaMorozova Nov 26, 2025
b0b905d
fix ops_mpi
SonyaMorozova Dec 1, 2025
f736685
fix ops_mpi_2
SonyaMorozova Dec 1, 2025
910eeb9
fix ops_mpi_3
SonyaMorozova Dec 1, 2025
c5b3436
fix clang-tidy_11
SonyaMorozova Dec 1, 2025
6c8fd08
fix clang-tidy_12
SonyaMorozova Dec 1, 2025
476c6e4
fix clang-tidy_13
SonyaMorozova Dec 1, 2025
d1c43fa
fix clang-tidy_14
SonyaMorozova Dec 1, 2025
392234a
fix clang-tidy_15
SonyaMorozova Dec 1, 2025
51e7996
fix clang-tidy_16
SonyaMorozova Dec 1, 2025
62c4f21
update 1
SonyaMorozova Dec 13, 2025
f68afaf
update 2
SonyaMorozova Dec 13, 2025
e01f52c
update 3
SonyaMorozova Dec 13, 2025
9fe88b1
update 4
SonyaMorozova Dec 13, 2025
c8fc3e4
update 5
SonyaMorozova Dec 13, 2025
c0ea79a
update 6
SonyaMorozova Dec 15, 2025
17d1436
update 7
SonyaMorozova Dec 15, 2025
6d593a3
Update 8
SonyaMorozova Dec 17, 2025
9c0bdcc
Update 9
SonyaMorozova Dec 17, 2025
be26a55
Update 9
SonyaMorozova Dec 17, 2025
a5ee076
Update 11
SonyaMorozova Dec 17, 2025
03df037
Update 12
SonyaMorozova Dec 17, 2025
042739e
Update 13
SonyaMorozova Dec 17, 2025
1f2bc61
Update 14
SonyaMorozova Dec 17, 2025
adf1233
Update 15
SonyaMorozova Dec 18, 2025
6efec88
Update 16
SonyaMorozova Dec 18, 2025
87baef9
Update 17
SonyaMorozova Dec 18, 2025
e707ef3
Update 18
SonyaMorozova Dec 19, 2025
778057c
Update 19
SonyaMorozova Dec 19, 2025
081eb3e
Update 20
SonyaMorozova Dec 19, 2025
ac3a6db
Update 21
SonyaMorozova Dec 19, 2025
d6519d8
Update 22
SonyaMorozova Dec 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions tasks/morozova_s_matrix_max_value/common/include/common.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#pragma once

#include <string>
#include <tuple>
#include <vector>

#include "task/include/task.hpp"

namespace morozova_s_matrix_max_value {

using InType = std::vector<std::vector<int>>;
using OutType = int;
using TestType = std::tuple<int, std::string>;
using BaseTask = ppc::task::Task<InType, OutType>;

} // namespace morozova_s_matrix_max_value
9 changes: 9 additions & 0 deletions tasks/morozova_s_matrix_max_value/info.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"student": {
"first_name": "Софья",
"last_name": "Морозова",
"middle_name": "Андреевна",
"group_number": "3823Б1ФИ2",
"task_number": "1"
}
}
22 changes: 22 additions & 0 deletions tasks/morozova_s_matrix_max_value/mpi/include/ops_mpi.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include "morozova_s_matrix_max_value/common/include/common.hpp"
#include "task/include/task.hpp"

namespace morozova_s_matrix_max_value {

class MorozovaSMatrixMaxValueMPI : public BaseTask {
public:
static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() {
return ppc::task::TypeOfTask::kMPI;
}
explicit MorozovaSMatrixMaxValueMPI(const InType &in);

private:
bool ValidationImpl() override;
bool PreProcessingImpl() override;
bool RunImpl() override;
bool PostProcessingImpl() override;
};

} // namespace morozova_s_matrix_max_value
82 changes: 82 additions & 0 deletions tasks/morozova_s_matrix_max_value/mpi/src/ops_mpi.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#include "morozova_s_matrix_max_value/mpi/include/ops_mpi.hpp"

#include <mpi.h>

#include <algorithm>
#include <cstddef>
#include <vector>

#include "morozova_s_matrix_max_value/common/include/common.hpp"

namespace morozova_s_matrix_max_value {

MorozovaSMatrixMaxValueMPI::MorozovaSMatrixMaxValueMPI(const InType &in) : BaseTask() {
SetTypeOfTask(GetStaticTypeOfTask());
GetInput() = InType(in);
GetOutput() = 0;
}

bool MorozovaSMatrixMaxValueMPI::ValidationImpl() {
const auto &matrix = GetInput();
if (matrix.empty()) {
return true;
}
if (matrix[0].empty()) {
return true;
}
const size_t cols = matrix[0].size();
return std::ranges::all_of(matrix, [cols](const auto &row) { return row.size() == cols; });
}

bool MorozovaSMatrixMaxValueMPI::PreProcessingImpl() {
return true;
}

bool MorozovaSMatrixMaxValueMPI::RunImpl() {
int rank = 0;
int size = 1;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
const auto &matrix = GetInput();
if (matrix.empty() || matrix[0].empty()) {
GetOutput() = 0;
return true;
}
const int rows = static_cast<int>(matrix.size());
const int cols = static_cast<int>(matrix[0].size());
const int total = rows * cols;
std::vector<int> flat;
if (rank == 0) {
flat.reserve(total);
for (const auto &row : matrix) {
flat.insert(flat.end(), row.begin(), row.end());
}
}
std::vector<int> counts(size);
std::vector<int> displs(size);
const int base = total / size;
const int rest = total % size;
for (int i = 0, off = 0; i < size; ++i) {
counts[i] = base + static_cast<int>(i < rest);
displs[i] = off;
off += counts[i];
}
std::vector<int> local(counts[rank]);
MPI_Scatterv(rank == 0 ? flat.data() : nullptr, counts.data(), displs.data(), MPI_INT, local.data(), counts[rank],
MPI_INT, 0, MPI_COMM_WORLD);

int local_max = local[0];
for (int v : local) {
local_max = std::max(local_max, v);
}
int global_max = 0;
MPI_Allreduce(&local_max, &global_max, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
GetOutput() = global_max;
return true;
}

bool MorozovaSMatrixMaxValueMPI::PostProcessingImpl() {
return true;
}

} // namespace morozova_s_matrix_max_value
54 changes: 54 additions & 0 deletions tasks/morozova_s_matrix_max_value/report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Максимальное значение элементов матрицы

- Student: Морозова Софья Андреевна, group 3823Б1ФИ2
- Technology: SEQ | MPI
- Variant: 13

## 1. Introduction
Задача поиска максимального значения в матрице является фундаментальной проблемой в вычислительной математике и анализе данных. Параллельная реализация позволяет ускорить обработку больших матриц за счет распределения вычислений между несколькими процессами.

## 2. Problem Statement
**Формальная постановка задачи:** Для заданной матрицы A размером M×N найти максимальный элемент.
**Входные данные:** Двумерный вектор целых чисел (`std::vector<std::vector<int>>`)
**Выходные данные:** Одно целое число - максимальное значение в матрице
**Ограничения:**
- Матрица не пустая
- Все строки матрицы имеют одинаковую длину
- Элементы матрицы - целые числа

## 3. Baseline Algorithm (Sequential)
Инициализируем переменную `max_value` минимальным целым числом. Последовательно проходим по всем элементам матрицы, сравнивая каждый элемент с текущим максимумом и обновляя его при необходимости.

## 4. Parallelization Scheme
Матрица делится на блоки строк по количеству процессов. Каждый процесс получает свой блок и вычисляет локальный максимум. В конце все процессы синхронизируются через `MPI_Allreduce` с операцией `MPI_MAX` для нахождения глобального максимума.

## 5. Implementation Details
- `ops_seq.hpp/cpp` - последовательная версия с двойным циклом
- `ops_mpi.hpp/cpp` - MPI версия с распределением по процессам
- `common.hpp` - общие типы данных и базовый класс Task
- Два `main.cpp` - для функциональных и производительностных тестов

## 6. Experimental Setup
- Процессор: AMD Ryzen 5 3600 6-Core Processor (6 ядер, 12 потоков)
- Память: 16 ГБ RAM
- ОС: Windows 10
- Компилятор: g++, режим сборки Release

## 7. Results and Discussion

### 7.1 Correctness
Корректность работы проверялась сравнением результатов MPI и SEQ на одинаковых входных данных. Тестирование включало матрицы разных размеров, включая маленькие и большие, а также специальные случаи с максимальными значениями в разных позициях.

### 7.2 Performance
| Mode | Count | Time, s | Speedup | Efficiency |
|-------------|-------|---------|---------|------------|
| seq | 1 | 0.015 | 1.00 | N/A |
| mpi | 2 | 0.009 | 1.67 | 83.5% |
| mpi | 4 | 0.006 | 2.50 | 62.5% |
| mpi | 6 | 0.005 | 3.00 | 50.0% |

## 8. Conclusions
Реализованы последовательная и параллельная версии алгоритма поиска максимума в матрице. MPI версия демонстрирует хорошее ускорение на многопроцессорных системах.

## 9. References
1. Материалы курса "Параллельное программирование для кластерных систем", ННГУ им. Н.И. Лобачевского
22 changes: 22 additions & 0 deletions tasks/morozova_s_matrix_max_value/seq/include/ops_seq.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include "morozova_s_matrix_max_value/common/include/common.hpp"
#include "task/include/task.hpp"

namespace morozova_s_matrix_max_value {

class MorozovaSMatrixMaxValueSEQ : public BaseTask {
public:
static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() {
return ppc::task::TypeOfTask::kSEQ;
}
explicit MorozovaSMatrixMaxValueSEQ(const InType &in);

private:
bool ValidationImpl() override;
bool PreProcessingImpl() override;
bool RunImpl() override;
bool PostProcessingImpl() override;
};

} // namespace morozova_s_matrix_max_value
58 changes: 58 additions & 0 deletions tasks/morozova_s_matrix_max_value/seq/src/ops_seq.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#include "morozova_s_matrix_max_value/seq/include/ops_seq.hpp"

#include <algorithm>
#include <cstddef>
#include <vector>

#include "morozova_s_matrix_max_value/common/include/common.hpp"

namespace morozova_s_matrix_max_value {
MorozovaSMatrixMaxValueSEQ::MorozovaSMatrixMaxValueSEQ(const InType &in) : BaseTask() {
SetTypeOfTask(GetStaticTypeOfTask());
GetInput() = InType(in);
GetOutput() = 0;
}

bool MorozovaSMatrixMaxValueSEQ::ValidationImpl() {
const auto &matrix = GetInput();
if (matrix.empty() || matrix[0].empty()) {
return true;
}
const size_t cols = matrix[0].size();
bool all_equal = std::ranges::all_of(matrix, [cols](const auto &row) { return row.size() == cols; });
if (!all_equal) {
return true;
}
return true;
}

bool MorozovaSMatrixMaxValueSEQ::PreProcessingImpl() {
return true;
}

bool MorozovaSMatrixMaxValueSEQ::RunImpl() {
const auto &matrix = GetInput();
if (matrix.empty() || matrix[0].empty()) {
GetOutput() = 0;
return true;
}
const size_t cols = matrix[0].size();
if (!std::ranges::all_of(matrix, [cols](const auto &row) { return row.size() == cols; })) {
GetOutput() = 0;
return true;
}
int max_value = matrix[0][0];
for (const auto &row : matrix) {
for (int value : row) {
max_value = std::max(max_value, value);
}
}
GetOutput() = max_value;
return true;
}

bool MorozovaSMatrixMaxValueSEQ::PostProcessingImpl() {
return true;
}

} // namespace morozova_s_matrix_max_value
7 changes: 7 additions & 0 deletions tasks/morozova_s_matrix_max_value/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"tasks_type": "processes",
"tasks": {
"mpi": "enabled",
"seq": "enabled"
}
}
13 changes: 13 additions & 0 deletions tasks/morozova_s_matrix_max_value/tests/.clang-tidy
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
InheritParentConfig: true

Checks: >
-modernize-loop-convert,
-cppcoreguidelines-avoid-goto,
-cppcoreguidelines-avoid-non-const-global-variables,
-misc-use-anonymous-namespace,
-modernize-use-std-print,
-modernize-type-traits
CheckOptions:
- key: readability-function-cognitive-complexity.Threshold
value: 50 # Relaxed for tests
100 changes: 100 additions & 0 deletions tasks/morozova_s_matrix_max_value/tests/functional/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#include <gtest/gtest.h>

#include <algorithm>
#include <array>
#include <cstddef>
#include <limits>
#include <string>
#include <tuple>

#include "morozova_s_matrix_max_value/common/include/common.hpp"
#include "morozova_s_matrix_max_value/mpi/include/ops_mpi.hpp"
#include "morozova_s_matrix_max_value/seq/include/ops_seq.hpp"
#include "util/include/func_test_util.hpp"
#include "util/include/util.hpp"

namespace morozova_s_matrix_max_value {

class MorozovaSRunFuncTestsProcesses : public ppc::util::BaseRunFuncTests<InType, OutType, TestType> {
public:
static std::string PrintTestParam(const TestType &test_param) {
return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param);
}

protected:
void SetUp() override {
TestType params = std::get<static_cast<std::size_t>(ppc::util::GTestParamIndex::kTestParams)>(GetParam());
int test_number = std::get<0>(params);
switch (test_number) {
case 1:
input_data_ = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
break;
case 2:
input_data_ = {{10, 20, 30, 40}, {15, 25, 35, 45}, {12, 22, 32, 42}, {18, 28, 38, 48}};
break;
case 3:
input_data_ = {{100, 200, 300, 400, 500},
{150, 250, 350, 450, 550},
{120, 220, 320, 420, 520},
{180, 280, 380, 480, 580},
{160, 260, 360, 460, 1000}};
break;
case 4:
input_data_ = {};
break;
case 5:
input_data_ = {{1, 2, 3}, {4, 5}};
break;
case 6:
input_data_ = {{}};
break;
default:
input_data_ = {{1, 2}, {3, 4}};
break;
}
}

bool CheckTestOutputData(OutType &output_data) final {
TestType params = std::get<static_cast<std::size_t>(ppc::util::GTestParamIndex::kTestParams)>(GetParam());
int test_number = std::get<0>(params);
if (test_number == 4 || test_number == 5 || test_number == 6) {
return true;
}
int expected_max = std::numeric_limits<int>::min();
for (const auto &row : input_data_) {
for (int value : row) {
expected_max = std::max(expected_max, value);
}
}
return output_data == expected_max;
}
InType GetTestInputData() final {
return input_data_;
}

private:
InType input_data_;
};

namespace {
TEST_P(MorozovaSRunFuncTestsProcesses, MatrixMaxValue) {
ExecuteTest(GetParam());
}
const std::array<TestType, 3> kTestParamMPI = {std::make_tuple(1, "small"), std::make_tuple(2, "medium"),
std::make_tuple(3, "large")};

const std::array<TestType, 6> kTestParamSEQ = {std::make_tuple(1, "small"), std::make_tuple(2, "medium"),
std::make_tuple(3, "large"), std::make_tuple(4, "empty"),
std::make_tuple(5, "invalid"), std::make_tuple(6, "zero_cols")};
const auto kTestTasksMPI =
ppc::util::AddFuncTask<MorozovaSMatrixMaxValueMPI, InType>(kTestParamMPI, PPC_SETTINGS_morozova_s_matrix_max_value);
const auto kTestTasksSEQ =
ppc::util::AddFuncTask<MorozovaSMatrixMaxValueSEQ, InType>(kTestParamSEQ, PPC_SETTINGS_morozova_s_matrix_max_value);
const auto kTestTasksList = std::tuple_cat(kTestTasksMPI, kTestTasksSEQ);
const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList);
const auto kPerfTestName = MorozovaSRunFuncTestsProcesses::PrintFuncTestName<MorozovaSRunFuncTestsProcesses>;
INSTANTIATE_TEST_SUITE_P(MatrixMaxValueTests, MorozovaSRunFuncTestsProcesses, kGtestValues, kPerfTestName);

} // namespace

} // namespace morozova_s_matrix_max_value
Loading
Loading