From 5ad06c33ce1c0923d2b361da66671793c7c84414 Mon Sep 17 00:00:00 2001 From: K Date: Tue, 4 Nov 2025 16:48:29 +0300 Subject: [PATCH 01/57] [OTHER] .gitignore update --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5de0996c8b..52716c9406 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ CMakeSettings.json .cache install *.pyc +ppc-2025-processes-informatics.code-workspace From 3352029c176b74d0fe9d7ff28f93af7ff16684b9 Mon Sep 17 00:00:00 2001 From: K Date: Tue, 4 Nov 2025 17:08:05 +0300 Subject: [PATCH 02/57] [INITIAL] Renamed namespaces and includes --- .../common/include/common.hpp | 15 +++ tasks/kutuzov_i_elem_vec_average/data/pic.jpg | Bin 0 -> 23 bytes tasks/kutuzov_i_elem_vec_average/info.json | 9 ++ .../mpi/include/ops_mpi.hpp | 22 +++++ .../mpi/src/ops_mpi.cpp | 72 +++++++++++++++ tasks/kutuzov_i_elem_vec_average/report.md | 0 .../seq/include/ops_seq.hpp | 22 +++++ .../seq/src/ops_seq.cpp | 60 ++++++++++++ .../kutuzov_i_elem_vec_average/settings.json | 7 ++ .../tests/.clang-tidy | 13 +++ .../tests/functional/main.cpp | 86 ++++++++++++++++++ .../tests/performance/main.cpp | 40 ++++++++ 12 files changed, 346 insertions(+) create mode 100644 tasks/kutuzov_i_elem_vec_average/common/include/common.hpp create mode 100644 tasks/kutuzov_i_elem_vec_average/data/pic.jpg create mode 100644 tasks/kutuzov_i_elem_vec_average/info.json create mode 100644 tasks/kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp create mode 100644 tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp create mode 100644 tasks/kutuzov_i_elem_vec_average/report.md create mode 100644 tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp create mode 100644 tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp create mode 100644 tasks/kutuzov_i_elem_vec_average/settings.json create mode 100644 tasks/kutuzov_i_elem_vec_average/tests/.clang-tidy create mode 100644 tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp create mode 100644 tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp diff --git a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp new file mode 100644 index 0000000000..88910b661d --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include "task/include/task.hpp" + +namespace kutuzov_i_elem_vec_average { + +using InType = int; +using OutType = int; +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/data/pic.jpg b/tasks/kutuzov_i_elem_vec_average/data/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..637624238c89d914613ed301968bffbf462bc110 GIT binary patch literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY + +#include +#include + +#include "kutuzov_i_elem_vec_average/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace kutuzov_i_elem_vec_average { + +NesterovATestTaskMPI::NesterovATestTaskMPI(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskMPI::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskMPI::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskMPI::RunImpl() { + auto input = GetInput(); + if (input == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == 0) { + GetOutput() /= num_threads; + } else { + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + } + + MPI_Barrier(MPI_COMM_WORLD); + return GetOutput() > 0; +} + +bool NesterovATestTaskMPI::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/report.md b/tasks/kutuzov_i_elem_vec_average/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp b/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp new file mode 100644 index 0000000000..b20122d19f --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "kutuzov_i_elem_vec_average/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace kutuzov_i_elem_vec_average { + +class NesterovATestTaskSEQ : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSEQ; + } + explicit NesterovATestTaskSEQ(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp new file mode 100644 index 0000000000..01ec05afe2 --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp @@ -0,0 +1,60 @@ +#include "kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp" + +#include +#include + +#include "kutuzov_i_elem_vec_average/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace kutuzov_i_elem_vec_average { + +NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskSEQ::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskSEQ::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::RunImpl() { + if (GetInput() == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/settings.json b/tasks/kutuzov_i_elem_vec_average/settings.json new file mode 100644 index 0000000000..b1a0d52574 --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/settings.json @@ -0,0 +1,7 @@ +{ + "tasks_type": "processes", + "tasks": { + "mpi": "enabled", + "seq": "enabled" + } +} diff --git a/tasks/kutuzov_i_elem_vec_average/tests/.clang-tidy b/tasks/kutuzov_i_elem_vec_average/tests/.clang-tidy new file mode 100644 index 0000000000..ef43b7aa8a --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/tests/.clang-tidy @@ -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 diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp new file mode 100644 index 0000000000..0f0f48efba --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -0,0 +1,86 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kutuzov_i_elem_vec_average/common/include/common.hpp" +#include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" +#include "kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace kutuzov_i_elem_vec_average { + +class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests { + 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 { + int width = -1; + int height = -1; + int channels = -1; + std::vector img; + // Read image in RGB to ensure consistent channel count + { + std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_example_processes, "pic.jpg"); + auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); + if (data == nullptr) { + throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); + } + channels = STBI_rgb; + img = std::vector(data, data + (static_cast(width * height * channels))); + stbi_image_free(data); + if (std::cmp_not_equal(width, height)) { + throw std::runtime_error("width != height: "); + } + } + + TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); + } + + bool CheckTestOutputData(OutType &output_data) final { + return (input_data_ == output_data); + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_ = 0; +}; + +namespace { + +TEST_P(NesterovARunFuncTestsProcesses, MatmulFromPic) { + ExecuteTest(GetParam()); +} + +const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; + +const auto kTestTasksList = + std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes)); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kPerfTestName = NesterovARunFuncTestsProcesses::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp new file mode 100644 index 0000000000..daa993f4f9 --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -0,0 +1,40 @@ +#include + +#include "kutuzov_i_elem_vec_average/common/include/common.hpp" +#include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" +#include "kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp" +#include "util/include/perf_test_util.hpp" + +namespace kutuzov_i_elem_vec_average { + +class ExampleRunPerfTestProcesses : public ppc::util::BaseRunPerfTests { + const int kCount_ = 100; + InType input_data_{}; + + void SetUp() override { + input_data_ = kCount_; + } + + bool CheckTestOutputData(OutType &output_data) final { + return input_data_ == output_data; + } + + InType GetTestInputData() final { + return input_data_; + } +}; + +TEST_P(ExampleRunPerfTestProcesses, RunPerfModes) { + ExecuteTest(GetParam()); +} + +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_processes); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = ExampleRunPerfTestProcesses::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses, kGtestValues, kPerfTestName); + +} // namespace kutuzov_i_elem_vec_average From d7337569b2fa03ce0e35307dbc89f4b0c2d9f92b Mon Sep 17 00:00:00 2001 From: K Date: Tue, 4 Nov 2025 17:30:31 +0300 Subject: [PATCH 03/57] [INITIAL] Finished renaming and filled out info --- tasks/kutuzov_i_elem_vec_average/info.json | 8 ++++---- .../kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp | 4 ++-- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 10 +++++----- tasks/kutuzov_i_elem_vec_average/report.md | 2 ++ .../kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp | 4 ++-- tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp | 10 +++++----- .../tests/functional/main.cpp | 6 +++--- .../tests/performance/main.cpp | 2 +- 8 files changed, 24 insertions(+), 22 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/info.json b/tasks/kutuzov_i_elem_vec_average/info.json index de9442bb99..9269a9082d 100644 --- a/tasks/kutuzov_i_elem_vec_average/info.json +++ b/tasks/kutuzov_i_elem_vec_average/info.json @@ -1,9 +1,9 @@ { "student": { - "first_name": "first_name_p", - "last_name": "last_name_p", - "middle_name": "middle_name_p", - "group_number": "2222222_p", + "first_name": "Иван", + "last_name": "Кутузов", + "middle_name": "Арсеньевич", + "group_number": "3823Б1ФИ3", "task_number": "1" } } diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp b/tasks/kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp index 191a23198e..ed15ef9033 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp @@ -5,12 +5,12 @@ namespace kutuzov_i_elem_vec_average { -class NesterovATestTaskMPI : public BaseTask { +class KutuzovIElemVecAverageMPI : public BaseTask { public: static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { return ppc::task::TypeOfTask::kMPI; } - explicit NesterovATestTaskMPI(const InType &in); + explicit KutuzovIElemVecAverageMPI(const InType &in); private: bool ValidationImpl() override; diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index b0c37ae0b9..8eec2733d7 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -10,22 +10,22 @@ namespace kutuzov_i_elem_vec_average { -NesterovATestTaskMPI::NesterovATestTaskMPI(const InType &in) { +KutuzovIElemVecAverageMPI::KutuzovIElemVecAverageMPI(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; GetOutput() = 0; } -bool NesterovATestTaskMPI::ValidationImpl() { +bool KutuzovIElemVecAverageMPI::ValidationImpl() { return (GetInput() > 0) && (GetOutput() == 0); } -bool NesterovATestTaskMPI::PreProcessingImpl() { +bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { GetOutput() = 2 * GetInput(); return GetOutput() > 0; } -bool NesterovATestTaskMPI::RunImpl() { +bool KutuzovIElemVecAverageMPI::RunImpl() { auto input = GetInput(); if (input == 0) { return false; @@ -64,7 +64,7 @@ bool NesterovATestTaskMPI::RunImpl() { return GetOutput() > 0; } -bool NesterovATestTaskMPI::PostProcessingImpl() { +bool KutuzovIElemVecAverageMPI::PostProcessingImpl() { GetOutput() -= GetInput(); return GetOutput() > 0; } diff --git a/tasks/kutuzov_i_elem_vec_average/report.md b/tasks/kutuzov_i_elem_vec_average/report.md index e69de29bb2..93cd6bdc1d 100644 --- a/tasks/kutuzov_i_elem_vec_average/report.md +++ b/tasks/kutuzov_i_elem_vec_average/report.md @@ -0,0 +1,2 @@ +# Отчет + diff --git a/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp b/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp index b20122d19f..1945776f5b 100644 --- a/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp +++ b/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp @@ -5,12 +5,12 @@ namespace kutuzov_i_elem_vec_average { -class NesterovATestTaskSEQ : public BaseTask { +class KutuzovIElemVecAverageSEQ : public BaseTask { public: static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { return ppc::task::TypeOfTask::kSEQ; } - explicit NesterovATestTaskSEQ(const InType &in); + explicit KutuzovIElemVecAverageSEQ(const InType &in); private: bool ValidationImpl() override; diff --git a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp index 01ec05afe2..e4bfdf02f6 100644 --- a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp +++ b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp @@ -8,22 +8,22 @@ namespace kutuzov_i_elem_vec_average { -NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { +KutuzovIElemVecAverageSEQ::KutuzovIElemVecAverageSEQ(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; GetOutput() = 0; } -bool NesterovATestTaskSEQ::ValidationImpl() { +bool KutuzovIElemVecAverageSEQ::ValidationImpl() { return (GetInput() > 0) && (GetOutput() == 0); } -bool NesterovATestTaskSEQ::PreProcessingImpl() { +bool KutuzovIElemVecAverageSEQ::PreProcessingImpl() { GetOutput() = 2 * GetInput(); return GetOutput() > 0; } -bool NesterovATestTaskSEQ::RunImpl() { +bool KutuzovIElemVecAverageSEQ::RunImpl() { if (GetInput() == 0) { return false; } @@ -52,7 +52,7 @@ bool NesterovATestTaskSEQ::RunImpl() { return GetOutput() > 0; } -bool NesterovATestTaskSEQ::PostProcessingImpl() { +bool KutuzovIElemVecAverageSEQ::PostProcessingImpl() { GetOutput() -= GetInput(); return GetOutput() > 0; } diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 0f0f48efba..bddec376c7 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -34,7 +34,7 @@ class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests img; // Read image in RGB to ensure consistent channel count { - std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_example_processes, "pic.jpg"); + std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_kutuzov_i_elem_vec_average, "pic.jpg"); auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); if (data == nullptr) { throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); @@ -72,8 +72,8 @@ TEST_P(NesterovARunFuncTestsProcesses, MatmulFromPic) { const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes)); + std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index daa993f4f9..c27bc819f6 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -29,7 +29,7 @@ TEST_P(ExampleRunPerfTestProcesses, RunPerfModes) { } const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_processes); + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_kutuzov_i_elem_vec_average); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); From 15b87e2b2888a2e275588fcacdfdafe7d3a10d28 Mon Sep 17 00:00:00 2001 From: K Date: Tue, 4 Nov 2025 18:00:07 +0300 Subject: [PATCH 04/57] [INITIAL] tests fix --- .../kutuzov_i_elem_vec_average/tests/functional/main.cpp | 8 ++++---- .../kutuzov_i_elem_vec_average/tests/performance/main.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index bddec376c7..836f978b84 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -20,7 +20,7 @@ namespace kutuzov_i_elem_vec_average { -class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests { +class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests { public: static std::string PrintTestParam(const TestType &test_param) { return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); @@ -65,7 +65,7 @@ class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests; +const auto kPerfTestName = KutuzovIElemVecAverageFuncTests::PrintFuncTestName; -INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses, kGtestValues, kPerfTestName); +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, KutuzovIElemVecAverageFuncTests, kGtestValues, kPerfTestName); } // namespace diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index c27bc819f6..d13260efd5 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -7,7 +7,7 @@ namespace kutuzov_i_elem_vec_average { -class ExampleRunPerfTestProcesses : public ppc::util::BaseRunPerfTests { +class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests { const int kCount_ = 100; InType input_data_{}; @@ -24,7 +24,7 @@ class ExampleRunPerfTestProcesses : public ppc::util::BaseRunPerfTests Date: Mon, 17 Nov 2025 17:50:11 +0300 Subject: [PATCH 05/57] [DEV] First task seq, mpi & tests first iteratation --- .../common/include/common.hpp | 7 ++- .../mpi/src/ops_mpi.cpp | 56 +++++++------------ .../seq/src/ops_seq.cpp | 43 ++++---------- .../tests/functional/main.cpp | 42 ++++++-------- .../tests/performance/main.cpp | 16 +++++- 5 files changed, 66 insertions(+), 98 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp index 88910b661d..6a5203aa58 100644 --- a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp +++ b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp @@ -2,14 +2,15 @@ #include #include +#include #include "task/include/task.hpp" namespace kutuzov_i_elem_vec_average { -using InType = int; -using OutType = int; -using TestType = std::tuple; +using InType = std::vector; +using OutType = double; +using TestType = size_t; using BaseTask = ppc::task::Task; } // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 8eec2733d7..a1117a838b 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -13,60 +13,46 @@ namespace kutuzov_i_elem_vec_average { KutuzovIElemVecAverageMPI::KutuzovIElemVecAverageMPI(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; - GetOutput() = 0; + GetOutput() = 0.0; } bool KutuzovIElemVecAverageMPI::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); + return GetInput().size() > 0; } bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; + return true; } bool KutuzovIElemVecAverageMPI::RunImpl() { - auto input = GetInput(); - if (input == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); - if (rank == 0) { - GetOutput() /= num_threads; - } else { - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } + double global_sum = 0.0; + + size_t num_threads = ppc::util::GetNumThreads(); + size_t batch_size = GetInput().size() / num_threads; - if (counter != 0) { - GetOutput() /= counter; - } - } + std::vector recv_buffer(batch_size); + + MPI_Scatter(GetInput().data(), GetInput().size(), MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); + + double sum = 0.0; + for (size_t i = 0; i < batch_size; i++) + sum += recv_buffer[i]; + + MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + + if (rank == 0) + GetOutput() = global_sum / GetInput().size(); MPI_Barrier(MPI_COMM_WORLD); - return GetOutput() > 0; + return true; } bool KutuzovIElemVecAverageMPI::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; + return true; } } // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp index e4bfdf02f6..56f3c9c106 100644 --- a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp +++ b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp @@ -11,50 +11,29 @@ namespace kutuzov_i_elem_vec_average { KutuzovIElemVecAverageSEQ::KutuzovIElemVecAverageSEQ(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; - GetOutput() = 0; + GetOutput() = 0.0; } bool KutuzovIElemVecAverageSEQ::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); + return GetInput().size() > 0; } bool KutuzovIElemVecAverageSEQ::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; + return true; } bool KutuzovIElemVecAverageSEQ::RunImpl() { - if (GetInput() == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } - - if (counter != 0) { - GetOutput() /= counter; - } - return GetOutput() > 0; + GetOutput() = 0.0; + for (size_t i = 0; i < GetInput().size(); i++) + GetOutput() += GetInput()[i]; + + GetOutput() /= GetInput().size(); + + return true; } bool KutuzovIElemVecAverageSEQ::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; + return true; } } // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 836f978b84..87a7a295ea 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -23,36 +23,28 @@ namespace kutuzov_i_elem_vec_average { class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests { public: static std::string PrintTestParam(const TestType &test_param) { - return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); + return std::to_string(test_param); } protected: void SetUp() override { - int width = -1; - int height = -1; - int channels = -1; - std::vector img; - // Read image in RGB to ensure consistent channel count - { - std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_kutuzov_i_elem_vec_average, "pic.jpg"); - auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); - if (data == nullptr) { - throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); - } - channels = STBI_rgb; - img = std::vector(data, data + (static_cast(width * height * channels))); - stbi_image_free(data); - if (std::cmp_not_equal(width, height)) { - throw std::runtime_error("width != height: "); - } - } - - TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); + + TestType param = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + input_data_ = std::vector(param); + + for (size_t i = 0; i < param; i++) + input_data_[i] = i * i - (double)param / 2; } bool CheckTestOutputData(OutType &output_data) final { - return (input_data_ == output_data); + + double average = 0.0; + for (size_t i = 0; i < input_data_.size(); i++) + average += input_data_[i]; + + average /= input_data_.size(); + + return abs(output_data - average) < 0.0001; } InType GetTestInputData() final { @@ -60,7 +52,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; +const std::array kTestParam = {1, 10, 1000, 10000}; const auto kTestTasksList = std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average), diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index d13260efd5..610899afbb 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -8,15 +8,25 @@ namespace kutuzov_i_elem_vec_average { class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests { - const int kCount_ = 100; + const int kCount_ = 10000; InType input_data_{}; void SetUp() override { - input_data_ = kCount_; + + input_data_ = std::vector(kCount_); + + for (int i = 0; i < kCount_; i++) + input_data_[i] = i * i - (double)kCount_ / 2; } bool CheckTestOutputData(OutType &output_data) final { - return input_data_ == output_data; + double average = 0.0; + for (size_t i = 0; i < input_data_.size(); i++) + average += input_data_[i]; + + average /= input_data_.size(); + + return abs(output_data - average) < 0.0001; } InType GetTestInputData() final { From b70026513cf059d0049628748835e194e7cb878a Mon Sep 17 00:00:00 2001 From: K Date: Mon, 17 Nov 2025 20:24:54 +0300 Subject: [PATCH 06/57] [DEV] Task1 Fixed mpi version --- .../mpi/src/ops_mpi.cpp | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index a1117a838b..9512b803e0 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -26,17 +26,21 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { bool KutuzovIElemVecAverageMPI::RunImpl() { + const auto& input = GetInput(); + int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); double global_sum = 0.0; - size_t num_threads = ppc::util::GetNumThreads(); - size_t batch_size = GetInput().size() / num_threads; + int num_processes; + MPI_Comm_size(MPI_COMM_WORLD, &num_processes); + + size_t batch_size = input.size() / num_processes; std::vector recv_buffer(batch_size); - MPI_Scatter(GetInput().data(), GetInput().size(), MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); + MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; for (size_t i = 0; i < batch_size; i++) @@ -44,8 +48,14 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); - if (rank == 0) - GetOutput() = global_sum / GetInput().size(); + if (rank == 0) { + for (size_t i = num_processes * batch_size; i < input.size(); i++) + global_sum += input[i]; + + GetOutput() = global_sum / input.size(); + } + + MPI_Bcast(&GetOutput(), 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); return true; From a36101b9bebadf99bc4d961ed455ade802b69f41 Mon Sep 17 00:00:00 2001 From: K Date: Mon, 17 Nov 2025 20:32:51 +0300 Subject: [PATCH 07/57] [FORMAT] Formatting fixes --- .../kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 11 ++++++----- .../kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp | 3 ++- .../tests/functional/main.cpp | 14 +++++++------- .../tests/performance/main.cpp | 11 ++++++----- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 9512b803e0..7f05d8d59d 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -25,14 +25,13 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { } bool KutuzovIElemVecAverageMPI::RunImpl() { - - const auto& input = GetInput(); + const auto &input = GetInput(); int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); double global_sum = 0.0; - + int num_processes; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); @@ -43,14 +42,16 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; - for (size_t i = 0; i < batch_size; i++) + for (size_t i = 0; i < batch_size; i++) { sum += recv_buffer[i]; + } MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (rank == 0) { - for (size_t i = num_processes * batch_size; i < input.size(); i++) + for (size_t i = num_processes * batch_size; i < input.size(); i++) { global_sum += input[i]; + } GetOutput() = global_sum / input.size(); } diff --git a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp index 56f3c9c106..c89ddfe8a4 100644 --- a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp +++ b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp @@ -24,8 +24,9 @@ bool KutuzovIElemVecAverageSEQ::PreProcessingImpl() { bool KutuzovIElemVecAverageSEQ::RunImpl() { GetOutput() = 0.0; - for (size_t i = 0; i < GetInput().size(); i++) + for (size_t i = 0; i < GetInput().size(); i++) { GetOutput() += GetInput()[i]; + } GetOutput() /= GetInput().size(); diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 87a7a295ea..dc6863570b 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -28,19 +28,19 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); input_data_ = std::vector(param); - for (size_t i = 0; i < param; i++) + for (size_t i = 0; i < param; i++) { input_data_[i] = i * i - (double)param / 2; + } } bool CheckTestOutputData(OutType &output_data) final { - double average = 0.0; - for (size_t i = 0; i < input_data_.size(); i++) + for (size_t i = 0; i < input_data_.size(); i++) { average += input_data_[i]; + } average /= input_data_.size(); @@ -63,9 +63,9 @@ TEST_P(KutuzovIElemVecAverageFuncTests, MatmulFromPic) { const std::array kTestParam = {1, 10, 1000, 10000}; -const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average)); +const auto kTestTasksList = std::tuple_cat( + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index 610899afbb..c1e00a32e7 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -12,17 +12,18 @@ class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests(kCount_); - for (int i = 0; i < kCount_; i++) + for (int i = 0; i < kCount_; i++) { input_data_[i] = i * i - (double)kCount_ / 2; + } } bool CheckTestOutputData(OutType &output_data) final { double average = 0.0; - for (size_t i = 0; i < input_data_.size(); i++) + for (size_t i = 0; i < input_data_.size(); i++) { average += input_data_[i]; + } average /= input_data_.size(); @@ -38,8 +39,8 @@ TEST_P(KutuzovIElemVecAveragePerfTests, RunPerfModes) { ExecuteTest(GetParam()); } -const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_kutuzov_i_elem_vec_average); +const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks( + PPC_SETTINGS_kutuzov_i_elem_vec_average); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); From 7b7d39c28466773baf7a93362cfcca4622cd1d45 Mon Sep 17 00:00:00 2001 From: K Date: Mon, 17 Nov 2025 21:07:13 +0300 Subject: [PATCH 08/57] [DEV] Task1 mpi version fixes --- .../mpi/src/ops_mpi.cpp | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 7f05d8d59d..c0e923bd3a 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -27,6 +27,8 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { bool KutuzovIElemVecAverageMPI::RunImpl() { const auto &input = GetInput(); + double result; + int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); @@ -35,28 +37,31 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { int num_processes; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); - size_t batch_size = input.size() / num_processes; + int batch_size = input.size() / num_processes; std::vector recv_buffer(batch_size); - MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); - - double sum = 0.0; - for (size_t i = 0; i < batch_size; i++) { - sum += recv_buffer[i]; - } + if (batch_size != 0) { + MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); - MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + double sum = 0.0; + for (int i = 0; i < batch_size; i++) { + sum += recv_buffer[i]; + } + MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + } + if (rank == 0) { - for (size_t i = num_processes * batch_size; i < input.size(); i++) { + for (int i = num_processes * batch_size; i < input.size(); i++) { global_sum += input[i]; } - GetOutput() = global_sum / input.size(); + result = global_sum / input.size(); } - MPI_Bcast(&GetOutput(), 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); + MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); + GetOutput() = result; MPI_Barrier(MPI_COMM_WORLD); return true; From f0043eb8656e48e8f51ad0c3802235f31bb70578 Mon Sep 17 00:00:00 2001 From: K Date: Mon, 17 Nov 2025 21:07:43 +0300 Subject: [PATCH 09/57] [FORMAT] formatting fixes --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index c0e923bd3a..fb85b2e4e0 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -51,7 +51,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); } - + if (rank == 0) { for (int i = num_processes * batch_size; i < input.size(); i++) { global_sum += input[i]; From 8ef5be2a6a4fad1b3abc02b9440b476aedee5b37 Mon Sep 17 00:00:00 2001 From: K Date: Mon, 17 Nov 2025 21:32:54 +0300 Subject: [PATCH 10/57] [DEV] Task1 comparison type fix --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index fb85b2e4e0..623fa8fca1 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -53,7 +53,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { } if (rank == 0) { - for (int i = num_processes * batch_size; i < input.size(); i++) { + for (int i = num_processes * batch_size; i < (int)(input.size()); i++) { global_sum += input[i]; } From da7bd355efcd9e5090a1701a5aec06eac936d69e Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 00:20:03 +0300 Subject: [PATCH 11/57] [DEV] CLang-Tidy fixes --- .../common/include/common.hpp | 1 + .../mpi/src/ops_mpi.cpp | 18 +++++++++--------- .../tests/functional/main.cpp | 5 +++-- .../tests/performance/main.cpp | 6 +++++- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp index 6a5203aa58..0968f555e2 100644 --- a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp +++ b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "task/include/task.hpp" diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 623fa8fca1..6310bf78fa 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -2,8 +2,9 @@ #include -#include +#include #include +#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "util/include/util.hpp" @@ -17,7 +18,7 @@ KutuzovIElemVecAverageMPI::KutuzovIElemVecAverageMPI(const InType &in) { } bool KutuzovIElemVecAverageMPI::ValidationImpl() { - return GetInput().size() > 0; + return !GetInput().empty(); } bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { @@ -27,17 +28,16 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { bool KutuzovIElemVecAverageMPI::RunImpl() { const auto &input = GetInput(); - double result; + double result = 0.0; + double global_sum = 0.0; int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); - double global_sum = 0.0; - - int num_processes; + int num_processes = 0; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); - int batch_size = input.size() / num_processes; + int batch_size = static_cast(input.size() / num_processes); std::vector recv_buffer(batch_size); @@ -53,11 +53,11 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { } if (rank == 0) { - for (int i = num_processes * batch_size; i < (int)(input.size()); i++) { + for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { global_sum += input[i]; } - result = global_sum / input.size(); + result = global_sum / static_cast(input.size()); } MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index dc6863570b..d9333fcaa6 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" @@ -32,7 +33,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(param); for (size_t i = 0; i < param; i++) { - input_data_[i] = i * i - (double)param / 2; + input_data_[i] = i * i - static_cast(param) / 2; } } @@ -52,7 +53,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests +#include +#include +#include + #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" #include "kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp" @@ -15,7 +19,7 @@ class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests(kCount_); for (int i = 0; i < kCount_; i++) { - input_data_[i] = i * i - (double)kCount_ / 2; + input_data_[i] = i * i - static_cast(kCount_) / 2; } } From d54783a64f14c2b316f530d472b9d6cda86b184e Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 00:21:11 +0300 Subject: [PATCH 12/57] [FORMAT] formatting --- tasks/kutuzov_i_elem_vec_average/common/include/common.hpp | 2 +- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp | 2 +- tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp index 0968f555e2..0420e2af4a 100644 --- a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp +++ b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp @@ -1,9 +1,9 @@ #pragma once +#include #include #include #include -#include #include "task/include/task.hpp" diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 6310bf78fa..097df57c5f 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -2,9 +2,9 @@ #include +#include #include #include -#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "util/include/util.hpp" diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index d9333fcaa6..8f18030ae1 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -11,7 +12,6 @@ #include #include #include -#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index 856e4db44f..50227903af 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -1,8 +1,8 @@ #include +#include #include #include -#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" From 1d79b877f7ee1300e24da90fef7833cd5caef253 Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 20:19:24 +0300 Subject: [PATCH 13/57] [DEV] Broadcasting batch_size attempted fix --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 097df57c5f..4810991285 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -38,11 +38,12 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Comm_size(MPI_COMM_WORLD, &num_processes); int batch_size = static_cast(input.size() / num_processes); + MPI_Bcast(&batch_size, 1, MPI_INT, 0, MPI_COMM_WORLD); - std::vector recv_buffer(batch_size); + double* recv_buffer = new double[batch_size]; - if (batch_size != 0) { - MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); + if (batch_size > 0) { + MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; for (int i = 0; i < batch_size; i++) { @@ -52,6 +53,8 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); } + delete[] recv_buffer; + if (rank == 0) { for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { global_sum += input[i]; From 33ebff5b3dcadf92fd96a4e5825a938d6db54f56 Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 20:20:02 +0300 Subject: [PATCH 14/57] [FORMAT] Fix attempt 1 --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 4810991285..5523cb34c0 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -40,7 +40,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { int batch_size = static_cast(input.size() / num_processes); MPI_Bcast(&batch_size, 1, MPI_INT, 0, MPI_COMM_WORLD); - double* recv_buffer = new double[batch_size]; + double *recv_buffer = new double[batch_size]; if (batch_size > 0) { MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); From 8e076f6ae83b9e23d48080f901f7aeb3a9301a8e Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 20:42:52 +0300 Subject: [PATCH 15/57] [DEV] More slight fixes --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 5523cb34c0..afc343e10b 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -37,12 +37,11 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { int num_processes = 0; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); - int batch_size = static_cast(input.size() / num_processes); + int batch_size = static_cast(input.size()) / num_processes; MPI_Bcast(&batch_size, 1, MPI_INT, 0, MPI_COMM_WORLD); - double *recv_buffer = new double[batch_size]; - if (batch_size > 0) { + double *recv_buffer = new double[batch_size]; MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; @@ -51,10 +50,9 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { } MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + delete[] recv_buffer; } - delete[] recv_buffer; - if (rank == 0) { for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { global_sum += input[i]; From 7e4a8dc525fe5a8f7555b01aadd3d648c71874fd Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 21:14:16 +0300 Subject: [PATCH 16/57] [DEV] More fixes --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 6 ++++-- .../kutuzov_i_elem_vec_average/tests/functional/main.cpp | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index afc343e10b..886ff4f1e3 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -54,8 +54,10 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { } if (rank == 0) { - for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { - global_sum += input[i]; + if (num_processes * batch_size < static_cast(input.size())) { + for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { + global_sum += input[i]; + } } result = global_sum / static_cast(input.size()); diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 8f18030ae1..0ab6c61dbf 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" @@ -44,8 +45,12 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests Date: Tue, 18 Nov 2025 21:14:50 +0300 Subject: [PATCH 17/57] [FORMAT] Fix attempt 3 --- tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 0ab6c61dbf..9a1533a686 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -6,13 +6,13 @@ #include #include #include +#include #include #include #include #include #include #include -#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" @@ -49,7 +49,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests Date: Tue, 18 Nov 2025 21:51:03 +0300 Subject: [PATCH 18/57] [DEV] More explicit conversions --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 1 + .../kutuzov_i_elem_vec_average/tests/functional/main.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 886ff4f1e3..3aaea99b58 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -27,6 +27,7 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { bool KutuzovIElemVecAverageMPI::RunImpl() { const auto &input = GetInput(); + GetOutput() = 0.0; double result = 0.0; double global_sum = 0.0; diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 9a1533a686..dfcfd7e8f0 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -33,18 +33,18 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); input_data_ = std::vector(param); - for (size_t i = 0; i < param; i++) { - input_data_[i] = i * i - static_cast(param) / 2; + for (int i = 0; i < static_cast(param); i++) { + input_data_[i] = i * i - static_cast(param) / 2.0; } } bool CheckTestOutputData(OutType &output_data) final { double average = 0.0; - for (size_t i = 0; i < input_data_.size(); i++) { + for (int i = 0; i < static_cast(input_data_.size()); i++) { average += input_data_[i]; } - average /= input_data_.size(); + average /= static_cast(input_data_.size()); bool result = abs(output_data - average) < 0.0001; if (!result) { std::cout << output_data << " " << average; From 202dc6f954e22bd6100f1dc0f50357587282f599 Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 21:52:54 +0300 Subject: [PATCH 19/57] [FORMAT] Fix attempt 4 --- tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index dfcfd7e8f0..b40137376b 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -44,7 +44,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(input_data_.size()); + average /= static_cast(input_data_.size()); bool result = abs(output_data - average) < 0.0001; if (!result) { std::cout << output_data << " " << average; From 0d47034f7b00d171c472d6b1cd732b76d210bc38 Mon Sep 17 00:00:00 2001 From: K Date: Wed, 19 Nov 2025 20:32:47 +0300 Subject: [PATCH 20/57] [DEV] removed scatter & tweaked func tests --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 10 +++------- .../tests/functional/main.cpp | 4 ++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 3aaea99b58..f87e736627 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -38,20 +38,16 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { int num_processes = 0; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); - int batch_size = static_cast(input.size()) / num_processes; - MPI_Bcast(&batch_size, 1, MPI_INT, 0, MPI_COMM_WORLD); + int batch_size = 0; + batch_size = static_cast(input.size()) / num_processes; if (batch_size > 0) { - double *recv_buffer = new double[batch_size]; - MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); - double sum = 0.0; for (int i = 0; i < batch_size; i++) { - sum += recv_buffer[i]; + sum += input[rank * batch_size + i]; } MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); - delete[] recv_buffer; } if (rank == 0) { diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index b40137376b..cce1f2771e 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -31,10 +31,10 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - input_data_ = std::vector(param); + input_data_ = std::vector(param, 0.0); for (int i = 0; i < static_cast(param); i++) { - input_data_[i] = i * i - static_cast(param) / 2.0; + input_data_[i] = static_cast(i * i) - static_cast(param) / 2.0; } } From ec3aa5c0cb2bf071eb966a8b0536f173ba9c2cc1 Mon Sep 17 00:00:00 2001 From: K Date: Wed, 19 Nov 2025 20:55:06 +0300 Subject: [PATCH 21/57] [TEST] Set all to 1 --- tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index cce1f2771e..db25d8be82 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -34,7 +34,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(param, 0.0); for (int i = 0; i < static_cast(param); i++) { - input_data_[i] = static_cast(i * i) - static_cast(param) / 2.0; + input_data_[i] = 1.0; } } From 93d09fa9e1469bbf475534577223aed7c1fa4289 Mon Sep 17 00:00:00 2001 From: K Date: Wed, 19 Nov 2025 21:18:43 +0300 Subject: [PATCH 22/57] [TEST] Changed answer calculation --- .../tests/functional/main.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index db25d8be82..848f01dc4a 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -33,21 +33,20 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); input_data_ = std::vector(param, 0.0); + answer = 0.0; for (int i = 0; i < static_cast(param); i++) { - input_data_[i] = 1.0; + double value = static_cast(i * i) - static_cast(param) / 2.0; + input_data_[i] = value; + answer += value; } + + answer /= static_cast(param); } bool CheckTestOutputData(OutType &output_data) final { - double average = 0.0; - for (int i = 0; i < static_cast(input_data_.size()); i++) { - average += input_data_[i]; - } - - average /= static_cast(input_data_.size()); - bool result = abs(output_data - average) < 0.0001; + bool result = abs(output_data - answer) < 0.0001; if (!result) { - std::cout << output_data << " " << average; + std::cout << output_data << " " << answer; } return result; @@ -59,6 +58,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests Date: Wed, 19 Nov 2025 22:39:00 +0300 Subject: [PATCH 23/57] [DEV] Debuging --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 7 +++++-- tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index f87e736627..1296880d8e 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" @@ -46,7 +47,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { for (int i = 0; i < batch_size; i++) { sum += input[rank * batch_size + i]; } - + std::cout << input.size() << " : " << rank << " " << sum << std::endl; MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); } @@ -56,13 +57,15 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { global_sum += input[i]; } } - + std::cout << input.size() << " : " << "Global Sum: " << global_sum << std::endl; result = global_sum / static_cast(input.size()); } MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); GetOutput() = result; + std::cout << input.size() << " : " << "Answer: " << rank << " " << GetOutput() << std::endl; + MPI_Barrier(MPI_COMM_WORLD); return true; } diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 848f01dc4a..ad83596fd0 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -34,13 +34,14 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(param, 0.0); answer = 0.0; - for (int i = 0; i < static_cast(param); i++) { + int num = static_cast(param); + for (int i = 0; i < num; i++) { double value = static_cast(i * i) - static_cast(param) / 2.0; input_data_[i] = value; answer += value; } - answer /= static_cast(param); + std::cout << num << " : Expected answer: " << answer << std::endl; } bool CheckTestOutputData(OutType &output_data) final { From 5827a367e44dd865f6426c7a0b6a23ac03ee7065 Mon Sep 17 00:00:00 2001 From: K Date: Wed, 19 Nov 2025 22:39:32 +0300 Subject: [PATCH 24/57] [FORMAT] Debuging --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 1296880d8e..0af83d9385 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -64,7 +64,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); GetOutput() = result; - std::cout << input.size() << " : " << "Answer: " << rank << " " << GetOutput() << std::endl; + std::cout << input.size() << " : " << "Answer: " << rank << " " << GetOutput() << std::endl; MPI_Barrier(MPI_COMM_WORLD); return true; From c1502699cc845a38a9792e8fd825e7be65110845 Mon Sep 17 00:00:00 2001 From: K Date: Tue, 4 Nov 2025 16:48:29 +0300 Subject: [PATCH 25/57] [OTHER] .gitignore update --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5de0996c8b..52716c9406 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ CMakeSettings.json .cache install *.pyc +ppc-2025-processes-informatics.code-workspace From 220638d73f4e2d0b0380ce051fa0e94fd92ad76b Mon Sep 17 00:00:00 2001 From: K Date: Tue, 4 Nov 2025 17:08:05 +0300 Subject: [PATCH 26/57] [INITIAL] Renamed namespaces and includes --- .../common/include/common.hpp | 15 +++ tasks/kutuzov_i_elem_vec_average/data/pic.jpg | Bin 0 -> 23 bytes tasks/kutuzov_i_elem_vec_average/info.json | 9 ++ .../mpi/include/ops_mpi.hpp | 22 +++++ .../mpi/src/ops_mpi.cpp | 72 +++++++++++++++ tasks/kutuzov_i_elem_vec_average/report.md | 0 .../seq/include/ops_seq.hpp | 22 +++++ .../seq/src/ops_seq.cpp | 60 ++++++++++++ .../kutuzov_i_elem_vec_average/settings.json | 7 ++ .../tests/.clang-tidy | 13 +++ .../tests/functional/main.cpp | 86 ++++++++++++++++++ .../tests/performance/main.cpp | 40 ++++++++ 12 files changed, 346 insertions(+) create mode 100644 tasks/kutuzov_i_elem_vec_average/common/include/common.hpp create mode 100644 tasks/kutuzov_i_elem_vec_average/data/pic.jpg create mode 100644 tasks/kutuzov_i_elem_vec_average/info.json create mode 100644 tasks/kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp create mode 100644 tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp create mode 100644 tasks/kutuzov_i_elem_vec_average/report.md create mode 100644 tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp create mode 100644 tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp create mode 100644 tasks/kutuzov_i_elem_vec_average/settings.json create mode 100644 tasks/kutuzov_i_elem_vec_average/tests/.clang-tidy create mode 100644 tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp create mode 100644 tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp diff --git a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp new file mode 100644 index 0000000000..88910b661d --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include "task/include/task.hpp" + +namespace kutuzov_i_elem_vec_average { + +using InType = int; +using OutType = int; +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/data/pic.jpg b/tasks/kutuzov_i_elem_vec_average/data/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..637624238c89d914613ed301968bffbf462bc110 GIT binary patch literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY + +#include +#include + +#include "kutuzov_i_elem_vec_average/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace kutuzov_i_elem_vec_average { + +NesterovATestTaskMPI::NesterovATestTaskMPI(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskMPI::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskMPI::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskMPI::RunImpl() { + auto input = GetInput(); + if (input == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == 0) { + GetOutput() /= num_threads; + } else { + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + } + + MPI_Barrier(MPI_COMM_WORLD); + return GetOutput() > 0; +} + +bool NesterovATestTaskMPI::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/report.md b/tasks/kutuzov_i_elem_vec_average/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp b/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp new file mode 100644 index 0000000000..b20122d19f --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "kutuzov_i_elem_vec_average/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace kutuzov_i_elem_vec_average { + +class NesterovATestTaskSEQ : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSEQ; + } + explicit NesterovATestTaskSEQ(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp new file mode 100644 index 0000000000..01ec05afe2 --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp @@ -0,0 +1,60 @@ +#include "kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp" + +#include +#include + +#include "kutuzov_i_elem_vec_average/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace kutuzov_i_elem_vec_average { + +NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskSEQ::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskSEQ::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::RunImpl() { + if (GetInput() == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/settings.json b/tasks/kutuzov_i_elem_vec_average/settings.json new file mode 100644 index 0000000000..b1a0d52574 --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/settings.json @@ -0,0 +1,7 @@ +{ + "tasks_type": "processes", + "tasks": { + "mpi": "enabled", + "seq": "enabled" + } +} diff --git a/tasks/kutuzov_i_elem_vec_average/tests/.clang-tidy b/tasks/kutuzov_i_elem_vec_average/tests/.clang-tidy new file mode 100644 index 0000000000..ef43b7aa8a --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/tests/.clang-tidy @@ -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 diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp new file mode 100644 index 0000000000..0f0f48efba --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -0,0 +1,86 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kutuzov_i_elem_vec_average/common/include/common.hpp" +#include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" +#include "kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace kutuzov_i_elem_vec_average { + +class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests { + 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 { + int width = -1; + int height = -1; + int channels = -1; + std::vector img; + // Read image in RGB to ensure consistent channel count + { + std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_example_processes, "pic.jpg"); + auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); + if (data == nullptr) { + throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); + } + channels = STBI_rgb; + img = std::vector(data, data + (static_cast(width * height * channels))); + stbi_image_free(data); + if (std::cmp_not_equal(width, height)) { + throw std::runtime_error("width != height: "); + } + } + + TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); + } + + bool CheckTestOutputData(OutType &output_data) final { + return (input_data_ == output_data); + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_ = 0; +}; + +namespace { + +TEST_P(NesterovARunFuncTestsProcesses, MatmulFromPic) { + ExecuteTest(GetParam()); +} + +const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; + +const auto kTestTasksList = + std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes)); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kPerfTestName = NesterovARunFuncTestsProcesses::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp new file mode 100644 index 0000000000..daa993f4f9 --- /dev/null +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -0,0 +1,40 @@ +#include + +#include "kutuzov_i_elem_vec_average/common/include/common.hpp" +#include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" +#include "kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp" +#include "util/include/perf_test_util.hpp" + +namespace kutuzov_i_elem_vec_average { + +class ExampleRunPerfTestProcesses : public ppc::util::BaseRunPerfTests { + const int kCount_ = 100; + InType input_data_{}; + + void SetUp() override { + input_data_ = kCount_; + } + + bool CheckTestOutputData(OutType &output_data) final { + return input_data_ == output_data; + } + + InType GetTestInputData() final { + return input_data_; + } +}; + +TEST_P(ExampleRunPerfTestProcesses, RunPerfModes) { + ExecuteTest(GetParam()); +} + +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_processes); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = ExampleRunPerfTestProcesses::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses, kGtestValues, kPerfTestName); + +} // namespace kutuzov_i_elem_vec_average From b313cef2d6a2721c46d7ee213bdf3f59c4838b8c Mon Sep 17 00:00:00 2001 From: K Date: Tue, 4 Nov 2025 17:30:31 +0300 Subject: [PATCH 27/57] [INITIAL] Finished renaming and filled out info --- tasks/kutuzov_i_elem_vec_average/info.json | 8 ++++---- .../kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp | 4 ++-- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 10 +++++----- tasks/kutuzov_i_elem_vec_average/report.md | 2 ++ .../kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp | 4 ++-- tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp | 10 +++++----- .../tests/functional/main.cpp | 6 +++--- .../tests/performance/main.cpp | 2 +- 8 files changed, 24 insertions(+), 22 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/info.json b/tasks/kutuzov_i_elem_vec_average/info.json index de9442bb99..9269a9082d 100644 --- a/tasks/kutuzov_i_elem_vec_average/info.json +++ b/tasks/kutuzov_i_elem_vec_average/info.json @@ -1,9 +1,9 @@ { "student": { - "first_name": "first_name_p", - "last_name": "last_name_p", - "middle_name": "middle_name_p", - "group_number": "2222222_p", + "first_name": "Иван", + "last_name": "Кутузов", + "middle_name": "Арсеньевич", + "group_number": "3823Б1ФИ3", "task_number": "1" } } diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp b/tasks/kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp index 191a23198e..ed15ef9033 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp @@ -5,12 +5,12 @@ namespace kutuzov_i_elem_vec_average { -class NesterovATestTaskMPI : public BaseTask { +class KutuzovIElemVecAverageMPI : public BaseTask { public: static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { return ppc::task::TypeOfTask::kMPI; } - explicit NesterovATestTaskMPI(const InType &in); + explicit KutuzovIElemVecAverageMPI(const InType &in); private: bool ValidationImpl() override; diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index b0c37ae0b9..8eec2733d7 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -10,22 +10,22 @@ namespace kutuzov_i_elem_vec_average { -NesterovATestTaskMPI::NesterovATestTaskMPI(const InType &in) { +KutuzovIElemVecAverageMPI::KutuzovIElemVecAverageMPI(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; GetOutput() = 0; } -bool NesterovATestTaskMPI::ValidationImpl() { +bool KutuzovIElemVecAverageMPI::ValidationImpl() { return (GetInput() > 0) && (GetOutput() == 0); } -bool NesterovATestTaskMPI::PreProcessingImpl() { +bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { GetOutput() = 2 * GetInput(); return GetOutput() > 0; } -bool NesterovATestTaskMPI::RunImpl() { +bool KutuzovIElemVecAverageMPI::RunImpl() { auto input = GetInput(); if (input == 0) { return false; @@ -64,7 +64,7 @@ bool NesterovATestTaskMPI::RunImpl() { return GetOutput() > 0; } -bool NesterovATestTaskMPI::PostProcessingImpl() { +bool KutuzovIElemVecAverageMPI::PostProcessingImpl() { GetOutput() -= GetInput(); return GetOutput() > 0; } diff --git a/tasks/kutuzov_i_elem_vec_average/report.md b/tasks/kutuzov_i_elem_vec_average/report.md index e69de29bb2..93cd6bdc1d 100644 --- a/tasks/kutuzov_i_elem_vec_average/report.md +++ b/tasks/kutuzov_i_elem_vec_average/report.md @@ -0,0 +1,2 @@ +# Отчет + diff --git a/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp b/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp index b20122d19f..1945776f5b 100644 --- a/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp +++ b/tasks/kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp @@ -5,12 +5,12 @@ namespace kutuzov_i_elem_vec_average { -class NesterovATestTaskSEQ : public BaseTask { +class KutuzovIElemVecAverageSEQ : public BaseTask { public: static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { return ppc::task::TypeOfTask::kSEQ; } - explicit NesterovATestTaskSEQ(const InType &in); + explicit KutuzovIElemVecAverageSEQ(const InType &in); private: bool ValidationImpl() override; diff --git a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp index 01ec05afe2..e4bfdf02f6 100644 --- a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp +++ b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp @@ -8,22 +8,22 @@ namespace kutuzov_i_elem_vec_average { -NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { +KutuzovIElemVecAverageSEQ::KutuzovIElemVecAverageSEQ(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; GetOutput() = 0; } -bool NesterovATestTaskSEQ::ValidationImpl() { +bool KutuzovIElemVecAverageSEQ::ValidationImpl() { return (GetInput() > 0) && (GetOutput() == 0); } -bool NesterovATestTaskSEQ::PreProcessingImpl() { +bool KutuzovIElemVecAverageSEQ::PreProcessingImpl() { GetOutput() = 2 * GetInput(); return GetOutput() > 0; } -bool NesterovATestTaskSEQ::RunImpl() { +bool KutuzovIElemVecAverageSEQ::RunImpl() { if (GetInput() == 0) { return false; } @@ -52,7 +52,7 @@ bool NesterovATestTaskSEQ::RunImpl() { return GetOutput() > 0; } -bool NesterovATestTaskSEQ::PostProcessingImpl() { +bool KutuzovIElemVecAverageSEQ::PostProcessingImpl() { GetOutput() -= GetInput(); return GetOutput() > 0; } diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 0f0f48efba..bddec376c7 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -34,7 +34,7 @@ class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests img; // Read image in RGB to ensure consistent channel count { - std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_example_processes, "pic.jpg"); + std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_kutuzov_i_elem_vec_average, "pic.jpg"); auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); if (data == nullptr) { throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); @@ -72,8 +72,8 @@ TEST_P(NesterovARunFuncTestsProcesses, MatmulFromPic) { const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes)); + std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index daa993f4f9..c27bc819f6 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -29,7 +29,7 @@ TEST_P(ExampleRunPerfTestProcesses, RunPerfModes) { } const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_processes); + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_kutuzov_i_elem_vec_average); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); From 0eb4ab89fa0d95e28cfae20dc843acc2a2fb6458 Mon Sep 17 00:00:00 2001 From: K Date: Tue, 4 Nov 2025 18:00:07 +0300 Subject: [PATCH 28/57] [INITIAL] tests fix --- .../kutuzov_i_elem_vec_average/tests/functional/main.cpp | 8 ++++---- .../kutuzov_i_elem_vec_average/tests/performance/main.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index bddec376c7..836f978b84 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -20,7 +20,7 @@ namespace kutuzov_i_elem_vec_average { -class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests { +class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests { public: static std::string PrintTestParam(const TestType &test_param) { return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); @@ -65,7 +65,7 @@ class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests; +const auto kPerfTestName = KutuzovIElemVecAverageFuncTests::PrintFuncTestName; -INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses, kGtestValues, kPerfTestName); +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, KutuzovIElemVecAverageFuncTests, kGtestValues, kPerfTestName); } // namespace diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index c27bc819f6..d13260efd5 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -7,7 +7,7 @@ namespace kutuzov_i_elem_vec_average { -class ExampleRunPerfTestProcesses : public ppc::util::BaseRunPerfTests { +class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests { const int kCount_ = 100; InType input_data_{}; @@ -24,7 +24,7 @@ class ExampleRunPerfTestProcesses : public ppc::util::BaseRunPerfTests Date: Mon, 17 Nov 2025 17:50:11 +0300 Subject: [PATCH 29/57] [DEV] First task seq, mpi & tests first iteratation --- .../common/include/common.hpp | 7 ++- .../mpi/src/ops_mpi.cpp | 56 +++++++------------ .../seq/src/ops_seq.cpp | 43 ++++---------- .../tests/functional/main.cpp | 42 ++++++-------- .../tests/performance/main.cpp | 16 +++++- 5 files changed, 66 insertions(+), 98 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp index 88910b661d..6a5203aa58 100644 --- a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp +++ b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp @@ -2,14 +2,15 @@ #include #include +#include #include "task/include/task.hpp" namespace kutuzov_i_elem_vec_average { -using InType = int; -using OutType = int; -using TestType = std::tuple; +using InType = std::vector; +using OutType = double; +using TestType = size_t; using BaseTask = ppc::task::Task; } // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 8eec2733d7..a1117a838b 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -13,60 +13,46 @@ namespace kutuzov_i_elem_vec_average { KutuzovIElemVecAverageMPI::KutuzovIElemVecAverageMPI(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; - GetOutput() = 0; + GetOutput() = 0.0; } bool KutuzovIElemVecAverageMPI::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); + return GetInput().size() > 0; } bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; + return true; } bool KutuzovIElemVecAverageMPI::RunImpl() { - auto input = GetInput(); - if (input == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); - if (rank == 0) { - GetOutput() /= num_threads; - } else { - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } + double global_sum = 0.0; + + size_t num_threads = ppc::util::GetNumThreads(); + size_t batch_size = GetInput().size() / num_threads; - if (counter != 0) { - GetOutput() /= counter; - } - } + std::vector recv_buffer(batch_size); + + MPI_Scatter(GetInput().data(), GetInput().size(), MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); + + double sum = 0.0; + for (size_t i = 0; i < batch_size; i++) + sum += recv_buffer[i]; + + MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + + if (rank == 0) + GetOutput() = global_sum / GetInput().size(); MPI_Barrier(MPI_COMM_WORLD); - return GetOutput() > 0; + return true; } bool KutuzovIElemVecAverageMPI::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; + return true; } } // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp index e4bfdf02f6..56f3c9c106 100644 --- a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp +++ b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp @@ -11,50 +11,29 @@ namespace kutuzov_i_elem_vec_average { KutuzovIElemVecAverageSEQ::KutuzovIElemVecAverageSEQ(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; - GetOutput() = 0; + GetOutput() = 0.0; } bool KutuzovIElemVecAverageSEQ::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); + return GetInput().size() > 0; } bool KutuzovIElemVecAverageSEQ::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; + return true; } bool KutuzovIElemVecAverageSEQ::RunImpl() { - if (GetInput() == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } - - if (counter != 0) { - GetOutput() /= counter; - } - return GetOutput() > 0; + GetOutput() = 0.0; + for (size_t i = 0; i < GetInput().size(); i++) + GetOutput() += GetInput()[i]; + + GetOutput() /= GetInput().size(); + + return true; } bool KutuzovIElemVecAverageSEQ::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; + return true; } } // namespace kutuzov_i_elem_vec_average diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 836f978b84..87a7a295ea 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -23,36 +23,28 @@ namespace kutuzov_i_elem_vec_average { class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests { public: static std::string PrintTestParam(const TestType &test_param) { - return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); + return std::to_string(test_param); } protected: void SetUp() override { - int width = -1; - int height = -1; - int channels = -1; - std::vector img; - // Read image in RGB to ensure consistent channel count - { - std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_kutuzov_i_elem_vec_average, "pic.jpg"); - auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); - if (data == nullptr) { - throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); - } - channels = STBI_rgb; - img = std::vector(data, data + (static_cast(width * height * channels))); - stbi_image_free(data); - if (std::cmp_not_equal(width, height)) { - throw std::runtime_error("width != height: "); - } - } - - TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); + + TestType param = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + input_data_ = std::vector(param); + + for (size_t i = 0; i < param; i++) + input_data_[i] = i * i - (double)param / 2; } bool CheckTestOutputData(OutType &output_data) final { - return (input_data_ == output_data); + + double average = 0.0; + for (size_t i = 0; i < input_data_.size(); i++) + average += input_data_[i]; + + average /= input_data_.size(); + + return abs(output_data - average) < 0.0001; } InType GetTestInputData() final { @@ -60,7 +52,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; +const std::array kTestParam = {1, 10, 1000, 10000}; const auto kTestTasksList = std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average), diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index d13260efd5..610899afbb 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -8,15 +8,25 @@ namespace kutuzov_i_elem_vec_average { class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests { - const int kCount_ = 100; + const int kCount_ = 10000; InType input_data_{}; void SetUp() override { - input_data_ = kCount_; + + input_data_ = std::vector(kCount_); + + for (int i = 0; i < kCount_; i++) + input_data_[i] = i * i - (double)kCount_ / 2; } bool CheckTestOutputData(OutType &output_data) final { - return input_data_ == output_data; + double average = 0.0; + for (size_t i = 0; i < input_data_.size(); i++) + average += input_data_[i]; + + average /= input_data_.size(); + + return abs(output_data - average) < 0.0001; } InType GetTestInputData() final { From 636c52fe056272e56443b5b6b0abc51bcc8d3ddc Mon Sep 17 00:00:00 2001 From: K Date: Mon, 17 Nov 2025 20:24:54 +0300 Subject: [PATCH 30/57] [DEV] Task1 Fixed mpi version --- .../mpi/src/ops_mpi.cpp | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index a1117a838b..9512b803e0 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -26,17 +26,21 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { bool KutuzovIElemVecAverageMPI::RunImpl() { + const auto& input = GetInput(); + int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); double global_sum = 0.0; - size_t num_threads = ppc::util::GetNumThreads(); - size_t batch_size = GetInput().size() / num_threads; + int num_processes; + MPI_Comm_size(MPI_COMM_WORLD, &num_processes); + + size_t batch_size = input.size() / num_processes; std::vector recv_buffer(batch_size); - MPI_Scatter(GetInput().data(), GetInput().size(), MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); + MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; for (size_t i = 0; i < batch_size; i++) @@ -44,8 +48,14 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); - if (rank == 0) - GetOutput() = global_sum / GetInput().size(); + if (rank == 0) { + for (size_t i = num_processes * batch_size; i < input.size(); i++) + global_sum += input[i]; + + GetOutput() = global_sum / input.size(); + } + + MPI_Bcast(&GetOutput(), 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); return true; From 02ef337ec0eefb44cee1efb04e989e108ecbf8ab Mon Sep 17 00:00:00 2001 From: K Date: Mon, 17 Nov 2025 20:32:51 +0300 Subject: [PATCH 31/57] [FORMAT] Formatting fixes --- .../kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 11 ++++++----- .../kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp | 3 ++- .../tests/functional/main.cpp | 14 +++++++------- .../tests/performance/main.cpp | 11 ++++++----- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 9512b803e0..7f05d8d59d 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -25,14 +25,13 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { } bool KutuzovIElemVecAverageMPI::RunImpl() { - - const auto& input = GetInput(); + const auto &input = GetInput(); int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); double global_sum = 0.0; - + int num_processes; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); @@ -43,14 +42,16 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; - for (size_t i = 0; i < batch_size; i++) + for (size_t i = 0; i < batch_size; i++) { sum += recv_buffer[i]; + } MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (rank == 0) { - for (size_t i = num_processes * batch_size; i < input.size(); i++) + for (size_t i = num_processes * batch_size; i < input.size(); i++) { global_sum += input[i]; + } GetOutput() = global_sum / input.size(); } diff --git a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp index 56f3c9c106..c89ddfe8a4 100644 --- a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp +++ b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp @@ -24,8 +24,9 @@ bool KutuzovIElemVecAverageSEQ::PreProcessingImpl() { bool KutuzovIElemVecAverageSEQ::RunImpl() { GetOutput() = 0.0; - for (size_t i = 0; i < GetInput().size(); i++) + for (size_t i = 0; i < GetInput().size(); i++) { GetOutput() += GetInput()[i]; + } GetOutput() /= GetInput().size(); diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 87a7a295ea..dc6863570b 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -28,19 +28,19 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); input_data_ = std::vector(param); - for (size_t i = 0; i < param; i++) + for (size_t i = 0; i < param; i++) { input_data_[i] = i * i - (double)param / 2; + } } bool CheckTestOutputData(OutType &output_data) final { - double average = 0.0; - for (size_t i = 0; i < input_data_.size(); i++) + for (size_t i = 0; i < input_data_.size(); i++) { average += input_data_[i]; + } average /= input_data_.size(); @@ -63,9 +63,9 @@ TEST_P(KutuzovIElemVecAverageFuncTests, MatmulFromPic) { const std::array kTestParam = {1, 10, 1000, 10000}; -const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average)); +const auto kTestTasksList = std::tuple_cat( + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_kutuzov_i_elem_vec_average)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index 610899afbb..c1e00a32e7 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -12,17 +12,18 @@ class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests(kCount_); - for (int i = 0; i < kCount_; i++) + for (int i = 0; i < kCount_; i++) { input_data_[i] = i * i - (double)kCount_ / 2; + } } bool CheckTestOutputData(OutType &output_data) final { double average = 0.0; - for (size_t i = 0; i < input_data_.size(); i++) + for (size_t i = 0; i < input_data_.size(); i++) { average += input_data_[i]; + } average /= input_data_.size(); @@ -38,8 +39,8 @@ TEST_P(KutuzovIElemVecAveragePerfTests, RunPerfModes) { ExecuteTest(GetParam()); } -const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_kutuzov_i_elem_vec_average); +const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks( + PPC_SETTINGS_kutuzov_i_elem_vec_average); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); From ed1577e9084dc4f969f095db6107282076d15068 Mon Sep 17 00:00:00 2001 From: K Date: Mon, 17 Nov 2025 21:07:13 +0300 Subject: [PATCH 32/57] [DEV] Task1 mpi version fixes --- .../mpi/src/ops_mpi.cpp | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 7f05d8d59d..c0e923bd3a 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -27,6 +27,8 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { bool KutuzovIElemVecAverageMPI::RunImpl() { const auto &input = GetInput(); + double result; + int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); @@ -35,28 +37,31 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { int num_processes; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); - size_t batch_size = input.size() / num_processes; + int batch_size = input.size() / num_processes; std::vector recv_buffer(batch_size); - MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); - - double sum = 0.0; - for (size_t i = 0; i < batch_size; i++) { - sum += recv_buffer[i]; - } + if (batch_size != 0) { + MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); - MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + double sum = 0.0; + for (int i = 0; i < batch_size; i++) { + sum += recv_buffer[i]; + } + MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + } + if (rank == 0) { - for (size_t i = num_processes * batch_size; i < input.size(); i++) { + for (int i = num_processes * batch_size; i < input.size(); i++) { global_sum += input[i]; } - GetOutput() = global_sum / input.size(); + result = global_sum / input.size(); } - MPI_Bcast(&GetOutput(), 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); + MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); + GetOutput() = result; MPI_Barrier(MPI_COMM_WORLD); return true; From 3c18bf3b5a1162f0d28521ec5c101cca86e2a259 Mon Sep 17 00:00:00 2001 From: K Date: Mon, 17 Nov 2025 21:07:43 +0300 Subject: [PATCH 33/57] [FORMAT] formatting fixes --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index c0e923bd3a..fb85b2e4e0 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -51,7 +51,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); } - + if (rank == 0) { for (int i = num_processes * batch_size; i < input.size(); i++) { global_sum += input[i]; From 61440d8cfcd396b549a5663fc7cf517ce79a123e Mon Sep 17 00:00:00 2001 From: K Date: Mon, 17 Nov 2025 21:32:54 +0300 Subject: [PATCH 34/57] [DEV] Task1 comparison type fix --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index fb85b2e4e0..623fa8fca1 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -53,7 +53,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { } if (rank == 0) { - for (int i = num_processes * batch_size; i < input.size(); i++) { + for (int i = num_processes * batch_size; i < (int)(input.size()); i++) { global_sum += input[i]; } From 0db04bfffc43d09e59a520c4e8a657f3304c2bcb Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 00:20:03 +0300 Subject: [PATCH 35/57] [DEV] CLang-Tidy fixes --- .../common/include/common.hpp | 1 + .../mpi/src/ops_mpi.cpp | 18 +++++++++--------- .../tests/functional/main.cpp | 5 +++-- .../tests/performance/main.cpp | 6 +++++- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp index 6a5203aa58..0968f555e2 100644 --- a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp +++ b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "task/include/task.hpp" diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 623fa8fca1..6310bf78fa 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -2,8 +2,9 @@ #include -#include +#include #include +#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "util/include/util.hpp" @@ -17,7 +18,7 @@ KutuzovIElemVecAverageMPI::KutuzovIElemVecAverageMPI(const InType &in) { } bool KutuzovIElemVecAverageMPI::ValidationImpl() { - return GetInput().size() > 0; + return !GetInput().empty(); } bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { @@ -27,17 +28,16 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { bool KutuzovIElemVecAverageMPI::RunImpl() { const auto &input = GetInput(); - double result; + double result = 0.0; + double global_sum = 0.0; int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); - double global_sum = 0.0; - - int num_processes; + int num_processes = 0; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); - int batch_size = input.size() / num_processes; + int batch_size = static_cast(input.size() / num_processes); std::vector recv_buffer(batch_size); @@ -53,11 +53,11 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { } if (rank == 0) { - for (int i = num_processes * batch_size; i < (int)(input.size()); i++) { + for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { global_sum += input[i]; } - result = global_sum / input.size(); + result = global_sum / static_cast(input.size()); } MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index dc6863570b..d9333fcaa6 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" @@ -32,7 +33,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(param); for (size_t i = 0; i < param; i++) { - input_data_[i] = i * i - (double)param / 2; + input_data_[i] = i * i - static_cast(param) / 2; } } @@ -52,7 +53,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests +#include +#include +#include + #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" #include "kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp" @@ -15,7 +19,7 @@ class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests(kCount_); for (int i = 0; i < kCount_; i++) { - input_data_[i] = i * i - (double)kCount_ / 2; + input_data_[i] = i * i - static_cast(kCount_) / 2; } } From 1609eafa081032491ffbde3f3d85f83a2da63cf2 Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 00:21:11 +0300 Subject: [PATCH 36/57] [FORMAT] formatting --- tasks/kutuzov_i_elem_vec_average/common/include/common.hpp | 2 +- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp | 2 +- tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp index 0968f555e2..0420e2af4a 100644 --- a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp +++ b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp @@ -1,9 +1,9 @@ #pragma once +#include #include #include #include -#include #include "task/include/task.hpp" diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 6310bf78fa..097df57c5f 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -2,9 +2,9 @@ #include +#include #include #include -#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "util/include/util.hpp" diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index d9333fcaa6..8f18030ae1 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -11,7 +12,6 @@ #include #include #include -#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index 856e4db44f..50227903af 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -1,8 +1,8 @@ #include +#include #include #include -#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" From c2731ab5aac090b596ef3be7c00492b419e6aabb Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 20:19:24 +0300 Subject: [PATCH 37/57] [DEV] Broadcasting batch_size attempted fix --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 097df57c5f..4810991285 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -38,11 +38,12 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Comm_size(MPI_COMM_WORLD, &num_processes); int batch_size = static_cast(input.size() / num_processes); + MPI_Bcast(&batch_size, 1, MPI_INT, 0, MPI_COMM_WORLD); - std::vector recv_buffer(batch_size); + double* recv_buffer = new double[batch_size]; - if (batch_size != 0) { - MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer.data(), batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); + if (batch_size > 0) { + MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; for (int i = 0; i < batch_size; i++) { @@ -52,6 +53,8 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); } + delete[] recv_buffer; + if (rank == 0) { for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { global_sum += input[i]; From 6aac03c7a8973bb5cd8a32d621fdbbe3d41cfd0e Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 20:20:02 +0300 Subject: [PATCH 38/57] [FORMAT] Fix attempt 1 --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 4810991285..5523cb34c0 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -40,7 +40,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { int batch_size = static_cast(input.size() / num_processes); MPI_Bcast(&batch_size, 1, MPI_INT, 0, MPI_COMM_WORLD); - double* recv_buffer = new double[batch_size]; + double *recv_buffer = new double[batch_size]; if (batch_size > 0) { MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); From 73e814d2fe4aa235bc99315ce0f1ddbde8250f0f Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 20:42:52 +0300 Subject: [PATCH 39/57] [DEV] More slight fixes --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 5523cb34c0..afc343e10b 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -37,12 +37,11 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { int num_processes = 0; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); - int batch_size = static_cast(input.size() / num_processes); + int batch_size = static_cast(input.size()) / num_processes; MPI_Bcast(&batch_size, 1, MPI_INT, 0, MPI_COMM_WORLD); - double *recv_buffer = new double[batch_size]; - if (batch_size > 0) { + double *recv_buffer = new double[batch_size]; MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; @@ -51,10 +50,9 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { } MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + delete[] recv_buffer; } - delete[] recv_buffer; - if (rank == 0) { for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { global_sum += input[i]; From f9d2362de340063339362848e5359870fd8ab218 Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 21:14:16 +0300 Subject: [PATCH 40/57] [DEV] More fixes --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 6 ++++-- .../kutuzov_i_elem_vec_average/tests/functional/main.cpp | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index afc343e10b..886ff4f1e3 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -54,8 +54,10 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { } if (rank == 0) { - for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { - global_sum += input[i]; + if (num_processes * batch_size < static_cast(input.size())) { + for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { + global_sum += input[i]; + } } result = global_sum / static_cast(input.size()); diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 8f18030ae1..0ab6c61dbf 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" @@ -44,8 +45,12 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests Date: Tue, 18 Nov 2025 21:14:50 +0300 Subject: [PATCH 41/57] [FORMAT] Fix attempt 3 --- tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 0ab6c61dbf..9a1533a686 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -6,13 +6,13 @@ #include #include #include +#include #include #include #include #include #include #include -#include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" #include "kutuzov_i_elem_vec_average/mpi/include/ops_mpi.hpp" @@ -49,7 +49,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests Date: Tue, 18 Nov 2025 21:51:03 +0300 Subject: [PATCH 42/57] [DEV] More explicit conversions --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 1 + .../kutuzov_i_elem_vec_average/tests/functional/main.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 886ff4f1e3..3aaea99b58 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -27,6 +27,7 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { bool KutuzovIElemVecAverageMPI::RunImpl() { const auto &input = GetInput(); + GetOutput() = 0.0; double result = 0.0; double global_sum = 0.0; diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 9a1533a686..dfcfd7e8f0 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -33,18 +33,18 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); input_data_ = std::vector(param); - for (size_t i = 0; i < param; i++) { - input_data_[i] = i * i - static_cast(param) / 2; + for (int i = 0; i < static_cast(param); i++) { + input_data_[i] = i * i - static_cast(param) / 2.0; } } bool CheckTestOutputData(OutType &output_data) final { double average = 0.0; - for (size_t i = 0; i < input_data_.size(); i++) { + for (int i = 0; i < static_cast(input_data_.size()); i++) { average += input_data_[i]; } - average /= input_data_.size(); + average /= static_cast(input_data_.size()); bool result = abs(output_data - average) < 0.0001; if (!result) { std::cout << output_data << " " << average; From bc9a305fa7c5ffefb5b7dfef42e88e2879859b0a Mon Sep 17 00:00:00 2001 From: K Date: Tue, 18 Nov 2025 21:52:54 +0300 Subject: [PATCH 43/57] [FORMAT] Fix attempt 4 --- tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index dfcfd7e8f0..b40137376b 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -44,7 +44,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(input_data_.size()); + average /= static_cast(input_data_.size()); bool result = abs(output_data - average) < 0.0001; if (!result) { std::cout << output_data << " " << average; From 815cc1903ade590b90d44cd0c10871daaa18f5bf Mon Sep 17 00:00:00 2001 From: K Date: Wed, 19 Nov 2025 20:32:47 +0300 Subject: [PATCH 44/57] [DEV] removed scatter & tweaked func tests --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 10 +++------- .../tests/functional/main.cpp | 4 ++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 3aaea99b58..f87e736627 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -38,20 +38,16 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { int num_processes = 0; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); - int batch_size = static_cast(input.size()) / num_processes; - MPI_Bcast(&batch_size, 1, MPI_INT, 0, MPI_COMM_WORLD); + int batch_size = 0; + batch_size = static_cast(input.size()) / num_processes; if (batch_size > 0) { - double *recv_buffer = new double[batch_size]; - MPI_Scatter(input.data(), batch_size, MPI_DOUBLE, recv_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); - double sum = 0.0; for (int i = 0; i < batch_size; i++) { - sum += recv_buffer[i]; + sum += input[rank * batch_size + i]; } MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); - delete[] recv_buffer; } if (rank == 0) { diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index b40137376b..cce1f2771e 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -31,10 +31,10 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - input_data_ = std::vector(param); + input_data_ = std::vector(param, 0.0); for (int i = 0; i < static_cast(param); i++) { - input_data_[i] = i * i - static_cast(param) / 2.0; + input_data_[i] = static_cast(i * i) - static_cast(param) / 2.0; } } From d90af75f78e75575b0f595d9fdc7b4f792622cf8 Mon Sep 17 00:00:00 2001 From: K Date: Wed, 19 Nov 2025 20:55:06 +0300 Subject: [PATCH 45/57] [TEST] Set all to 1 --- tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index cce1f2771e..db25d8be82 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -34,7 +34,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(param, 0.0); for (int i = 0; i < static_cast(param); i++) { - input_data_[i] = static_cast(i * i) - static_cast(param) / 2.0; + input_data_[i] = 1.0; } } From 20e53b523e31a08f2afbc9ba224cde3959284f63 Mon Sep 17 00:00:00 2001 From: K Date: Wed, 19 Nov 2025 21:18:43 +0300 Subject: [PATCH 46/57] [TEST] Changed answer calculation --- .../tests/functional/main.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index db25d8be82..848f01dc4a 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -33,21 +33,20 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); input_data_ = std::vector(param, 0.0); + answer = 0.0; for (int i = 0; i < static_cast(param); i++) { - input_data_[i] = 1.0; + double value = static_cast(i * i) - static_cast(param) / 2.0; + input_data_[i] = value; + answer += value; } + + answer /= static_cast(param); } bool CheckTestOutputData(OutType &output_data) final { - double average = 0.0; - for (int i = 0; i < static_cast(input_data_.size()); i++) { - average += input_data_[i]; - } - - average /= static_cast(input_data_.size()); - bool result = abs(output_data - average) < 0.0001; + bool result = abs(output_data - answer) < 0.0001; if (!result) { - std::cout << output_data << " " << average; + std::cout << output_data << " " << answer; } return result; @@ -59,6 +58,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests Date: Wed, 19 Nov 2025 22:39:00 +0300 Subject: [PATCH 47/57] [DEV] Debuging --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 7 +++++-- tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index f87e736627..1296880d8e 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" @@ -46,7 +47,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { for (int i = 0; i < batch_size; i++) { sum += input[rank * batch_size + i]; } - + std::cout << input.size() << " : " << rank << " " << sum << std::endl; MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); } @@ -56,13 +57,15 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { global_sum += input[i]; } } - + std::cout << input.size() << " : " << "Global Sum: " << global_sum << std::endl; result = global_sum / static_cast(input.size()); } MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); GetOutput() = result; + std::cout << input.size() << " : " << "Answer: " << rank << " " << GetOutput() << std::endl; + MPI_Barrier(MPI_COMM_WORLD); return true; } diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 848f01dc4a..ad83596fd0 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -34,13 +34,14 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(param, 0.0); answer = 0.0; - for (int i = 0; i < static_cast(param); i++) { + int num = static_cast(param); + for (int i = 0; i < num; i++) { double value = static_cast(i * i) - static_cast(param) / 2.0; input_data_[i] = value; answer += value; } - answer /= static_cast(param); + std::cout << num << " : Expected answer: " << answer << std::endl; } bool CheckTestOutputData(OutType &output_data) final { From 56653a464adaafcb26743d360e7b4fb38971c15b Mon Sep 17 00:00:00 2001 From: K Date: Wed, 19 Nov 2025 22:39:32 +0300 Subject: [PATCH 48/57] [FORMAT] Debuging --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 1296880d8e..0af83d9385 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -64,7 +64,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); GetOutput() = result; - std::cout << input.size() << " : " << "Answer: " << rank << " " << GetOutput() << std::endl; + std::cout << input.size() << " : " << "Answer: " << rank << " " << GetOutput() << std::endl; MPI_Barrier(MPI_COMM_WORLD); return true; From 6a4a7d9c770d8762d6abd88389a266ce1c7b6497 Mon Sep 17 00:00:00 2001 From: K Date: Thu, 20 Nov 2025 00:40:38 +0300 Subject: [PATCH 49/57] [TEST] Perf test fixes --- .../mpi/src/ops_mpi.cpp | 5 ----- .../tests/functional/main.cpp | 5 ----- .../tests/performance/main.cpp | 20 +++++++++---------- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 0af83d9385..5bf8468d0a 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" @@ -47,7 +46,6 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { for (int i = 0; i < batch_size; i++) { sum += input[rank * batch_size + i]; } - std::cout << input.size() << " : " << rank << " " << sum << std::endl; MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); } @@ -57,15 +55,12 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { global_sum += input[i]; } } - std::cout << input.size() << " : " << "Global Sum: " << global_sum << std::endl; result = global_sum / static_cast(input.size()); } MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); GetOutput() = result; - std::cout << input.size() << " : " << "Answer: " << rank << " " << GetOutput() << std::endl; - MPI_Barrier(MPI_COMM_WORLD); return true; } diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index ad83596fd0..872591e53f 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -41,14 +40,10 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(param); - std::cout << num << " : Expected answer: " << answer << std::endl; } bool CheckTestOutputData(OutType &output_data) final { bool result = abs(output_data - answer) < 0.0001; - if (!result) { - std::cout << output_data << " " << answer; - } return result; } diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index 50227903af..7bf44a6c44 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -12,26 +12,26 @@ namespace kutuzov_i_elem_vec_average { class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests { - const int kCount_ = 10000; + const int kCount_ = 100000000; InType input_data_{}; + double answer = 0.0; void SetUp() override { - input_data_ = std::vector(kCount_); + input_data_ = std::vector(kCount_, 0.0); + answer = 0.0; for (int i = 0; i < kCount_; i++) { - input_data_[i] = i * i - static_cast(kCount_) / 2; + double value = static_cast(i * i) - static_cast(kCount_) / 2.0; + input_data_[i] = value; + answer += value; } + answer /= static_cast(kCount_); } bool CheckTestOutputData(OutType &output_data) final { - double average = 0.0; - for (size_t i = 0; i < input_data_.size(); i++) { - average += input_data_[i]; - } - - average /= input_data_.size(); + bool result = abs(output_data - answer) < 0.0001; - return abs(output_data - average) < 0.0001; + return result; } InType GetTestInputData() final { From 9a39a06318a965bd76cc05d30d6a79ef3e61806d Mon Sep 17 00:00:00 2001 From: K Date: Sat, 22 Nov 2025 21:10:33 +0300 Subject: [PATCH 50/57] [DEV] MPI brought scatter back --- .../mpi/src/ops_mpi.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index 5bf8468d0a..ad99d09908 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -38,24 +38,35 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { int num_processes = 0; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); + int total_elements_num = 0; + if (rank == 0) { + total_elements_num = static_cast(GetInput().size()); + } + MPI_Bcast(&total_elements_num, 1, MPI_INT, 0, MPI_COMM_WORLD); + int batch_size = 0; - batch_size = static_cast(input.size()) / num_processes; + batch_size = total_elements_num / num_processes; if (batch_size > 0) { + double* local_buffer = new double[batch_size]; + MPI_Scatter(GetInput().data(), batch_size, MPI_DOUBLE, local_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); + double sum = 0.0; for (int i = 0; i < batch_size; i++) { sum += input[rank * batch_size + i]; } + MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + delete[] local_buffer; } if (rank == 0) { - if (num_processes * batch_size < static_cast(input.size())) { - for (int i = num_processes * batch_size; i < static_cast(input.size()); i++) { + if (num_processes * batch_size < total_elements_num) { + for (int i = num_processes * batch_size; i < total_elements_num; i++) { global_sum += input[i]; } } - result = global_sum / static_cast(input.size()); + result = global_sum / static_cast(total_elements_num); } MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); From 7350c28630a5f433be0e7528e1e7a16d81865e18 Mon Sep 17 00:00:00 2001 From: K Date: Sat, 22 Nov 2025 21:14:39 +0300 Subject: [PATCH 51/57] [FORMAT] MPI brought scatter back --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index ad99d09908..b0fdc9d5dd 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -48,7 +48,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { batch_size = total_elements_num / num_processes; if (batch_size > 0) { - double* local_buffer = new double[batch_size]; + double *local_buffer = new double[batch_size]; MPI_Scatter(GetInput().data(), batch_size, MPI_DOUBLE, local_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index 7bf44a6c44..3e0741edb6 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -12,7 +12,7 @@ namespace kutuzov_i_elem_vec_average { class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests { - const int kCount_ = 100000000; + const int kCount_ = 10000000; InType input_data_{}; double answer = 0.0; @@ -29,7 +29,7 @@ class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests Date: Sat, 22 Nov 2025 21:49:48 +0300 Subject: [PATCH 52/57] [DEV] MPI fixed wrong buffer usage --- .../kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index b0fdc9d5dd..cefe4ea04d 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -26,34 +26,38 @@ bool KutuzovIElemVecAverageMPI::PreProcessingImpl() { } bool KutuzovIElemVecAverageMPI::RunImpl() { - const auto &input = GetInput(); GetOutput() = 0.0; double result = 0.0; double global_sum = 0.0; + // MPI Data int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); int num_processes = 0; MPI_Comm_size(MPI_COMM_WORLD, &num_processes); + // Syncing input size data int total_elements_num = 0; if (rank == 0) { total_elements_num = static_cast(GetInput().size()); } MPI_Bcast(&total_elements_num, 1, MPI_INT, 0, MPI_COMM_WORLD); + // Calculating batch size int batch_size = 0; batch_size = total_elements_num / num_processes; + // If batch size isn't negative: Scatter the data among processes, + // sum it and reduce back to the process-0 if (batch_size > 0) { double *local_buffer = new double[batch_size]; MPI_Scatter(GetInput().data(), batch_size, MPI_DOUBLE, local_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; for (int i = 0; i < batch_size; i++) { - sum += input[rank * batch_size + i]; + sum += local_buffer[i]; } MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); @@ -61,17 +65,21 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { } if (rank == 0) { + // Add remaining elements on process-0 if (num_processes * batch_size < total_elements_num) { for (int i = num_processes * batch_size; i < total_elements_num; i++) { - global_sum += input[i]; + global_sum += GetInput()[i]; } } + // Get the average result = global_sum / static_cast(total_elements_num); } + // Broadcast the result to all the processes MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); GetOutput() = result; + // Wait for all processes to finish working MPI_Barrier(MPI_COMM_WORLD); return true; } From ad28a863484ca3d9b7451d27a0bdfccaece01e7b Mon Sep 17 00:00:00 2001 From: K Date: Sun, 23 Nov 2025 00:41:05 +0300 Subject: [PATCH 53/57] [TEST] Larger performance test data --- tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp index 3e0741edb6..570f42a23a 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/performance/main.cpp @@ -12,7 +12,7 @@ namespace kutuzov_i_elem_vec_average { class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests { - const int kCount_ = 10000000; + const int kCount_ = 50000000; InType input_data_{}; double answer = 0.0; From 9fbb80db54545d28bfbd3938a6453c3f9369b7d7 Mon Sep 17 00:00:00 2001 From: K Date: Sun, 23 Nov 2025 00:41:17 +0300 Subject: [PATCH 54/57] [REPORT] Report commit --- tasks/kutuzov_i_elem_vec_average/report.md | 163 +++++++++++++++++- .../report_img/PerfEfficiency.png | Bin 0 -> 33101 bytes .../report_img/PerfTime.png | Bin 0 -> 24002 bytes 3 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 tasks/kutuzov_i_elem_vec_average/report_img/PerfEfficiency.png create mode 100644 tasks/kutuzov_i_elem_vec_average/report_img/PerfTime.png diff --git a/tasks/kutuzov_i_elem_vec_average/report.md b/tasks/kutuzov_i_elem_vec_average/report.md index 93cd6bdc1d..97aa9d6ed6 100644 --- a/tasks/kutuzov_i_elem_vec_average/report.md +++ b/tasks/kutuzov_i_elem_vec_average/report.md @@ -1,2 +1,163 @@ -# Отчет +# Вычисление среднего значения элементов вектора +- Student: Кутузов Иван Арсеньевич, group 3823Б1ФИ3 +- Technology: SEQ | MPI +- Variant: 2 + +## 1. Введение + +Вычисление среднего значения элементов вектора - типовая задача, которая легко адаптируется к параллельному исполнению. Идеальное ускорение соответствует количеству задействованных процессоров. + +## 2. Постановка задачи + +### Входные данные: + +Дан вектор длины `N`, состоящий из элементов типа `double`. + +### Выходные данные: + +Значение типа `double`, равное среднему значению всех `N` элементов вектора. + +### 3. Последовательный алгоритм + +Решение "в лоб": суммируем элементы вектора, затем делим полученную сумму на число элементов в изначальном векторе. + +```c++ +  GetOutput() = 0.0; + +  for (size_t i = 0; i < GetInput().size(); i++) { +    GetOutput() += GetInput()[i]; +  } + +  GetOutput() /= GetInput().size(); +``` + +### 4. Параллельный алгоритм + +Объявлеются две переменные типа `double`: +* `result` - на конец вычислений будет содержать среднее значение элеметов вектора на (всех процессах) - ответ на поставленную задачу; +* `global_sum` - будет содержать значение суммы всех элеметов вектора, частично вычисленное на отдельных процессах и собранное в итогувую сумму на процессе с рангом 0; + +```c++ +double result = 0.0; +double global_sum = 0.0; +``` + +Через MPI вызовы получаются значения ранга исполняемого процесса и числа всех процессов; + +```c++ +int rank = 0; +MPI_Comm_rank(MPI_COMM_WORLD, &rank); + +int num_processes = 0; +MPI_Comm_size(MPI_COMM_WORLD, &num_processes); +``` + +На процессе с рангом 0 определяется количество элементов в векторе. С помощью вызова `MPI_Bcast` это значение рассылается по всем остальным процессам. + +```c++ +int total_elements_num = 0; +if (rank == 0) { + total_elements_num = static_cast(GetInput().size()); +} +MPI_Bcast(&total_elements_num, 1, MPI_INT, 0, MPI_COMM_WORLD); +``` + +Определяется размер "пачки" - число элеметов вектора, отдаваемых на обработку каждому процессу. Заметим, что `batch_size * num_processes` может быть меньше числа элеметов в векторе. + +```c++ +int batch_size = 0; +batch_size = total_elements_num / num_processes; +``` + +Если размер "пачки" больше нуля, то: +* Выделяем память под локальный буффер данных, который будет содержать данные, выданные процессу для обработки; +* При помощи вызова `MPI_Scatter` распределяем элементы изначального вектора по процессам поровну (по `batch_size` штук); +* Суммируем данные, лежащие в локальном буфере; +* При помощи вызова `MPI_Reduce` собираем и складываем частичные суммы со всех процессов на процессе с рангом 0 (значение помещается в `global_sum`); +* Здесь же освобождаем память, выделенную под локальный буфер. + +```c++ +if (batch_size > 0) { + double *local_buffer = new double[batch_size]; + MPI_Scatter(GetInput().data(), batch_size, MPI_DOUBLE, local_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); + + double sum = 0.0; + for (int i = 0; i < batch_size; i++) { + sum += local_buffer[i]; + } + + MPI_Reduce(&sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + delete[] local_buffer; +} +``` + +На процессе с рангом ноль обрабатываем элементы, не попавшие в рассылку, просто добавляя их к значению `global_sum`. Затем делим итоговую сумму на число элеметов в изначельном векторе, т.е. получаем ответ задачи - среднее значение элементов вектора. Полученный ответ записываем в `result`. + +```c++ +if (rank == 0) { + if (num_processes * batch_size < total_elements_num) { + for (int i = num_processes * batch_size; i < total_elements_num; i++) { + global_sum += GetInput()[i]; + } + } + + result = global_sum / static_cast(total_elements_num); +} +``` + +Рассылаем значение `result` на все остальные процессы (чтобы проходили тесты корректности ответа). + +```c++ +MPI_Bcast(&result, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); +GetOutput() = result; +``` + +Вызываем `MPI_Barrier`, чтобы убедится, что все процессы завершили свою работу. + +```c++ +MPI_Barrier(MPI_COMM_WORLD); +``` + +### 5. Среда экспериментов + +- Hardware/OS: 14th gen Intel(R) Core(TM) i5-14600KF, 14 ядер (6P+8E ядер), 32 GB RAM, Windows 11 x64 +- Toolchain: compiler, version, build type (Release/RelWithDebInfo) + - Cmake 3.28.3 + - Компилятор: g++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 + - Использовался Docker-контейнер. + - Режим сборки: Release. +- Data: Вектор длиной 50 000 000. + +## 6. Результаты + +### 6.1 Корректность + +Корректность работы проверена с помощью тестов Google Test на векторах размером: 1, 10, 1000 и 10000. + +### 6.2 Производительность + +| Mode | Count | Time, s | Speedup | Efficiency | +| ---- | ----- | ------- | ------- | ---------- | +| seq | 1 | 0.0325 | 1.00 | N/A | +| mpi | 2 | 0.1479 | 0.22 | 11.0% | +| mpi | 4 | 0.1289 | 0.25 | 6.25% | +| mpi | 6 | 0.1329 | 0.24 | 4.0% | +| mpi | 8 | 0.1646 | 0.20 | 2.5% | +| mpi | 10 | 0.1629 | 0.20 | 2.0% | + +График времени исполнения (в секундах) в зависомости от кол-ва процессов: + +![](report_img/PerfTime.png) + +График эффективности параллелизма в зависомости от кол-ва процессов: + +![](report_img/PerfEfficiency.png) + +## 7. Заключение + +Операции рассылки данных по процессам и их последующий сбор требуют значительно больше времени, чем решение данной задачи последовательно, что привело к очень низкой эффективности параллелизма. + +## 8. Ссылки + +1. "Параллельное программирование для кластерных систем" ННГУ им. Лобачевского, ИИТММ \ No newline at end of file diff --git a/tasks/kutuzov_i_elem_vec_average/report_img/PerfEfficiency.png b/tasks/kutuzov_i_elem_vec_average/report_img/PerfEfficiency.png new file mode 100644 index 0000000000000000000000000000000000000000..02e231cf1d2da3e5523217b7a6b89673708afeb9 GIT binary patch literal 33101 zcmdSBc{J7S`!>8wMRk(~DKeB>ijd68kU|KV!$u|ZJjXUw-W6x^IPlv^Lg&IT6Zg#Ydo*>JkH}duTQ`OWjX3&498F?6t(=l zyJ{#D1p)rtr#b@vqSa%N0sj+ol6mN)ZfoM?`q;r3rS#az&dS!w%KQndi?M^FxvdR9 z58rhj;cKjBPEK}?V!XW8|J8!W*1?qbemcDd=Rmq-nmG#PQzn1+ zw#Ks<@(|^-_nQ6R7BH9b?;c3Yn{`xloIFf-_%I!&uQ-Q<#p20n*caA>S>2lQ@^Tk_ zx|4Lr0|OK8sZYiJy>v=VK6V}JsCFOy;L&Bbv@LJKvVoiFji?L5N8eytL|e!HxZ@2D zzzk46FDE3{cn>3gMfqCp{cp=BYX2`DcT15aqiW>-{mK9F|KMXsjZE05@I%@EWi$Vu z_m~Qd5B?Jg`oH#6{^zy*A8%0qf2JN*C2`=z%lfhQRHf+m@8AC&**LyrhaB13a{@{8 z_U-4oI2&$UbeTHGNo<|((VnQNDCH9r@N+4O?=3A_va&}AJ-2;H*B_f?TkdqQb8y@g zzkvL@*PHlwTaI=MuMvMoD#GJWCRa<3_Uzq6)}p-SPPc0flt{Dx%@k+$tY5l_&QeDw zsjV6H1rHZ*gHdV)|;TKaIH#JUitS8Or9^k$xG&nTs+GSbuYo@YCgdICd3UEM|I zRnh2}ZL@8X=R5{16*4ezgRF2~?Tyec-9NrZ$k*)>)) zvZ;21e)I-rFBf=2`Ha5xw(c&*?-p@?JIk$`9L}XZyC~tfxi%I$k~`;CM=fmj?e%%; zwKQpwL^^u-RUe;6FP5rzx98kfzkd1B8*15;t-8Cj-CgE5+22YgSHU*TuC6NHzh6W- zdZKA>w2Muo<;>FT+ORs0If}!NZF*54T(GwP5_;R{9Ua#5<@44eT z>?SA25HtguJ*euK->X5u$d4BhIds29Gv}JvNk-2(!L_`l}Yi(i7 zdDv}|sjXOg^zj4(asrPr4P4zuwe=w$b1AMNS{_AnVPl(f)r9rQ_}pK=o{De$P6`YP zQrFSx+Z|k0^z-v$;Ctc=Jtk$Sr}gJmJ^Fmm?N%J#D_+~cP3H9F`)$ec@0@-o`dbid z{mOs6RkXTNJ^JFf1jSE#e6m^h6bJ z)mrTei{#jAey46t?Y{gEjz(Zw8>25zEdAh!U-O6^y;du@cN*8N`-^sUQau~FalLg- z7SSku*S^)^*(_4Gwqf@QdB9pkn4ch7OKLo4VYlItD({riE}1r`nul3}!t!~={TXBDr>(Xxe^!d8p<(a*~g^e0t!m0qN$r}r;@e1I3)Z(Yg#%h91qDk|Efo}6MA zvM%F1iP^+$?YT$mh{fD;z2r`N%fsk#Vv=mInu*DTm!#xDdLm*lQc~A7i*QzbYID8$ zM)kKPYL8A2Rp4gvtHZlG6Z)>QeMLWSJnz5Nqro7|-$Z%CaVSNRepB3g zjYvt&AaL)FKTS7g4sV+Eif|oMs&bPopjX*^$lLcwG3>%}YMlamA0U)O7s!r zBdsnkAJCJdXG)Pc)&08WX}@z6=TDP}!AQdUkwpqQI}IUZBYkM!L`P>u@tgK1*;Mcx zlH9XQl)x!`-wNzPZ=Ql$UJ7H+J#_x7e$EFY`-_CSi5*k$(I>g%(t z2TFt5+pESFo8nq|~GB<)mK*8z##%+ygPW^pjR?U+Zp)h~I*t zM-!Vapcp9C4W(#ja4q+Ov~{J6c5LqpV>XE@T4ss{0d+};2Y>L=j{4B&CTA0inC)jh zKKGgWO9BELIGtB16`7cskV9ecwPd9Vj4DQ0~YR#pa=s(7yEI$3$Zk5QSl$Z|C+u5C@)S)*O8=!@?Kwr|9K zb)U#8rU|Bj7E;u3s0oz@xegAiU3zB?*scmG;DSkyTRA-Qbs1gGir$b#I?_b8y5HbI zX2-G6A;Y0e`I%i0FLb;X!*E7a1Lv)e^TVeYzaa)Ef-LJ9U!m4j`@q1pk?KsINJZDU zLG|{NHlAe;6%qyoU!SWY)^Q!_aSpdL{&v1xOh~0Gg-xt~@#e5$=BJK8Sw zRyaP(qT1O+S2L94x!$N6J7Xj?8UDNdd=`Vb6Es3iUqVwnAAUum53lvUD#R)68rRhr zCn;%gceub$1urMfDNhb?BOfAAW2Q-gILAF@k(Q~xc5-o%ZRV{bEcIQ2h1|HnN= zFYTI^OiJ1TS;PqTX7)Y2R(;jBdYN~~Ls~fHi;Ve?R1f?X`G{mFa>_Nlu$58Nlm8ZnTjKW9uCPJkR zTjTQq-zL~tJFsD|^DMaZH`S26nhIuTkU%POuzWsJjo1)v2x1+5st;4e$HN`Ul6#c4 zD!?T9hB}?CLY*|9RU)1!FdEq)FT~m0bFt}uJFoR4KQP3qv^wsz%1mNuI#shiPI2y9 zZ||cKq)#e(7~2;EJ1uKbi4{vN6yL4)Z+x$f9!?lJf&APVe*RZovHik4&Gg_U)tf;L zOEnygj9Z(?Fp00>xZcd@V;Hj4)_9|gCtZW*j9U%Yc@%>RT!q(GkwcKC1Izd#g!Y=X z$MfD16Y9?JF9{=X4T+6&Xu4Mh|M7&5d>-6^`Q|0)+<_|;8Ljdg`>XdJ_wa{Y?W%z` zvk?S$QnABCq~2@07m4O3x38cHW^red80(!1Cr{irOte0%X#|Z>dAo>T=&h{y!qX^( zNsQ+BCNRA!;rc*t`Nuug+va{d3!e*Qw}+vn)D`5|O8&mZFQ{yT%Tld&^&Lp5s9$~C z$gZSQBwt9FG3%N`cHq!WxVf*aOIK1=WKYKmC&!9cTQ@uj*L-&2{NACwh7l7qkJ8@5EDXf4{I-CMPacOY3*EoyJ`yP_d7x*72@7oi<-rSQ_ukA z#ROYaYD^67gxm9N)iUWKQ>TX7Y&+8&ud~xNXdsn`O!iV*d4kTXmyNa5ky)9gI>`em ztr6DUX^J>8F=k|(bF^5-nqNQObys;}zJB|LV4{yVU1ud&DxUs073(-y| zY!Z?jFH}^`{ansOi0ZawW0kqzI{gS^BCnIxBhvw>PhCU~_du{6+0?dj;T5)GR!k{I zMD_UDYY#@MJO$mC%pe?E=Z5m~@MzVCFgefRS2K+pBfQ*{55>n!Z}*tA7K$GH94_ao z7Jb>izZ4UC*|VyDiU@t~cX~o{E03q_*C~CccA4q+B>y<~>8oGs>q&sLM@VCoG#An- znV(6S#(S1LdGciIPYjjB^8#>SYrpRedBLr);q=cP)*4-U1O55<$ds-m6%^cPj+Zn9 zh_ZvG z*dOXL)0^1PppcT5MyMDW94;_cOp=%sUmZ*WtlH1U&%c;ZCCMP?;>^d-F2t(n7T;Rema-g?-+a1huDASVa1={ z;PPirL~z=wl>Iw64GjKK&@%O(f2gd7bgP}i%J8{QjH#DnOmQAJB+f6P%@?DiEgG2QLWRl@7@{1$VI&u*=(v?bo5m=Hbrut{P9 z{I<NLjar-7eDluB zOzyuEi*YO-^S3dt&+$p~o3;$*PTsX^#Ln8s#+}Lf@SW;#f!;S4!fWG!B_riHgV^Yl z#aBg+?)P97Qc`wqQ#q&4-sj>`7aTkzY_#kAC~Bkbvi@?vG_^&1sxUA0R>}@LTd4bl4{NGR)*sdm_!{4K$fzx_BraRNkrJ$QpH-*#`YVR>F&!qhuP`MC+m!r zPwe?gDqqW*$D-X|n{KF66n^OAl_}LPhk#olw-xKhxJ>Sk-QQEY3q%IHhgwRESX9oL zD&g%L(Z2_8Ta(wV)z4;S*N*MkEJ_YY1b^eX{?l#XR>pIaDl*Kai?pn{x*Q98_D!iq z6^6S_7tU+v(nC!;?6q6cQ7Cx&BvJdS?lUncd(4(gr2p-Ob8k+p zGY}T)m+ukUhjh~`JFaYqnH&ihB3bP-KK)6kM*Qy0##1s6!TV*5*6V1Se5%E#D` zaK``k!~i|fs;^mMZksA7Z(t?j`^4O=CC=M{`ek*^89idk-*< zUlYj=yk2*{&I`}6Q9##Xdp9aU6}G@XC@PAbXd>^N{!hT`Hi-HKle;(|+^7qOMq&`>l~PgpQf@?M`hoxyPCdNM6NyW^ascUlOfZT`}(@ zwRswI&f9QY8hX{MXmH=1QopjJ7O5dEbEc)%JO2Y0G3=zx_V#;&8_WGWHznm931o-; zoqP!agr-*?jRkCli3?+JKioVmR%D$CSPhbXh{fUB?lH`#VAxStFul)0XzsU9&M?xQ z{FD26H+U+u$k!}qP&eJ%yRc<{WG{eV7Y1#aG66Ve$a@soNK{3Od;cob>@TXYkcUhL zMaxM=@S!Mh_1p0x8H$nf{-U;u&-_`SFtom-w!Z^w01fQybe@^~Gl#=Al3k{-3-~ic z7xRs`+#65Uh4xQ(jT#!|)jP|cYeq8;>0T!NBr?scf5}kPP&1g?H`;1saj!^reUAEs z?s_M!#$OLB=C%TOwf0HE8eRy|Y*|asitSz3$Yt0t+S3^U94mQ~DxPIpmNXxFddXnenOU96IOBNYn`q5e09Z6u9VgIp99~D^H9mU!Kfq=rV_}VZ4 zhD;pG8cxZ2g<5lMMJ&QM_j}}kolLZ23IV5LK@hkd89MW{b?#${#$opHeQzOR1}!oa zh#5pk!6ZX}r_(f_D#}UFIN@F1vA@lf!FJRF1v7);l1{BTWCJC1j<4o*@uFqCN&r0d*Tp1nFVguDM`d_w={r2T$%NpEV)( zFfJCXN5OrTYJ*!AoSs~%rnjg_b}OY9$l?+g)gmwte2p8~YBJI;`DPtQD$TG_Il9k;^pz>g4=^IY~lq;;*%CY<0u*#$4^3Nwu~$L%h5hWE#4J0s+dj}%Z-460hz zp_ZI}yC3;CO#9h?${2^2TlROzx;rB+ULpp3#q3+byy2uvg_V6F6;6?5r$~lh+sg7i z0rB}F4-t#_MHiWskX##Qnta1?TkpOe_PBpBZt`>*Pri69;)A7RU?jJma-Aoye|};s zo!un%8&zBp7nOzdm-HjbveX2+qC&cAU)57@vhoH;U{PBN?(hdM!E7kx(-Dj(v_Kgm z>yl=~zI2qHixB(d$PW+`4m+1Xn$$i5Kc5GeYWB;R7&U{FU`5j6*g?hiFdNTehYD^x zq`@I@gKhT;EZotB*S36$Z6gvIWiLEwor@{C>zAVGhrll%soOAFc^Yx7r$gWOJ6%}w z%94r5=`a=T4U#e9x3^w^u^bGo&x#qGjGej|#rpB_7=ZOiCbF4|C}y-&$mRQv9kv}xm5;f^wq`jQ zGyp~@?c_UQ`@P$Ha&m2o4nbiab++qLY$e1`AEM@TQ@%{WF7_^BBy>{;Ki!bL#RV-! z8DW7`1s1h}n>pJ*Upyvv=NP|r2x>%3Z^sQJNK_3aY%?DQo%Yoczs<^7n*)HpU^3S` z-a7Ih#N{eOwja!zR#GoW>^D48q|zBhabu?Js*RTF)WUu)M;QnkFwx{}ae*)pY9m%v z@$rjXUkRGGrLU$Kmg8dttD)e^N$-l-I)!OzD)vrczf0QvhNL0h1=4zdGO_$HPFpY1 zY~VwMoI&mx7N$fXe9*R%H!Y=7X{-nCB6di6nSwTimLkZ8=fUmV?#WniC__Ut#|r(D z(x?G;&-pPEINh6sbI>k01lnmaVg*+8gx>>M1DC<5789hYX3+O&1Q8H=kbV_vygLyOq%yBhJ`lJf_0?7<)&!gTdD4>$Lp!ZOBOJ?A?4L!6F@*b~Wx zv)uT}O}(pxw1a{2{wOv;uo{Gmqt=$q=VTR^t|;eJH0fGdt>KqKx1adY4uc5E@BlJ- zyUr1@iv(BROE^;Gl|z z)9Cb$F}T8jD5{%q^at`s`bFiOEfe{~^)frgx^vXM-qzo-M~+0`0?g@(b!o3H+4m^N z$^#E4-zvlSEFAqWksHYE@uh^H`S57gbN%42f6a5PtC* z_xFbJVrb_x0(*R<0H23&4Q2XjS(o$Crj*pvZ&EvH8s9)(EM%O|$thlmWOVafFsB;D z+U6=le#|jbK!5+m%`B0R7$C@Qjjnoug4*C}3_J08g87rzJ7TF>;@-dCh4)7o{@ja> zw9<$z{^-}ikB9{ep`ZVZd2Zb;To`ank;`e7vN2{4AWBn#a~X{SXGuwe8%U`Roikqj ztg`+1ok>nVale~ONH=q3E%%Ldp0Q4KUzV9XVQt&WQHgt)LKnUt&MqR>@#dot`ut28 zjR-I@GR^Ov6uHQS#cf;U>;Xe5DhSoo3E8ztN^a0b17T&Ht@c@&@Zv&?aKw1*@{pl= zfdwOHTwom6TKsYjYmXAku(hPVnVdnEk+7eB;?{f|IkgLaBRgbWisqpwh@hef<1Ozn zS2=4_c(tqu9FQ3A#oG#tF<|$%_SZ5s&JTL2gPh+m|a7qI<>$rJbXdiSQIuAk96s|=BHxF(y z%6tJm!WtIFked}UW!1X7K)f-oS^Wz7so6pHPrx#kfhFb3hkICC+OlUr4%&pJ$I2L& z?~VbkKqA*|Upwlx^VX#=v;mXsb25-J$@Epk?m@g4hlmXG{DD!2aTl4Qr@QV9d?$t5 z#Qu55DQ>WbxqJ|=dh6Q0C39}(yzFk~aME_LN)Jx2@#Gsr_zHaBa6<3!xK*3rY=yK&h1G(OZg(a4jiY)(bzoR0)ta0ZrCW(H7hna63LaCqT zMCV<*)w}$|>=PuBg_AfXo$P{Rq5FsEa|ylK$7oxbNWxYqpXN~RdU5!87ifyX%;LJh zc?^)oOk3k}99u-?5IO5C4?2BetbV{~;pf-lP`*}S&kZO1)}KZslg5@!Fff*Y@HRb1 ztdj%d0xn)TpwK#&b_*+s&HBhLYuUVVNqlozcMlBvpuXDfdaZysM0%^p(=J1=uW_^P z0t-v-WW2XmZm9QCyPTj&)48E%V?bfxD`v|{JWMXVk3pGM!=t=DAEr0^^*zi*c1y*3 z;~h1*T97T|TckSv?^|r)I;00-r|46vgUL3nEV~|>h#sdh2P;kleR#TbEM#Evp~8R2mAb}$ z9rdd*aLi9Vs)ZOj_?mgvtH-w4_f7G@KXzofn=UgCjEz$|Iy*^2wl=nX1;)9CMzgy) zAg-;AxttxGDGLb+Dd8V7FIqQVv6F{yp`U?PmYtKpKy#y^i0$0iXh$+);_iI)x^I|NPU|le27E z+(br1?PbfR?dp{^am>o^2tAv25T&y~_Uqr=Sei?_()zu z?0{{x{^CS)VNS{GU%#FPpX005Ivp?Sm(n-cAiy)7CI+^PeY%*dev} za1V5e0t;3RrU5qnq;lK?zxu3!VLhv$zYrLA?f7b8VT+jJ0M3@+d-SxGYJu1GM&CSI zy$JZ8tl?`#8HaYJvvQ~5>J~Rv13j62RXsIbJJ+B%)NOm2V9mNaH0PBDieU!)+1MP} z#VYdR-^Y)l(5Gzr?aGFr4&vnzfrT$|AB)}ntMn@r)z4aYUG+Dy!$at(jcIHwQhazl zr}Tceo%&!?)2q5&gXrj#=#h1KwhAG_aeC^Xr~FHQ7-siSu;e}{{9@Kz>Xl6Phk~fK z-ZgPayS!@`=HJce7ZHzfL|$lD^%qcS3#q*!zVzeRe#Yt#DY@j2mK+|F2nD`EJ6fix z9{sVb65C3M$J-wYf$)P_)ZB*bMWrCq6gy?lBmuI*{jtsBhzxTV()+KO0(4~9CE5tc zAme{^y|OgH*8Si%s^9`*N^;`YRCk%q{=K0AfbI1_LpKo|`$~)*lY#EvU#Gvd>yv>a zhy_$q-*@cZ>qq`x@*{EPoPQPq&))rq75iJ=gYZiD*y!o>P0;qhEo zUBB4_e*yB<+%90bsW(Y5OIjXSOlYNnZLBfT9^HC<(xJ?0bUzz4+PR5y#@>Bnfsp>uU6Xs2&4-IU?Yx``2 zH$q5Z*rbZ$2fz=U276zfgp`6+0I>)^IL3V3PZL~xuR33tO|wCvy1IAo7a6z^R0xwN z2cX=%&JS-sAYh=)JoF=OWc%}t@yPd%i7|xa3V(Gg#S@bnLNQ_;!nj4qE*KrzFuEqy0%C zR2$^d6ppVB-1#d0t`@29HcBGuxqz5`vWe(bK5dW$ZhR_kn}`E1BY&8+6aia!&g``gZt(sW_$1E zvQ=z$rT92-rsHT~q=&s>uEj7DdJTb=0wf%X=9wZN7TvHREAs%p-2;OX-!l!)Dl_t2 z_~*_*Do_CkS31WHRDl0+P$y}Bfk_xf_!UkvP)LFvFHDri5HG^S9u2vnTUuZIkj7=-11=LE9Y zibrkNSI(=szh1y`AG%m8X!oYTF>B?!Nyiw21S0ZUgrBlJ{!4t}s|A(=83vA%GC&AD zAL;wyp3<#+e{t{W#$w$H{F@+1qf5otEpfviBAcB7$WsA6hRJqaJFXHmxsiA~nWKJsp8$~5#m4%j zppl|q6mU8;2Vnx|c+T}J59zUUfr>I4T@@1qnGh|Y#F_)3%LB=`TwrH{ZTGpvHV70w zFJ@<=@VC62a7 z#shYp#zFoWh*&^zlzN%jArV|{EUD;;<#X#+gbt_y-I9jZy0ooV?er(-#f2gAx}>Cj zMzfpd0K%oxiXfvkWW<%3R0}e6PHpqgoLcw<6sVx}ReI2%S!;mwp?Dvw*Et4Rli4jB zT;o|`e!Y_tTjoI~*xqmB0OqM!VQUg1{p#(>ZRtQi1-;s*pH$`D*mGeFDIZ7)D0SMh zxvfh_eJn%BpO$`|v+mW&<}k$)1)%{IEp&kT5LFAuxe{Ycw37w`@bYVtd29TZLvRoI z%1=L}6;w8lqV^)mfi!uKGX$CtkwjNTroNQ2{R)jIZg>L&L^gsL`26L=Q$QkfL|U++RV*gQ1%^10NSZgTo+H_|2Z*)P??!hMC@8|1zJxf^d zmNdmn*vof)-pDGTXws?aH*-$jdix~FX`qyO#p6#?cYj{t_x;I3eWM-9x-|Vv$RmEN z3K#WU*L}bvO3!Qq{-fJc$s<#LI;o|7OeJ{I{bD+>07GsLDl&4V%i|5?k5$it_AnCC zZWLvL<)5+-X6?#%`^3Z4-X1ryu%kv70V?X>aE;#}*Ek{Jd}Hm&Y=nN=T&!TPz8l*7 zaKA`dnuf@*Mh!Ga30-7Zl)`QPLuq@or~^`=k?pKo#Xhn>=`*#0^Nd0hvtbzr=z#VE z(F9BXqDNI<@4sq>D*nqX4dDoPN{9-7xiLB{ue`Xhf5@UTVrW^K@X2T7HVq30}rTof2v(D)!gp`>NY3XUNRG?_>@i?EfM$ttlo*w z?kd^J^qNJS0^;PgpK8zHY$DF(K=8xTNwur+)e*0N3UvgD7=> z!40?zpnu!bgSSk-V^h+qGSJA&002pTm90P<|AU%eHqK%~;g_b30}Pv=GqGf5*` zw*eKzGM@zp`CzYE)9dXXDtqDJsZ_ms7i}o^KmhPn6^|sKKV$aVwSgn8egT_64-wV- z)~6(c^|42KMvvAb4hCa9A|&+6yQdNX0~|sw78H>_JR4%imu#f&Y1e%c2_PUCZ;W|Q zOo2F`-ccuE1%_n^hPCo}Y=QG84uUlXds3p~ozZeX`yD4D6x*$g#pm|;?Z#yR#hvC4 zE20JFt46|#_nM}TU;Qj_CVxkeeDh90mI1k5SCZ+fI#k+L85Gy?oZjU##dY2RI7f94 zc2zjS7pD-Qsd30#lQvFymLRLnBZ+4E$PSQETx|P?sJo|4L}wiWM@9ZVGK%ZB%m4er zW2|N4-+0%rM6nXNa-i|cr()xm2)jE8ZyoxbVVPaXcC^3B;ugmqV6T^*ni^Rp7}h(5 z53u7!dF9e11uIRW2mWMv{+xNbn9rg-5^APH?N?bM+Mso=XX}zR8(KA@)=)JsPi(if?cP5#zj8wSV zdae=ucNafENy}97J7qNmg}_s%P6^nJN*Nos)1)O@_2cVXzD4a+HJ?gioY_Prj=nw+ zkywD6VQ5=zAxB)uxd&+;0eH$Mnk_L!~B6NP+QV?@<~DS_%*vJm69 z_Pos;ezh?uZ7pr8vHjgACew)(k(P6|#zJ)^)|*6$lvagnwP9g=U&=^=<;3JDuSsfu z6Q{~Yfgi&w&u%p|HFbq+8)QV=luvmxd-v#=!W)HqovBJ$c-!x9E>1&<22zrP*@Vh! zEe(zL2JTZS+stz2<{9D^zo0_c{@3{URZ-EtdP(EonDGkg4TxOM_i<<4XKSBB_DaQ& zn%;+)HXFZIe>Y3&@4k1{H=AbL!N7M+y;_B{^wz~k+?vpvs_^n+qBTBOHA!~c={HG?w0@kDlbuIF^66YpX}#%Gbob5D_Yk-tDs7uVsZwTkwuZaAJASj7%&k{4 zv(M=~D~zek%X_dojL8KuCP_tN{cc)}L!dJ7hMrLDzImY$YI>|j@R_0og@xOHO#h~ufo^@j%HoS`UMySnOuVQzn7mZ4#?pH78ySDX}NhZkZ9QLYiM0j`#3`p2xKHZnQwXHu0iRbSE z57n&F(gdR9wFK(wJc&E&Osk<{?EDr_{4eAUX6m zCoa*w*GLCJ8U8)}h^y7~QXZHT=T;nx2*_nCnoZXP<18rz5>&-ImUrmt5E&G*^65cu zPt%dXPx`=pP{~42phwbBbmyz%X3xmc?7xSqFJRSatdkT%30Q`*pWS|(*K$VxP@sGg zAk|;#d&Lz3eZBx~L)^o}a1ThylrDW%iMAG8=pHy$wgZzl1NQ)9UHKq%v5zA{7wIy*1`5vcuFz1b_(MfK z^&u4!A^nwxgWF?u#+m6$^G_gN`ap`e(lJ)9sc^y5^#IUsf$fd-Cwk&TXUuFR7rS-0 zcgp69@Cok;fT9lpM9hoa?m52%LO$JjVh@NE1n@NXkG7xOa3S*qW40`tN8U7Yf#Zh~ zKZah#(o{7O+H)auLke^Hd}!c*EiAnHkQznGxLDAlXo`WfOsJ*yb~mqLUVB!yr_z8gtv$z2kScDjP<-ko z92(#>pu>lHo+aauZGeCJ&yL+QN(|-?y`|IVMaSYS0E+-ze6Az73MA4Z;*Ca?1BXh| zsc@HLdhdkBI;Q{pbV=q59pUQTVYs`Qq|m?>%Zx

)oQp?!2>-@0ojrKspA+q+lE-zBuLAkD;&_t=*^61LGK7$;(z)$^|yYm z_UqqAnvZ&e#-*Gxe|bSwAtdz)6kLODi2aj!58&XD#A zbf0s^06+5aiHX!bu^jJL!|RRL2P|5*Jca#QhGQbh$X%AA0!Zq-huNug#P!mCZ*#pO z{kGxO&?V;Ql-qbs{wIE~f$ZN!wr_@scBuVKTFPCd{JmjR@qPR)LTmHKe@qIl$kIY+ zfD3RN9&!3<&y}TqI8VDVXcLLOm0D;}YW60laQ=>R+&A%+;yp1JIa!41a$ZI9Jt{`F zasgc97Yt5b)yBT8#e3%_RPhOt%Mlv;BARW+4L=;eicSMAi;81{x){g9lvzk=(oj_6 zH9AJO(W$s-ZHoY1irb~Kz5LrbtM9e@wTFM(E=F~6r0R<9LZ(qfO+kPO#E;ujpogyDUN>Wkj zpPp*o3+Y)QvrlcSMND5J_r2s-xLp*iP~s%^05=G>hf;tl4T8$*ptQ1R+ z88pI?uLl;mYS%O~qM5c?aZPtUmBG6sbxd zUR!)HP;Lv7VywUvqtd4RyS?n-fDdeimU`2*B>5Py3CQ_r57AggXPRqM6WT(QG|^fa zTn75-6=~d>ZtTdZQ$ZP=ui%Ovg~++)Q$|Z2Utc;+{c~rA>;BTx;Q5T>>7YEfc(QzA|d-YAT<@yY(z1I-dP4VcSCt=HOe|6j^7pbVr(7u4> znF{FFdXQNdzpk~rW5TpIGCz!5{Lz>QaBegxr1|vntRW2{z*8@)cB~sjg6{5IUN!sk zdrjfhf^TtrBxuhJKDNNxFZcFsgDAudT7kf_zmk~oAFG@pgYPMaQLKLfom0~Ex+A1k z4HFloPTw)sCFIlh{G?Kv2GYl_jc^6BwN`aRV^wzuI&&c|ZqkYEi3 zkN3!)Nds5hNvTakNLVrFypq!vZ}>5HGnH5S@ZM~6d@ZjGV$g+uUy!2{mqzHzhspG zOtDRD!9(H7WyI;aU4-*IfJ|-`ZQAzgxD=awU~tE~YRUV;EF((5@c`8jyYa=!n4G<_ z3T*o!UKsZ+fwWzg0L23+0f!2#WGJ}ZUHiO`m+x9a#*f5Q&ngeDT)1VoU&CtN>!Goq z3NlkZoX@Za=r47S!Q~#mQiVk+Qs}e}331)=MI>d@oLUe=f}9;K6@f}ou&@X40u=Hf zl?1gKS?@*g3u%e)(B~#*Gyi;+Q~U9eJ%$4bS`>FnWgmW`ruUIL33)J-;&w>3PG`a6 zs4CsEp%T)@RgTuZ;6@>Zv{MuDk#cNEJnz2B>z}3H`3%us)5Hb!Y`x<5Ja3H`a)~f# z^{W@8Sf}6$tLL7>st)O;LrF??)pnANmp=jo4pG2PbhL)o0-j^dOa3A=6}5QeH^^_} z4)VFp%{}K;npKr~_749knBsE5Jg7GmR8lrL#YmQJd0qp7dl?I=8|FrFL;lt)MgX#E zU>Uu9);6Hv>Yg2ru%l-6LAcf7YKPK|r^#ln_GLV4t7xSSkMLVXq=S1%XFozpKcSQs z;ZxR>@>NfkPj(HL?-ogvI1@}8OQw?L3yZ8ACA3cf%Z+&M$JK&9kDMoJ?&BT%t|PTC zbuCX~|9la4cYPeP#~Z*RlVUz95NB{lXnjFmY~R%Wi|`LmvnD)KDYo587)ZTVl2ZYJ z!0|(wZ10au>pHr*r3a|dgyhS2k)&*T+DL3*fY-C)wy8M3T=ZgQpx{B2&o?<3`$tO( zoZ6_Vg)AClMKA76L;>4i@wmq(7-JQ&R|Ntg3rX~SV`ut78B{)T80F#OgmXf0q_b^! zHYlVU+tpQ_>W0`b!uzwp9t6Jv(^OM4$oQA?MoG&Iq%M@S^_lw{e=n-3T1^@+pBX>Q zc_k6?Wx>d`eEUvM&@%SS=?n<c>}Bc zpmod?_PVW`w=e)Xd*DDczCu0VpJKoA#qAW%++<`%)G(v#+$OS&JgCGRq^fJt|MN!U zcW}d#)jDZNIx+A^F$RHD7Xy&F>*FWOxrq!?ABspDqz^Xk6O}t9JzrKyj)E%-IvZZw zKsz5nNqvWSehs2NI06w-tf`_B-l4QSmBSpwYvAAWrmi>D>KJ_wF>%*^rBki-qD_djbMZVV9f{Hicg`gSL$3~Xh;{E z>2fC-%Ix5glDVW!N%t3m6|a-K8Qd&!=-o#C*<$j!ffHv@wZ-}bKY+v}Z-!52<@t1r zbJ|ww;;Nn%BGHRA9pbYP0B4jWW1EChCzb(u#HjI5H&M~hAOWcjJ%#{Ky9dY=AZqw* zAR>9VBux)Hyjj4-?>OYNU~I66VwnN-qZF7BHC)r0-M~OQlC2TO>`$5hRS7X^$DY}) z(s~o~+gd!4$HC)(CppJ+JWWjmwbjupkt47iSckm3f!gqP9hKI0MaP~_AXj|0kt_ZE zM-HbMyd0SXYiDJ3wg^jJ#h$~ScE@ReOpL?h?h>lkU#`5@-1B}1fopvXbfATibE!@A zwWar^~q@cer_6c=|m@Rr{-088moHFL<)>`0;*~ZAq?W))^D*0buW( z^&Otd>CI&8JSmE>z1oHl9fc`+Wp*gk3_KWrd=VUg7YXR%nfrgCMsd_ry&9d^ThdT! z4U(U<_g3pIq@V$+bkPzp#B(s9H_dPDP$E~j)t~%txk>C56v`RGsEKvy!&5XUN=~tk zoB@^T47t|XG3Xja`bD{7Vaz5~PSN;GK#2M4&bL5em_M*nUNMK9_|!ynUD!H7Z$m zQ@C?en?`%&^%*h`4?%|4Be&ip`z;a}e6HUqmHnQjlWMl2SAmAa6Xk6QaMjj8OkTny|*=^0UoOhe^{80IVb)8`YtV>1WdN)?o@~5D#vQ^BC+1DVj=b=Ll)iL-jvv7o6*# z0v9cRC}B8|&_3X-&z~6-S8bP|_Vd%yofUAx9uWrd(J2a<0Td|dzlaPMxj`rUqsTcU zioqVJIS(9IqB(3HffH0v9JdLR3ncO=U%Gvn;XWcA&~!`;Wjwc%44%h6+3xVbgG zyu9#iF+owPa6b;pSx6UMj_XyAM`Myh$YD0ChP$RMM}j>brN-?zP-}iYfVv$3b#}(a z#vdiUt7L;2mKP7ZRFKJ{juU$%C-8V5qGroOSD)Pyo2y*3Le2FRPI?88$6;nw6%-W6 zVNp>TcJJ{Z=b~uSk@xga&%Q@fY~~+V;Bsn}YZRO&@-BlWIKJ#2%X|ri+Jx7k|8rg6 zi0g=F;Op02n%ersBSvNG6Vc(3k=mH2rlwpMj5Q%gMRpgP=r2(0na^@7DHq_)3?m@h zaw*Ui;qJzR@XTCc7n9pO#c3#dRlVA!CCehB{bfO#n&V3EoQ} zUnFqfXe|C%eNj8@7M~vYot)~BsZ>BgG0fnUHor6#vjCrd|K!P&{pHS<2m$=xiu!V^ zclyuXu^cGLiNy=mzoKSzf>N}Bz+b(>dru)UjfwEJAfM4kVmChw_Zkjf?|5asSoH@U zeope5N3j+h3ej z?a%UdGe;>eoaJt8XegljV)+-N(EZ%1jZ7Q-veuA8BRBG;jMV#4 zpA7Ks>lm}g17jcAi748^`^_gi3oP$OPPl`<;118qbn}a)CM6{a!=};7il2cGTQLmgXAD%esHt=sUu04FGW6x(Uf6?FUxPx>g~Q&)h){^s$&hk!isDxYtm2&nDh1zylkaHQAxwZR^luHBBE9j^*axVFI4QflR6To z--UewvRZt8;TY3mTco>fyR4hi02G9*oQ4xhOGrjn1ZC;wz`IdYweh1(0j2duqWiCG zFDR493a(iFJx!pWde32Ex${aNErqJ_0v!Gek-?P}|Iq^YhZJHQIsnfu7W_-vCkdfl z)b-A)fJV+5&-IwAw6u@sUVG5fl1Zlu`0h9iIQS}Py9Z$EX?mtau8`U6DB+NJaeJ+;l_5vv_C|Qj#Yf3UCEspD5 zbw7eimnoH{;yn%@H-oLF9fhh*4cys}Ud>_fk(;=Z)cR>_KZFKw8g_InwsNfMymJV3 z2*_?}WfvRG+l5U6E3n^N9B{1vPkY}L*K`_o859LOI+jtCGNU-C11i##0AfLND0zvwoH_ptK@3*_(#a?_Dn;S?V$^ZYB z=Y7gK=Na=%r*9I!3x>u(Ob=&#J-K&o64M*pcoZ?1^T@-;2d80K5%Wq3*e#|MBAVgXEK5*3^;G8#2SxS>2||W- z#T5NQTTYt={Y3~ONv<6nK5k#Qp{n7Hz^#zIcQOAC7vNghC_a^7w0@i>8_=pq3#wHnpuBndR$El#N z&%aga92D%fV{_-iU>g#a+-4+bL9el`jLn;WU+Man{=O5lJH^?vV!OC-8B*MMY`#dmOPy3Z=eCs3Gpw>P489%MA`>(@?~2<8#p5^}De7A~htR?_0%agRNP6NdRc zvs=GmyYxpU@-BRJM~`RP4Si0Z{^EH*dp73CdgSDQBJcg{WQuK(mJAW7!v1!DiP%<7 zuAu@op;3~rabNm)J$DqgK`rcC)rYwYr3ot+hG(}jcxS@GlFnIaEu_^REq!M|SVSWfK2wA_7akXCZd^^_Jc6?2m6_C<7j)mM@)8GC6~)LW zrXT59m9!TM^CG8NjPRorPA3?_bB9I9K~<<}dd_2B>I+wSu2p0OZ2sL{No0#q_1=zLm@Kiqb|!(51X*p;q_S95+-ffOKE!s+0iwd~D~f0KDBQdu(9CvP}p3AdTsfETc@sI3Y8O4$lr z+6`SSfWUqUqUR=CW!SP^c|j^ZjCedm2>?_qg7)zo5YMkvkMf%PM6u+<{RE0>n~_;6 zVC#ojwwQN{37u`Z#9XLBDsQ@r87XdyC1--~TqGQYm}o&HuFK_FS_ zoJ~lN8jZ{3*ZeiP(M03yX8)flO!BsL$>hI=mU;Wy#vfC;OHORQ?UA7VG9Nnk5%(o# z==XE&qkZorxet7~E<8SdXT7{hQGl4Vsu{|WnsOfQ$-GY&8 zos?kl{DMp4?iIFOwKgP77m}jjdk(%UBiS<9Bl~BPE4K#32I4S<)2D9wNUJTm5~z=S zBy0E7!0I|8HW$@TT3h$pL2XVR_S2y5K^%f5yRP1h}E#yy%MyHdv zg%jR5ScoL&H5@jh?B>|+lGv(VP`a28_|&zj*4FV%t>A?M)i2Lk<9taNc`8zG_ZR1h z@?LF`On75Z?yB~?mIyhAhKjLAC?qY`o|5PM;o^kh)}hdj0Ievp^p7Su{dfBkh=y0&y?E8ofJ8uBVo(5XJ;3395q?3{ z$5;sFkjxw92GUuPNt^56c@EUh7@%IMfyAnrw{tPs+t-C2Q(dVEEkcI@J9ti-_*`oma+3;9R zZHrm02NF^g_IO=0m2m(Y$IG1N>ccf}AnD2q5kHma_r^bFka&JT95)8_2*Eq+xHq(u zz|4IOX4kjBQH58}CKCCLBZ5|E{|@vtHc24@$k=G<%Em5*_pM`14;3T_9a~2ZSEr5> zI#Rhef#9FE?zH!D`nr2=uq7-tf|ZhC)pZ~BSgoSS_870@WmVdC!q@|r0REcBo6?&1 z9Qu9GW`Kv7Cc2WcXc<;OtbP~ExOoVraLn|g+A|@u>TI&u2cTrCh^}OS*PA-vPhT%l zX5%}9z4iz@XQD6?XEr6=;zUVwkn_|(kz5+}Rq{2naAjBP^ufogDA#eW@#$?;#<@l* zy#9X*;Oy17DH3E>RC|#lHm@(U6Cmb|b2rMu*?j>OLAdP@Nj@B4M9A@ASG%y?uzcxb zJy!C;LlDDM(UnV$8*wySQa%2al|Z0uy-4H8To`{7WZ!8?_|ri1JNK0$hk#JFD_)dT z2jDJrq_I^Q{=z-1#Wvq!5d!8hXNGs_azwbmcppoiwR#DOAXeya;;_D#mscox?iw=q zAReE$i`-dHQ&hNZZ`(|fThqSft(M?ZgeMf)2e8R8JiS}0)3Qhc5n5%nhy>C{8o_OH zDbr0!X-zW*4p>>tc4sUw%b;efbdMi}`_mq@NCMJS>=r*_7Wad|Eg!Ui2;k4rcK*v6 z!FDuM3-Oc8a=~;f9$N0u%Sg-V(>Wp%p|c_Tr}`-8=p0q&=a5eP#I=SpBZqBK!AciV zW`l5S0TpuDFB{bFRQ;S~j9VA75@q8vHa1n6wHCA?f0@;9-x!gE8j#xI9DIc9lKbknhRl{+Fj_R(AP0l=Y*o&kGyqy*a*iufSgMk&ZQdxLt~D|wwAooeBXJ^S>Go;+bx z>BLMN@_wYJ5NRd#jBh^s#O3*c^OP_9Io zFMU^*ByGy&L-w{~GQ-{JrKKxUX$G&B<8DE=q4u4+?R(}$-{zs9&Q1Zx45M{B#dXfO zKRb?t=0mKIzJBW}xd{t4#ije~5*Xuy?u2A)y7dgkC zH;F3o*)9f`^4A#Dzfm5z>^6i1(-r5rYi`G)N|KsVM4IjH#0Gvbh8n}~El(}{^p<}2 zEnjEqKCGgX)ttJr8CFL*Y4Q1se%<^@dE$(438c(T7q=G>yeAH-SCihAbxm;bB z{E`l+XNATU=um6T7G*4JgLYRMC`R}Y+nl<$6}B4Xmh^Lb#U}$bEh#g8807W|=f|p4 z8zo}t-KQ1RMxl5$Xr(wg9qt0aHSd-SN7VQ_&?t#rZ_ zD9F8BRj`0;l;PJw!3^rJK6lRn&x-7VMUR+PUzruc_XzKXb207haVCOs`42@NK=*8e)%NU zpKOum5Hw(!60a4;oWotT4jY-ViKgV{M!N=RUdqIhrb=ruZF=mp6j!KWSFjJoMRkg% zw2W3CUF)%t_I&LDKp%G#bO<)s{i=}AttNi$A;I-4S{N%72CcsZVGC>?#u1h?UA0x@ ziADV6HQ*Q09+#Sh4fXl`x$o$D_MJ5AwFihZMd1nv&pD=&K=rhnmbB$Qv_hdD(~-K8 zarV6a?%?1K?+uK8S0Bx2-Lw}u#zsy`GcO}Q#T=i1$i{)V``M*w$t|QzMB!WwPQ-z_ ztzHKb9TotYXv%9&DQV;nkskN!Tj!A@9V7hFm$V`Xpzo~8(GWR zQ1;=TI(^F$-pZMnamUB1DcuKu|DoRXj4eP`>ZNNCwQv8D+OnE&YIaP!VAurH;Lm2h zn(_T!=CzlKD=g`|qo4e7lUfDL21|g!`SW#-)T^Z%Ck7cBelqi!OIK}4tz=blvIo-{ zskAv~yP;-H6jH*JCED3%vc7$@ZgK8UoQ9|Y5!Q~1j5Mr^Ihzfjbv<(Mx4aXlcI-+X z-&LcdmPgof?L~X$hT4S6dF(p<1FCfDgJ-&zcipnr%+kDU?u!&c!%UF=pVewh>f#ul zfl;0M={cI06@Oibk! zL9+X41eDC>p=eMGB77Xw8%zi!zdqg{;_ibOHi4M#uC6|kD?hn2B+_ZDOR$-#m2uKX z)x#(f7#a7M{#&`DikhOEB8Zk6_v>=nP`%x*fM7Gv=zu2QLLER)lbrRg=%@B?REZDl z6}!~D-fS_=yVS(EyU0TE8IOeJGXbTbKP+6Nc&_T}_kG-*T&E=7GA`pM1D(Wk=gvhM z)kfF1ivRJR3;NiVOULu3Aj3YW_#IV=ItWnAZPB37-h@n4l$NSmTfe?ht~K_W#JY75 z>ly#X%ke|b6VA&DVVE+ia0CAjKu;@NyxP_f$aEzsi~7 zZP#oDUClEXLLH${U)0SnZnl8_!+wz#)o8`W?#X>_R%Lo$aoq!B`=X+vm@zZ{LIGFl z>qWp|!_2K#fwwvR#{ryTVBMtY&r}|(Gj8%S`=pitrR-^%YZA^LU!OWH|JADWCns}x zUSh^luavA-Q&-kZ3}Z@I;ZAMh7|*^b~!X# zdC47H4O|jIaYAaV4kb_=ErQ9*Td?&-Z`Cyn?@^(hyahmKr|99|3+=e}y(_N(a6Itw zEHM3FlcgKVLg^uEp@*;UhKudVy<$ojO& zz#IDip&aDwm%OY2D)=?fJB>zn4A1)AS6eq9$Xnr){-f0c+wDNebSk_O{!!j3P#+hA zzJch7w@~(b+Wg=3oq%0A$8QWvdvyil!;W=P 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%0DNdsv-YXn^ScC!Uzzx4?n5!gh&CqbM-?8cy1!(BM ze)p`@d>y2Y^S5xc*Voc`$GqQF-u!jdgmD<&!m#nz${9B);hUj+qQB8o8q;oBXgzKK zht7o*<^>Oc$Uq!|{li+Ugc-LGLf#&gOY|Q@xEYWW4Gcb+ z+7vLbb9Zj#dV67TJ_Zm*$K9dx@OHBW)$4D_{$+bl!Q=gf$K%RsTZP`oH5q8x%{yYV zgl&h|uU*qP+~4j8R%N!t7UcZy_R?=&itJvTje1GLn~<7dzbO4v+D2 za3{0!Q?L2-^@0i)2!Z@GP~~}VyqtT_k0uf{Z!5$C^YX5WO5a%E@;>h0s(L z!%ttM8Smb{9ki6iFJrPg{zb@2$JMnQaD?#i@H7afFYUaIojPE{bj@%0AXyf%oCSeV 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 Date: Sun, 23 Nov 2025 13:41:53 +0300 Subject: [PATCH 55/57] [OTHER] Revert .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 52716c9406..5de0996c8b 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,3 @@ CMakeSettings.json .cache install *.pyc -ppc-2025-processes-informatics.code-workspace From 1c7f40fa1f8e588c78fc8c27c98f9f70377f2363 Mon Sep 17 00:00:00 2001 From: K Date: Sun, 23 Nov 2025 22:51:23 +0300 Subject: [PATCH 56/57] [STYLE] Sudden style errors fix --- .../common/include/common.hpp | 2 -- .../mpi/src/ops_mpi.cpp | 4 +--- .../seq/src/ops_seq.cpp | 10 ++++------ .../tests/functional/main.cpp | 17 ++++++----------- .../tests/performance/main.cpp | 15 +++++++-------- 5 files changed, 18 insertions(+), 30 deletions(-) diff --git a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp index 0420e2af4a..7fc2dcf13c 100644 --- a/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp +++ b/tasks/kutuzov_i_elem_vec_average/common/include/common.hpp @@ -1,8 +1,6 @@ #pragma once #include -#include -#include #include #include "task/include/task.hpp" diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index cefe4ea04d..ec2cfa5ac2 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -3,11 +3,9 @@ #include #include -#include #include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" -#include "util/include/util.hpp" namespace kutuzov_i_elem_vec_average { @@ -52,7 +50,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { // If batch size isn't negative: Scatter the data among processes, // sum it and reduce back to the process-0 if (batch_size > 0) { - double *local_buffer = new double[batch_size]; + auto local_buffer = new double[batch_size]; MPI_Scatter(GetInput().data(), batch_size, MPI_DOUBLE, local_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0; diff --git a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp index c89ddfe8a4..8a567b7d76 100644 --- a/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp +++ b/tasks/kutuzov_i_elem_vec_average/seq/src/ops_seq.cpp @@ -1,10 +1,8 @@ #include "kutuzov_i_elem_vec_average/seq/include/ops_seq.hpp" -#include #include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" -#include "util/include/util.hpp" namespace kutuzov_i_elem_vec_average { @@ -15,7 +13,7 @@ KutuzovIElemVecAverageSEQ::KutuzovIElemVecAverageSEQ(const InType &in) { } bool KutuzovIElemVecAverageSEQ::ValidationImpl() { - return GetInput().size() > 0; + return !GetInput().empty(); } bool KutuzovIElemVecAverageSEQ::PreProcessingImpl() { @@ -24,11 +22,11 @@ bool KutuzovIElemVecAverageSEQ::PreProcessingImpl() { bool KutuzovIElemVecAverageSEQ::RunImpl() { GetOutput() = 0.0; - for (size_t i = 0; i < GetInput().size(); i++) { - GetOutput() += GetInput()[i]; + for (double x : GetInput()) { + GetOutput() += x; } - GetOutput() /= GetInput().size(); + GetOutput() /= static_cast(GetInput().size()); return true; } diff --git a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp index 872591e53f..2767309543 100644 --- a/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp +++ b/tasks/kutuzov_i_elem_vec_average/tests/functional/main.cpp @@ -1,16 +1,11 @@ #include #include -#include #include #include #include -#include -#include -#include #include #include -#include #include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" @@ -32,18 +27,18 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); input_data_ = std::vector(param, 0.0); - answer = 0.0; + answer_ = 0.0; int num = static_cast(param); for (int i = 0; i < num; i++) { - double value = static_cast(i * i) - static_cast(param) / 2.0; + double value = static_cast(i * i) - (static_cast(param) / 2.0); input_data_[i] = value; - answer += value; + answer_ += value; } - answer /= static_cast(param); + answer_ /= static_cast(param); } bool CheckTestOutputData(OutType &output_data) final { - bool result = abs(output_data - answer) < 0.0001; + bool result = abs(output_data - answer_) < 0.0001; return result; } @@ -54,7 +49,7 @@ class KutuzovIElemVecAverageFuncTests : public ppc::util::BaseRunFuncTests #include -#include #include #include "kutuzov_i_elem_vec_average/common/include/common.hpp" @@ -13,23 +12,23 @@ namespace kutuzov_i_elem_vec_average { class KutuzovIElemVecAveragePerfTests : public ppc::util::BaseRunPerfTests { const int kCount_ = 50000000; - InType input_data_{}; - double answer = 0.0; + InType input_data_; + double answer_ = 0.0; void SetUp() override { input_data_ = std::vector(kCount_, 0.0); - answer = 0.0; + answer_ = 0.0; for (int i = 0; i < kCount_; i++) { - double value = static_cast(i * i) - static_cast(kCount_) / 2.0; + double value = static_cast(i * i) - (static_cast(kCount_) / 2.0); input_data_[i] = value; - answer += value; + answer_ += value; } - answer /= static_cast(kCount_); + answer_ /= static_cast(kCount_); } bool CheckTestOutputData(OutType &output_data) final { - bool result = abs(output_data - answer) < abs(answer * 0.0001); + bool result = abs(output_data - answer_) < abs(answer_ * 0.0001); return result; } From 8bc7ff61b47b41330e9d9ace332c33f6f5df81b9 Mon Sep 17 00:00:00 2001 From: K Date: Sun, 23 Nov 2025 23:24:42 +0300 Subject: [PATCH 57/57] [STYLE] Changed auto to auto * --- tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp index ec2cfa5ac2..cbea0ed934 100644 --- a/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp +++ b/tasks/kutuzov_i_elem_vec_average/mpi/src/ops_mpi.cpp @@ -50,7 +50,7 @@ bool KutuzovIElemVecAverageMPI::RunImpl() { // If batch size isn't negative: Scatter the data among processes, // sum it and reduce back to the process-0 if (batch_size > 0) { - auto local_buffer = new double[batch_size]; + auto *local_buffer = new double[batch_size]; MPI_Scatter(GetInput().data(), batch_size, MPI_DOUBLE, local_buffer, batch_size, MPI_DOUBLE, 0, MPI_COMM_WORLD); double sum = 0.0;