From cc707cae835262e2ae575366e17397c950bd33d0 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Fri, 24 Oct 2025 21:52:13 +0300 Subject: [PATCH 01/28] add str_order_check_task --- .../common/include/common.hpp | 15 ++++ .../smyshlaev_a_str_order_check/data/pic.jpg | Bin 0 -> 15356 bytes tasks/smyshlaev_a_str_order_check/info.json | 9 ++ .../mpi/include/ops_mpi.hpp | 22 +++++ .../mpi/src/ops_mpi.cpp | 72 +++++++++++++++ tasks/smyshlaev_a_str_order_check/report.md | 0 .../seq/include/ops_seq.hpp | 22 +++++ .../seq/src/ops_seq.cpp | 60 +++++++++++++ .../smyshlaev_a_str_order_check/settings.json | 7 ++ .../tests/.clang-tidy | 13 +++ .../tests/functional/main.cpp | 85 ++++++++++++++++++ .../tests/performance/main.cpp | 40 +++++++++ 12 files changed, 345 insertions(+) create mode 100644 tasks/smyshlaev_a_str_order_check/common/include/common.hpp create mode 100644 tasks/smyshlaev_a_str_order_check/data/pic.jpg create mode 100644 tasks/smyshlaev_a_str_order_check/info.json create mode 100644 tasks/smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp create mode 100644 tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp create mode 100644 tasks/smyshlaev_a_str_order_check/report.md create mode 100644 tasks/smyshlaev_a_str_order_check/seq/include/ops_seq.hpp create mode 100644 tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp create mode 100644 tasks/smyshlaev_a_str_order_check/settings.json create mode 100644 tasks/smyshlaev_a_str_order_check/tests/.clang-tidy create mode 100644 tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp create mode 100644 tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp diff --git a/tasks/smyshlaev_a_str_order_check/common/include/common.hpp b/tasks/smyshlaev_a_str_order_check/common/include/common.hpp new file mode 100644 index 0000000000..12486deada --- /dev/null +++ b/tasks/smyshlaev_a_str_order_check/common/include/common.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include "task/include/task.hpp" + +namespace smyshlaev_a_str_order_check { + +using InType = int; +using OutType = int; +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/data/pic.jpg b/tasks/smyshlaev_a_str_order_check/data/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34458023494a39d66880a98aa5dcad18eb14b249 GIT binary patch literal 15356 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 + +#include +#include + +#include "smyshlaev_a_str_order_check/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace smyshlaev_a_str_order_check { + +SmyshlaevAStrOrderCheckMPI::SmyshlaevAStrOrderCheckMPI(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool SmyshlaevAStrOrderCheckMPI::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool SmyshlaevAStrOrderCheckMPI::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool SmyshlaevAStrOrderCheckMPI::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 SmyshlaevAStrOrderCheckMPI::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/report.md b/tasks/smyshlaev_a_str_order_check/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/smyshlaev_a_str_order_check/seq/include/ops_seq.hpp b/tasks/smyshlaev_a_str_order_check/seq/include/ops_seq.hpp new file mode 100644 index 0000000000..82f062182c --- /dev/null +++ b/tasks/smyshlaev_a_str_order_check/seq/include/ops_seq.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "smyshlaev_a_str_order_check/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace smyshlaev_a_str_order_check { + +class SmyshlaevAStrOrderCheckSEQ : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSEQ; + } + explicit SmyshlaevAStrOrderCheckSEQ(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp b/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp new file mode 100644 index 0000000000..96edc376d1 --- /dev/null +++ b/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp @@ -0,0 +1,60 @@ +#include "smyshlaev_a_str_order_check/seq/include/ops_seq.hpp" + +#include +#include + +#include "smyshlaev_a_str_order_check/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace smyshlaev_a_str_order_check { + +SmyshlaevAStrOrderCheckSEQ::SmyshlaevAStrOrderCheckSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool SmyshlaevAStrOrderCheckSEQ::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool SmyshlaevAStrOrderCheckSEQ::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool SmyshlaevAStrOrderCheckSEQ::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 SmyshlaevAStrOrderCheckSEQ::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/settings.json b/tasks/smyshlaev_a_str_order_check/settings.json new file mode 100644 index 0000000000..b1a0d52574 --- /dev/null +++ b/tasks/smyshlaev_a_str_order_check/settings.json @@ -0,0 +1,7 @@ +{ + "tasks_type": "processes", + "tasks": { + "mpi": "enabled", + "seq": "enabled" + } +} diff --git a/tasks/smyshlaev_a_str_order_check/tests/.clang-tidy b/tasks/smyshlaev_a_str_order_check/tests/.clang-tidy new file mode 100644 index 0000000000..ef43b7aa8a --- /dev/null +++ b/tasks/smyshlaev_a_str_order_check/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/smyshlaev_a_str_order_check/tests/functional/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp new file mode 100644 index 0000000000..f7779e9d76 --- /dev/null +++ b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp @@ -0,0 +1,85 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "smyshlaev_a_str_order_check/common/include/common.hpp" +#include "smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp" +#include "smyshlaev_a_str_order_check/seq/include/ops_seq.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace smyshlaev_a_str_order_check { + +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 + { + std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_smyshlaev_a_str_order_check, "pic.jpg"); + auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, 0); + if (data == nullptr) { + throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); + } + 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_smyshlaev_a_str_order_check), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_str_order_check)); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kPerfTestName = NesterovARunFuncTestsProcesses::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp new file mode 100644 index 0000000000..5433b87883 --- /dev/null +++ b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp @@ -0,0 +1,40 @@ +#include + +#include "smyshlaev_a_str_order_check/common/include/common.hpp" +#include "smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp" +#include "smyshlaev_a_str_order_check/seq/include/ops_seq.hpp" +#include "util/include/perf_test_util.hpp" + +namespace smyshlaev_a_str_order_check { + +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_smyshlaev_a_str_order_check); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = ExampleRunPerfTestProcesses::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses, kGtestValues, kPerfTestName); + +} // namespace smyshlaev_a_str_order_check From 04f5956dc7d00e7c02ff06947b576ce18895adfc Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Thu, 6 Nov 2025 18:53:48 +0300 Subject: [PATCH 02/28] mpi&seq --- .../common/include/common.hpp | 4 +- .../mpi/src/ops_mpi.cpp | 157 +++++++++++++----- .../seq/src/ops_seq.cpp | 71 ++++---- 3 files changed, 152 insertions(+), 80 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/common/include/common.hpp b/tasks/smyshlaev_a_str_order_check/common/include/common.hpp index 12486deada..519726bec8 100644 --- a/tasks/smyshlaev_a_str_order_check/common/include/common.hpp +++ b/tasks/smyshlaev_a_str_order_check/common/include/common.hpp @@ -7,9 +7,9 @@ namespace smyshlaev_a_str_order_check { -using InType = int; +using InType = std::pair; using OutType = int; -using TestType = std::tuple; +using TestType = std::tuple; using BaseTask = ppc::task::Task; } // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index 9043543ed0..69b18ed2bc 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -2,71 +2,144 @@ #include -#include -#include +#include +#include #include "smyshlaev_a_str_order_check/common/include/common.hpp" -#include "util/include/util.hpp" namespace smyshlaev_a_str_order_check { SmyshlaevAStrOrderCheckMPI::SmyshlaevAStrOrderCheckMPI(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; } bool SmyshlaevAStrOrderCheckMPI::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); + return true; } bool SmyshlaevAStrOrderCheckMPI::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; + return true; } bool SmyshlaevAStrOrderCheckMPI::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); + const auto& input_data = GetInput(); + const std::string &str1 = input_data.first; + const std::string &str2 = input_data.second; - if (rank == 0) { - GetOutput() /= num_threads; - } else { - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; + if (str1.empty() && str2.empty()) { + GetOutput() = 0; + return true; } - if (counter != 0) { - GetOutput() /= counter; + int rank = 0; + int size = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + int local_result = 0; + int global_result = 0; + + size_t min_len = std::min(str1.length(), str2.length()); + + if (rank == 0) { + if (min_len == 0) { + if (str1.length() < str2.length()) { + global_result = -1; + } else if (str1.length() > str2.length()) { + global_result = 1; + } else { + global_result = 0; + } + } + + else { + size_t chunk_size = min_len / size; + size_t remainder = min_len % size; + + for (int i = 0; i < size; ++i) { + size_t start_idx = i * chunk_size + std::min((size_t)i, remainder); + size_t current_chunk_size = chunk_size + (i < remainder ? 1 : 0); + + if (i != 0) { + MPI_Send(&start_idx, 1, MPI_UNSIGNED_LONG, i, 1, MPI_COMM_WORLD); + MPI_Send(¤t_chunk_size, 1, MPI_UNSIGNED_LONG, i, 2, MPI_COMM_WORLD); + MPI_Send(str1.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 3, MPI_COMM_WORLD); + MPI_Send(str2.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 4, MPI_COMM_WORLD); + } else { + local_result = 0; + for (size_t k = 0; k < current_chunk_size; ++k) { + if (str1[start_idx + k] < str2[start_idx + k]) { + local_result = -1; + break; + } + if (str1[start_idx + k] > str2[start_idx + k]) { + local_result = 1; + break; + } + } + } + } + + global_result = local_result; + + for (int i = 1; i < size; ++i) { + int worker_result; + MPI_Recv(&worker_result, 1, MPI_INT, i, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + + if (global_result == 0 && worker_result != 0) { + global_result = worker_result; + } + } + + if (global_result == 0) { + if (str1.length() < str2.length()) { + global_result = -1; + } else if (str1.length() > str2.length()) { + global_result = 1; + } + } + } + + GetOutput() = global_result; + + } else { + size_t start_idx = 0; + size_t current_chunk_size = 0; + + MPI_Recv(&start_idx, 1, MPI_UNSIGNED_LONG, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + MPI_Recv(¤t_chunk_size, 1, MPI_UNSIGNED_LONG, 0, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + + if (current_chunk_size > 0) { + std::string sub_str1(current_chunk_size, '\0'); + std::string sub_str2(current_chunk_size, '\0'); + + MPI_Recv(&sub_str1[0], current_chunk_size, MPI_CHAR, 0, 3, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + MPI_Recv(&sub_str2[0], current_chunk_size, MPI_CHAR, 0, 4, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + + for (size_t k = 0; k < current_chunk_size; ++k) { + if (sub_str1[k] < sub_str2[k]) { + local_result = -1; + break; + } + if (sub_str1[k] > sub_str2[k]) { + local_result = 1; + break; + } + } + } + + MPI_Send(&local_result, 1, MPI_INT, 0, 5, MPI_COMM_WORLD); } - } - MPI_Barrier(MPI_COMM_WORLD); - return GetOutput() > 0; + MPI_Barrier(MPI_COMM_WORLD); + return true; } bool SmyshlaevAStrOrderCheckMPI::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; + return true; } -} // namespace smyshlaev_a_str_order_check +} // namespace smyshlaev_a_str_order_check \ No newline at end of file diff --git a/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp b/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp index 96edc376d1..e92f386e41 100644 --- a/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp +++ b/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp @@ -1,60 +1,59 @@ #include "smyshlaev_a_str_order_check/seq/include/ops_seq.hpp" -#include -#include +#include +#include +#include #include "smyshlaev_a_str_order_check/common/include/common.hpp" -#include "util/include/util.hpp" namespace smyshlaev_a_str_order_check { -SmyshlaevAStrOrderCheckSEQ::SmyshlaevAStrOrderCheckSEQ(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; +SmyshlaevAStrOrderCheckSEQ::SmyshlaevAStrOrderCheckSEQ(const InType& in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; } bool SmyshlaevAStrOrderCheckSEQ::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); + return true; } bool SmyshlaevAStrOrderCheckSEQ::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; + return true; } bool SmyshlaevAStrOrderCheckSEQ::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 auto& input_data = GetInput(); + + const std::string& str1 = input_data.first; + const std::string& str2 = input_data.second; + + size_t min_len = std::min(str1.length(), str2.length()); + + for (size_t i = 0; i < min_len; ++i) { + if (str1[i] < str2[i]) { + GetOutput() = -1; + return true; + } + if (str1[i] > str2[i]) { + GetOutput() = 1; + return true; + } } - } - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } + if (str1.length() < str2.length()) { + GetOutput() = -1; + } else if (str1.length() > str2.length()) { + GetOutput() = 1; + } else { + GetOutput() = 0; + } - if (counter != 0) { - GetOutput() /= counter; - } - return GetOutput() > 0; + return true; } bool SmyshlaevAStrOrderCheckSEQ::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; + return true; } -} // namespace smyshlaev_a_str_order_check +} // namespace smyshlaev_a_str_order_check \ No newline at end of file From 13e5e5305b732e22116d0434beec293bb8ac2282 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Thu, 6 Nov 2025 19:12:02 +0300 Subject: [PATCH 03/28] add tests --- .../tests/functional/main.cpp | 59 ++++++++----------- .../tests/performance/main.cpp | 33 ++++++----- 2 files changed, 41 insertions(+), 51 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp index f7779e9d76..07b79ce4ad 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp @@ -1,5 +1,4 @@ #include -#include #include #include @@ -20,55 +19,42 @@ namespace smyshlaev_a_str_order_check { -class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests { +class SmyshlaevAStrOrderCheckRunFuncTestsProcesses : 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); + const auto &input = std::get<0>(test_param); + const auto &expected = std::get<1>(test_param); + return input.first + "_" + input.second + "_expect_" + std::to_string(expected); } protected: void SetUp() override { - int width = -1; - int height = -1; - int channels = -1; - std::vector img; - // Read image - { - std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_smyshlaev_a_str_order_check, "pic.jpg"); - auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, 0); - if (data == nullptr) { - throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); - } - 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); + input_data_ = std::get<0>(params); + expected_output_ = std::get<1>(params); } - InType GetTestInputData() final { - return input_data_; - } + bool CheckTestOutputData(OutType &output_data) final { return (expected_output_ == output_data); } + + InType GetTestInputData() final { return input_data_; } private: - InType input_data_ = 0; + InType input_data_; + OutType expected_output_ = 0; }; namespace { -TEST_P(NesterovARunFuncTestsProcesses, MatmulFromPic) { - ExecuteTest(GetParam()); -} +TEST_P(SmyshlaevAStrOrderCheckRunFuncTestsProcesses, StringOrderCheckTest) { ExecuteTest(GetParam()); } -const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; +const std::array kTestParam = { + std::make_tuple(std::make_pair("apple", "apple"), 0), + std::make_tuple(std::make_pair("apple", "banana"), -1), + std::make_tuple(std::make_pair("zebra", "yak"), 1), + std::make_tuple(std::make_pair("cat", "caterpillar"), -1), + std::make_tuple(std::make_pair("caterpillar", "cat"), 1), + std::make_tuple(std::make_pair("Zebra", "zebra"), -1)}; const auto kTestTasksList = std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_str_order_check), @@ -76,10 +62,11 @@ const auto kTestTasksList = const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); -const auto kPerfTestName = NesterovARunFuncTestsProcesses::PrintFuncTestName; +const auto kPerfTestName = + SmyshlaevAStrOrderCheckRunFuncTestsProcesses::PrintFuncTestName; -INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses, kGtestValues, kPerfTestName); +INSTANTIATE_TEST_SUITE_P(StringOrderCheckTests, SmyshlaevAStrOrderCheckRunFuncTestsProcesses, kGtestValues, kPerfTestName); } // namespace -} // namespace smyshlaev_a_str_order_check +} // namespace smyshlaev_a_str_order_check \ No newline at end of file diff --git a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp index 5433b87883..68bece344e 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp @@ -1,5 +1,8 @@ #include +#include +#include + #include "smyshlaev_a_str_order_check/common/include/common.hpp" #include "smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp" #include "smyshlaev_a_str_order_check/seq/include/ops_seq.hpp" @@ -7,34 +10,34 @@ namespace smyshlaev_a_str_order_check { -class ExampleRunPerfTestProcesses : public ppc::util::BaseRunPerfTests { - const int kCount_ = 100; +const size_t kStringLength = 1000000; + +class SmyshlaevAStrOrderCheckRunPerfTestsProcesses : public ppc::util::BaseRunPerfTests { + private: + const OutType kExpectedResult_ = 0; InType input_data_{}; void SetUp() override { - input_data_ = kCount_; - } + std::string long_str_A(kStringLength, 'a'); + std::string long_str_B = long_str_A; - bool CheckTestOutputData(OutType &output_data) final { - return input_data_ == output_data; + input_data_ = std::make_pair(long_str_A, long_str_B); } - InType GetTestInputData() final { - return input_data_; - } + bool CheckTestOutputData(OutType &output_data) final { return kExpectedResult_ == output_data; } + + InType GetTestInputData() final { return input_data_; } }; -TEST_P(ExampleRunPerfTestProcesses, RunPerfModes) { - ExecuteTest(GetParam()); -} +TEST_P(SmyshlaevAStrOrderCheckRunPerfTestsProcesses, RunPerfModes) { ExecuteTest(GetParam()); } const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks(PPC_SETTINGS_smyshlaev_a_str_order_check); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); -const auto kPerfTestName = ExampleRunPerfTestProcesses::CustomPerfTestName; +const auto kPerfTestName = SmyshlaevAStrOrderCheckRunPerfTestsProcesses::CustomPerfTestName; -INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses, kGtestValues, kPerfTestName); +INSTANTIATE_TEST_SUITE_P(RunModeTests, SmyshlaevAStrOrderCheckRunPerfTestsProcesses, kGtestValues, kPerfTestName); -} // namespace smyshlaev_a_str_order_check +} // namespace smyshlaev_a_str_order_check \ No newline at end of file From b0a85da1074d60405da79f3e5c406c54e95f3b57 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Thu, 6 Nov 2025 19:16:36 +0300 Subject: [PATCH 04/28] fix test_type --- .../tests/functional/main.cpp | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp index 07b79ce4ad..0add091bd0 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp @@ -22,17 +22,18 @@ namespace smyshlaev_a_str_order_check { class SmyshlaevAStrOrderCheckRunFuncTestsProcesses : public ppc::util::BaseRunFuncTests { public: static std::string PrintTestParam(const TestType &test_param) { - const auto &input = std::get<0>(test_param); - const auto &expected = std::get<1>(test_param); - return input.first + "_" + input.second + "_expect_" + std::to_string(expected); + const auto &strA = std::get<0>(test_param); + const auto &strB = std::get<1>(test_param); + const auto &expected = std::get<2>(test_param); + return strA + "_" + strB + "_expect_" + std::to_string(expected); } protected: void SetUp() override { TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - input_data_ = std::get<0>(params); - expected_output_ = std::get<1>(params); + input_data_ = std::make_pair(std::get<0>(params), std::get<1>(params)); + expected_output_ = std::get<2>(params); } bool CheckTestOutputData(OutType &output_data) final { return (expected_output_ == output_data); } @@ -49,12 +50,12 @@ namespace { TEST_P(SmyshlaevAStrOrderCheckRunFuncTestsProcesses, StringOrderCheckTest) { ExecuteTest(GetParam()); } const std::array kTestParam = { - std::make_tuple(std::make_pair("apple", "apple"), 0), - std::make_tuple(std::make_pair("apple", "banana"), -1), - std::make_tuple(std::make_pair("zebra", "yak"), 1), - std::make_tuple(std::make_pair("cat", "caterpillar"), -1), - std::make_tuple(std::make_pair("caterpillar", "cat"), 1), - std::make_tuple(std::make_pair("Zebra", "zebra"), -1)}; + std::make_tuple(std::string("apple"), std::string("apple"), 0), + std::make_tuple(std::string("apple"), std::string("banana"), -1), + std::make_tuple(std::string("zebra"), std::string("yak"), 1), + std::make_tuple(std::string("cat"), std::string("caterpillar"), -1), + std::make_tuple(std::string("caterpillar"), std::string("cat"), 1), + std::make_tuple(std::string("Zebra"), std::string("zebra"), -1)}; const auto kTestTasksList = std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_str_order_check), From 71195d6378f7c2132d09581124597b5d50e86a66 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Thu, 6 Nov 2025 19:54:40 +0300 Subject: [PATCH 05/28] report --- tasks/smyshlaev_a_str_order_check/report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks/smyshlaev_a_str_order_check/report.md b/tasks/smyshlaev_a_str_order_check/report.md index e69de29bb2..afb26e37c8 100644 --- a/tasks/smyshlaev_a_str_order_check/report.md +++ b/tasks/smyshlaev_a_str_order_check/report.md @@ -0,0 +1 @@ +отчет From a12eb15992659759dcad048ce2773d882d1873de Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 15:13:12 +0300 Subject: [PATCH 06/28] fix type error --- tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index 69b18ed2bc..3aa433cd3e 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -59,7 +59,7 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { size_t chunk_size = min_len / size; size_t remainder = min_len % size; - for (int i = 0; i < size; ++i) { + for (size_t i = 0; i < size; ++i) { size_t start_idx = i * chunk_size + std::min((size_t)i, remainder); size_t current_chunk_size = chunk_size + (i < remainder ? 1 : 0); From f2ca18136820981c5b54ffe005ce9c87c980f2cd Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 15:18:43 +0300 Subject: [PATCH 07/28] fix type error --- tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index 3aa433cd3e..d430814a9b 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -35,7 +35,7 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { } int rank = 0; - int size = 0; + size_t size = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); @@ -85,7 +85,7 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { global_result = local_result; - for (int i = 1; i < size; ++i) { + for (size_t i = 1; i < size; ++i) { int worker_result; MPI_Recv(&worker_result, 1, MPI_INT, i, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); From b44e79ee512531ae4c36f1aed9ffe48a80147e26 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 15:27:43 +0300 Subject: [PATCH 08/28] fix size_t error --- .../mpi/src/ops_mpi.cpp | 24 +++++++++---------- .../seq/src/ops_seq.cpp | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index d430814a9b..03b04f9426 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -35,14 +35,14 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { } int rank = 0; - size_t size = 0; + int size = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); int local_result = 0; int global_result = 0; - size_t min_len = std::min(str1.length(), str2.length()); + int min_len = std::min(str1.length(), str2.length()); if (rank == 0) { if (min_len == 0) { @@ -56,12 +56,12 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { } else { - size_t chunk_size = min_len / size; - size_t remainder = min_len % size; + int chunk_size = min_len / size; + int remainder = min_len % size; - for (size_t i = 0; i < size; ++i) { - size_t start_idx = i * chunk_size + std::min((size_t)i, remainder); - size_t current_chunk_size = chunk_size + (i < remainder ? 1 : 0); + for (int i = 0; i < size; ++i) { + int start_idx = i * chunk_size + std::min((int)i, remainder); + int current_chunk_size = chunk_size + (i < remainder ? 1 : 0); if (i != 0) { MPI_Send(&start_idx, 1, MPI_UNSIGNED_LONG, i, 1, MPI_COMM_WORLD); @@ -70,7 +70,7 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { MPI_Send(str2.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 4, MPI_COMM_WORLD); } else { local_result = 0; - for (size_t k = 0; k < current_chunk_size; ++k) { + for (int k = 0; k < current_chunk_size; ++k) { if (str1[start_idx + k] < str2[start_idx + k]) { local_result = -1; break; @@ -85,7 +85,7 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { global_result = local_result; - for (size_t i = 1; i < size; ++i) { + for (int i = 1; i < size; ++i) { int worker_result; MPI_Recv(&worker_result, 1, MPI_INT, i, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); @@ -106,8 +106,8 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { GetOutput() = global_result; } else { - size_t start_idx = 0; - size_t current_chunk_size = 0; + int start_idx = 0; + int current_chunk_size = 0; MPI_Recv(&start_idx, 1, MPI_UNSIGNED_LONG, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(¤t_chunk_size, 1, MPI_UNSIGNED_LONG, 0, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); @@ -119,7 +119,7 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { MPI_Recv(&sub_str1[0], current_chunk_size, MPI_CHAR, 0, 3, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&sub_str2[0], current_chunk_size, MPI_CHAR, 0, 4, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - for (size_t k = 0; k < current_chunk_size; ++k) { + for (int k = 0; k < current_chunk_size; ++k) { if (sub_str1[k] < sub_str2[k]) { local_result = -1; break; diff --git a/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp b/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp index e92f386e41..c73757f592 100644 --- a/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp +++ b/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp @@ -28,9 +28,9 @@ bool SmyshlaevAStrOrderCheckSEQ::RunImpl() { const std::string& str1 = input_data.first; const std::string& str2 = input_data.second; - size_t min_len = std::min(str1.length(), str2.length()); + int min_len = std::min(str1.length(), str2.length()); - for (size_t i = 0; i < min_len; ++i) { + for (int i = 0; i < min_len; ++i) { if (str1[i] < str2[i]) { GetOutput() = -1; return true; From fcb902faf62df95eb492170ae7bc408d085f5076 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 15:48:38 +0300 Subject: [PATCH 09/28] clang --- .../mpi/src/ops_mpi.cpp | 199 +++++++++--------- .../seq/src/ops_seq.cpp | 64 +++--- .../tests/functional/main.cpp | 36 ++-- .../tests/performance/main.cpp | 18 +- 4 files changed, 164 insertions(+), 153 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index 03b04f9426..f005bc6ca9 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -10,136 +10,135 @@ namespace smyshlaev_a_str_order_check { SmyshlaevAStrOrderCheckMPI::SmyshlaevAStrOrderCheckMPI(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; } bool SmyshlaevAStrOrderCheckMPI::ValidationImpl() { - return true; + return true; } bool SmyshlaevAStrOrderCheckMPI::PreProcessingImpl() { - return true; + return true; } bool SmyshlaevAStrOrderCheckMPI::RunImpl() { + const auto &input_data = GetInput(); + const std::string &str1 = input_data.first; + const std::string &str2 = input_data.second; - const auto& input_data = GetInput(); - const std::string &str1 = input_data.first; - const std::string &str2 = input_data.second; - - if (str1.empty() && str2.empty()) { - GetOutput() = 0; - return true; + if (str1.empty() && str2.empty()) { + GetOutput() = 0; + return true; + } + + int rank = 0; + int size = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + int local_result = 0; + int global_result = 0; + + int min_len = std::min(str1.length(), str2.length()); + + if (rank == 0) { + if (min_len == 0) { + if (str1.length() < str2.length()) { + global_result = -1; + } else if (str1.length() > str2.length()) { + global_result = 1; + } else { + global_result = 0; + } } - int rank = 0; - int size = 0; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - int local_result = 0; - int global_result = 0; - - int min_len = std::min(str1.length(), str2.length()); - - if (rank == 0) { - if (min_len == 0) { - if (str1.length() < str2.length()) { - global_result = -1; - } else if (str1.length() > str2.length()) { - global_result = 1; - } else { - global_result = 0; + else { + int chunk_size = min_len / size; + int remainder = min_len % size; + + for (int i = 0; i < size; ++i) { + int start_idx = i * chunk_size + std::min((int)i, remainder); + int current_chunk_size = chunk_size + (i < remainder ? 1 : 0); + + if (i != 0) { + MPI_Send(&start_idx, 1, MPI_UNSIGNED_LONG, i, 1, MPI_COMM_WORLD); + MPI_Send(¤t_chunk_size, 1, MPI_UNSIGNED_LONG, i, 2, MPI_COMM_WORLD); + MPI_Send(str1.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 3, MPI_COMM_WORLD); + MPI_Send(str2.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 4, MPI_COMM_WORLD); + } else { + local_result = 0; + for (int k = 0; k < current_chunk_size; ++k) { + if (str1[start_idx + k] < str2[start_idx + k]) { + local_result = -1; + break; } - } - - else { - int chunk_size = min_len / size; - int remainder = min_len % size; - - for (int i = 0; i < size; ++i) { - int start_idx = i * chunk_size + std::min((int)i, remainder); - int current_chunk_size = chunk_size + (i < remainder ? 1 : 0); - - if (i != 0) { - MPI_Send(&start_idx, 1, MPI_UNSIGNED_LONG, i, 1, MPI_COMM_WORLD); - MPI_Send(¤t_chunk_size, 1, MPI_UNSIGNED_LONG, i, 2, MPI_COMM_WORLD); - MPI_Send(str1.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 3, MPI_COMM_WORLD); - MPI_Send(str2.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 4, MPI_COMM_WORLD); - } else { - local_result = 0; - for (int k = 0; k < current_chunk_size; ++k) { - if (str1[start_idx + k] < str2[start_idx + k]) { - local_result = -1; - break; - } - if (str1[start_idx + k] > str2[start_idx + k]) { - local_result = 1; - break; - } - } - } + if (str1[start_idx + k] > str2[start_idx + k]) { + local_result = 1; + break; } + } + } + } - global_result = local_result; + global_result = local_result; - for (int i = 1; i < size; ++i) { - int worker_result; - MPI_Recv(&worker_result, 1, MPI_INT, i, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + for (int i = 1; i < size; ++i) { + int worker_result; + MPI_Recv(&worker_result, 1, MPI_INT, i, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - if (global_result == 0 && worker_result != 0) { - global_result = worker_result; - } - } + if (global_result == 0 && worker_result != 0) { + global_result = worker_result; + } + } - if (global_result == 0) { - if (str1.length() < str2.length()) { - global_result = -1; - } else if (str1.length() > str2.length()) { - global_result = 1; - } - } + if (global_result == 0) { + if (str1.length() < str2.length()) { + global_result = -1; + } else if (str1.length() > str2.length()) { + global_result = 1; } + } + } - GetOutput() = global_result; + GetOutput() = global_result; - } else { - int start_idx = 0; - int current_chunk_size = 0; + } else { + int start_idx = 0; + int current_chunk_size = 0; - MPI_Recv(&start_idx, 1, MPI_UNSIGNED_LONG, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - MPI_Recv(¤t_chunk_size, 1, MPI_UNSIGNED_LONG, 0, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + MPI_Recv(&start_idx, 1, MPI_UNSIGNED_LONG, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + MPI_Recv(¤t_chunk_size, 1, MPI_UNSIGNED_LONG, 0, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - if (current_chunk_size > 0) { - std::string sub_str1(current_chunk_size, '\0'); - std::string sub_str2(current_chunk_size, '\0'); + if (current_chunk_size > 0) { + std::string sub_str1(current_chunk_size, '\0'); + std::string sub_str2(current_chunk_size, '\0'); - MPI_Recv(&sub_str1[0], current_chunk_size, MPI_CHAR, 0, 3, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - MPI_Recv(&sub_str2[0], current_chunk_size, MPI_CHAR, 0, 4, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + MPI_Recv(&sub_str1[0], current_chunk_size, MPI_CHAR, 0, 3, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + MPI_Recv(&sub_str2[0], current_chunk_size, MPI_CHAR, 0, 4, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - for (int k = 0; k < current_chunk_size; ++k) { - if (sub_str1[k] < sub_str2[k]) { - local_result = -1; - break; - } - if (sub_str1[k] > sub_str2[k]) { - local_result = 1; - break; - } - } + for (int k = 0; k < current_chunk_size; ++k) { + if (sub_str1[k] < sub_str2[k]) { + local_result = -1; + break; } - - MPI_Send(&local_result, 1, MPI_INT, 0, 5, MPI_COMM_WORLD); + if (sub_str1[k] > sub_str2[k]) { + local_result = 1; + break; + } + } } - MPI_Barrier(MPI_COMM_WORLD); - return true; + MPI_Send(&local_result, 1, MPI_INT, 0, 5, MPI_COMM_WORLD); + } + + MPI_Barrier(MPI_COMM_WORLD); + return true; } bool SmyshlaevAStrOrderCheckMPI::PostProcessingImpl() { - return true; + return true; } -} // namespace smyshlaev_a_str_order_check \ No newline at end of file +} // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp b/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp index c73757f592..5089430428 100644 --- a/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp +++ b/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp @@ -8,52 +8,52 @@ namespace smyshlaev_a_str_order_check { -SmyshlaevAStrOrderCheckSEQ::SmyshlaevAStrOrderCheckSEQ(const InType& in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; +SmyshlaevAStrOrderCheckSEQ::SmyshlaevAStrOrderCheckSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; } bool SmyshlaevAStrOrderCheckSEQ::ValidationImpl() { - return true; + return true; } bool SmyshlaevAStrOrderCheckSEQ::PreProcessingImpl() { - return true; + return true; } bool SmyshlaevAStrOrderCheckSEQ::RunImpl() { - const auto& input_data = GetInput(); - - const std::string& str1 = input_data.first; - const std::string& str2 = input_data.second; - - int min_len = std::min(str1.length(), str2.length()); - - for (int i = 0; i < min_len; ++i) { - if (str1[i] < str2[i]) { - GetOutput() = -1; - return true; - } - if (str1[i] > str2[i]) { - GetOutput() = 1; - return true; - } - } + const auto &input_data = GetInput(); + + const std::string &str1 = input_data.first; + const std::string &str2 = input_data.second; + + int min_len = std::min(str1.length(), str2.length()); - if (str1.length() < str2.length()) { - GetOutput() = -1; - } else if (str1.length() > str2.length()) { - GetOutput() = 1; - } else { - GetOutput() = 0; + for (int i = 0; i < min_len; ++i) { + if (str1[i] < str2[i]) { + GetOutput() = -1; + return true; } + if (str1[i] > str2[i]) { + GetOutput() = 1; + return true; + } + } + + if (str1.length() < str2.length()) { + GetOutput() = -1; + } else if (str1.length() > str2.length()) { + GetOutput() = 1; + } else { + GetOutput() = 0; + } - return true; + return true; } bool SmyshlaevAStrOrderCheckSEQ::PostProcessingImpl() { - return true; + return true; } -} // namespace smyshlaev_a_str_order_check \ No newline at end of file +} // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp index 0add091bd0..035c786a7d 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp @@ -36,9 +36,13 @@ class SmyshlaevAStrOrderCheckRunFuncTestsProcesses : public ppc::util::BaseRunFu expected_output_ = std::get<2>(params); } - bool CheckTestOutputData(OutType &output_data) final { return (expected_output_ == output_data); } + bool CheckTestOutputData(OutType &output_data) final { + return (expected_output_ == output_data); + } - InType GetTestInputData() final { return input_data_; } + InType GetTestInputData() final { + return input_data_; + } private: InType input_data_; @@ -47,27 +51,29 @@ class SmyshlaevAStrOrderCheckRunFuncTestsProcesses : public ppc::util::BaseRunFu namespace { -TEST_P(SmyshlaevAStrOrderCheckRunFuncTestsProcesses, StringOrderCheckTest) { ExecuteTest(GetParam()); } +TEST_P(SmyshlaevAStrOrderCheckRunFuncTestsProcesses, StringOrderCheckTest) { + ExecuteTest(GetParam()); +} -const std::array kTestParam = { - std::make_tuple(std::string("apple"), std::string("apple"), 0), - std::make_tuple(std::string("apple"), std::string("banana"), -1), - std::make_tuple(std::string("zebra"), std::string("yak"), 1), - std::make_tuple(std::string("cat"), std::string("caterpillar"), -1), - std::make_tuple(std::string("caterpillar"), std::string("cat"), 1), - std::make_tuple(std::string("Zebra"), std::string("zebra"), -1)}; +const std::array kTestParam = {std::make_tuple(std::string("apple"), std::string("apple"), 0), + std::make_tuple(std::string("apple"), std::string("banana"), -1), + std::make_tuple(std::string("zebra"), std::string("yak"), 1), + std::make_tuple(std::string("cat"), std::string("caterpillar"), -1), + std::make_tuple(std::string("caterpillar"), std::string("cat"), 1), + std::make_tuple(std::string("Zebra"), std::string("zebra"), -1)}; -const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_str_order_check), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_str_order_check)); +const auto kTestTasksList = std::tuple_cat( + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_str_order_check), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_str_order_check)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); const auto kPerfTestName = SmyshlaevAStrOrderCheckRunFuncTestsProcesses::PrintFuncTestName; -INSTANTIATE_TEST_SUITE_P(StringOrderCheckTests, SmyshlaevAStrOrderCheckRunFuncTestsProcesses, kGtestValues, kPerfTestName); +INSTANTIATE_TEST_SUITE_P(StringOrderCheckTests, SmyshlaevAStrOrderCheckRunFuncTestsProcesses, kGtestValues, + kPerfTestName); } // namespace -} // namespace smyshlaev_a_str_order_check \ No newline at end of file +} // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp index 68bece344e..1f7b5350b3 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp @@ -24,15 +24,21 @@ class SmyshlaevAStrOrderCheckRunPerfTestsProcesses : public ppc::util::BaseRunPe input_data_ = std::make_pair(long_str_A, long_str_B); } - bool CheckTestOutputData(OutType &output_data) final { return kExpectedResult_ == output_data; } + bool CheckTestOutputData(OutType &output_data) final { + return kExpectedResult_ == output_data; + } - InType GetTestInputData() final { return input_data_; } + InType GetTestInputData() final { + return input_data_; + } }; -TEST_P(SmyshlaevAStrOrderCheckRunPerfTestsProcesses, RunPerfModes) { ExecuteTest(GetParam()); } +TEST_P(SmyshlaevAStrOrderCheckRunPerfTestsProcesses, RunPerfModes) { + ExecuteTest(GetParam()); +} -const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_smyshlaev_a_str_order_check); +const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks( + PPC_SETTINGS_smyshlaev_a_str_order_check); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); @@ -40,4 +46,4 @@ const auto kPerfTestName = SmyshlaevAStrOrderCheckRunPerfTestsProcesses::CustomP INSTANTIATE_TEST_SUITE_P(RunModeTests, SmyshlaevAStrOrderCheckRunPerfTestsProcesses, kGtestValues, kPerfTestName); -} // namespace smyshlaev_a_str_order_check \ No newline at end of file +} // namespace smyshlaev_a_str_order_check From 6af32f5ac3b6c9533ccef122b629f7a9478aeeb7 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 15:56:22 +0300 Subject: [PATCH 10/28] - --- tasks/smyshlaev_a_str_order_check/report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks/smyshlaev_a_str_order_check/report.md b/tasks/smyshlaev_a_str_order_check/report.md index afb26e37c8..cf2abd1b0e 100644 --- a/tasks/smyshlaev_a_str_order_check/report.md +++ b/tasks/smyshlaev_a_str_order_check/report.md @@ -1 +1,2 @@ отчет + \ No newline at end of file From a959011d54d8128a2060aabbd31c9d885bb5f19f Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 16:10:57 +0300 Subject: [PATCH 11/28] fix test name --- .../smyshlaev_a_str_order_check/tests/functional/main.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp index 035c786a7d..7e4b14f551 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp @@ -25,6 +25,13 @@ class SmyshlaevAStrOrderCheckRunFuncTestsProcesses : public ppc::util::BaseRunFu const auto &strA = std::get<0>(test_param); const auto &strB = std::get<1>(test_param); const auto &expected = std::get<2>(test_param); + + std::string expected_str; + if (expected < 0) { + expected_str = "neg_" + std::to_string(std::abs(expected)); + } else { + expected_str = std::to_string(expected); + } return strA + "_" + strB + "_expect_" + std::to_string(expected); } From 2e44bdac4710fa443734cf81c05d029d8f34e8d9 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 16:18:29 +0300 Subject: [PATCH 12/28] fix test name 2 --- tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp index 7e4b14f551..eb95533c31 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp @@ -32,7 +32,7 @@ class SmyshlaevAStrOrderCheckRunFuncTestsProcesses : public ppc::util::BaseRunFu } else { expected_str = std::to_string(expected); } - return strA + "_" + strB + "_expect_" + std::to_string(expected); + return strA + "_" + strB + "_expect_" + expected_str; } protected: From 86dd3ba7ebc398c40a374c768463747cbb28e0db Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 16:38:22 +0300 Subject: [PATCH 13/28] fix mpi logic --- .../mpi/src/ops_mpi.cpp | 89 ++++++++----------- 1 file changed, 36 insertions(+), 53 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index f005bc6ca9..fac6234bd4 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -28,11 +28,6 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { const std::string &str1 = input_data.first; const std::string &str2 = input_data.second; - if (str1.empty() && str2.empty()) { - GetOutput() = 0; - return true; - } - int rank = 0; int size = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); @@ -41,64 +36,53 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { int local_result = 0; int global_result = 0; - int min_len = std::min(str1.length(), str2.length()); - if (rank == 0) { - if (min_len == 0) { - if (str1.length() < str2.length()) { - global_result = -1; - } else if (str1.length() > str2.length()) { - global_result = 1; - } else { - global_result = 0; - } - } + int min_len = std::min(str1.length(), str2.length()); - else { - int chunk_size = min_len / size; - int remainder = min_len % size; + int chunk_size = (size > 0) ? (min_len / size) : 0; + int remainder = (size > 0) ? (min_len % size) : 0; - for (int i = 0; i < size; ++i) { - int start_idx = i * chunk_size + std::min((int)i, remainder); - int current_chunk_size = chunk_size + (i < remainder ? 1 : 0); + for (int i = 0; i < size; ++i) { + int start_idx = i * chunk_size + std::min(i, remainder); + int current_chunk_size = chunk_size + (i < remainder ? 1 : 0); - if (i != 0) { - MPI_Send(&start_idx, 1, MPI_UNSIGNED_LONG, i, 1, MPI_COMM_WORLD); - MPI_Send(¤t_chunk_size, 1, MPI_UNSIGNED_LONG, i, 2, MPI_COMM_WORLD); + if (i != 0) { + MPI_Send(&start_idx, 1, MPI_INT, i, 1, MPI_COMM_WORLD); + MPI_Send(¤t_chunk_size, 1, MPI_INT, i, 2, MPI_COMM_WORLD); + if (current_chunk_size > 0) { MPI_Send(str1.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 3, MPI_COMM_WORLD); MPI_Send(str2.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 4, MPI_COMM_WORLD); - } else { - local_result = 0; - for (int k = 0; k < current_chunk_size; ++k) { - if (str1[start_idx + k] < str2[start_idx + k]) { - local_result = -1; - break; - } - if (str1[start_idx + k] > str2[start_idx + k]) { - local_result = 1; - break; - } + } + } else { + local_result = 0; + for (int k = 0; k < current_chunk_size; ++k) { + if (str1[start_idx + k] < str2[start_idx + k]) { + local_result = -1; + break; + } + if (str1[start_idx + k] > str2[start_idx + k]) { + local_result = 1; + break; } } } + } - global_result = local_result; - - for (int i = 1; i < size; ++i) { - int worker_result; - MPI_Recv(&worker_result, 1, MPI_INT, i, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + global_result = local_result; - if (global_result == 0 && worker_result != 0) { - global_result = worker_result; - } + for (int i = 1; i < size; ++i) { + int worker_result; + MPI_Recv(&worker_result, 1, MPI_INT, i, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + if (global_result == 0 && worker_result != 0) { + global_result = worker_result; } + } - if (global_result == 0) { - if (str1.length() < str2.length()) { - global_result = -1; - } else if (str1.length() > str2.length()) { - global_result = 1; - } + if (global_result == 0) { + if (str1.length() < str2.length()) { + global_result = -1; + } else if (str1.length() > str2.length()) { + global_result = 1; } } @@ -108,8 +92,8 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { int start_idx = 0; int current_chunk_size = 0; - MPI_Recv(&start_idx, 1, MPI_UNSIGNED_LONG, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - MPI_Recv(¤t_chunk_size, 1, MPI_UNSIGNED_LONG, 0, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + MPI_Recv(&start_idx, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + MPI_Recv(¤t_chunk_size, 1, MPI_INT, 0, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); if (current_chunk_size > 0) { std::string sub_str1(current_chunk_size, '\0'); @@ -129,7 +113,6 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { } } } - MPI_Send(&local_result, 1, MPI_INT, 0, 5, MPI_COMM_WORLD); } From 3ce3eb721d04ddf1aa7d26c09e26bf01c0f233d6 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 17:07:09 +0300 Subject: [PATCH 14/28] fix mpi --- .../mpi/src/ops_mpi.cpp | 92 ++++++------------- 1 file changed, 26 insertions(+), 66 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index fac6234bd4..7fa005dc7f 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -33,48 +33,34 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); - int local_result = 0; - int global_result = 0; + const int min_len = std::min(str1.length(), str2.length()); + const int chunk_size = (size > 0) ? (min_len / size) : 0; + const int remainder = (size > 0) ? (min_len % size) : 0; - if (rank == 0) { - int min_len = std::min(str1.length(), str2.length()); - - int chunk_size = (size > 0) ? (min_len / size) : 0; - int remainder = (size > 0) ? (min_len % size) : 0; - - for (int i = 0; i < size; ++i) { - int start_idx = i * chunk_size + std::min(i, remainder); - int current_chunk_size = chunk_size + (i < remainder ? 1 : 0); - - if (i != 0) { - MPI_Send(&start_idx, 1, MPI_INT, i, 1, MPI_COMM_WORLD); - MPI_Send(¤t_chunk_size, 1, MPI_INT, i, 2, MPI_COMM_WORLD); - if (current_chunk_size > 0) { - MPI_Send(str1.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 3, MPI_COMM_WORLD); - MPI_Send(str2.c_str() + start_idx, current_chunk_size, MPI_CHAR, i, 4, MPI_COMM_WORLD); - } - } else { - local_result = 0; - for (int k = 0; k < current_chunk_size; ++k) { - if (str1[start_idx + k] < str2[start_idx + k]) { - local_result = -1; - break; - } - if (str1[start_idx + k] > str2[start_idx + k]) { - local_result = 1; - break; - } - } - } - } + const int start_idx = rank * chunk_size + std::min(rank, remainder); + const int end_idx = start_idx + chunk_size + (rank < remainder ? 1 : 0); - global_result = local_result; + int local_result = 0; + for (int i = start_idx; i < end_idx; ++i) { + if (str1[i] < str2[i]) { + local_result = -1; + break; + } + if (str1[i] > str2[i]) { + local_result = 1; + break; + } + } - for (int i = 1; i < size; ++i) { - int worker_result; - MPI_Recv(&worker_result, 1, MPI_INT, i, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - if (global_result == 0 && worker_result != 0) { - global_result = worker_result; + if (rank == 0) { + std::vector all_results(size); + MPI_Gather(&local_result, 1, MPI_INT, all_results.data(), 1, MPI_INT, 0, MPI_COMM_WORLD); + + int global_result = 0; + for (int result : all_results) { + if (result != 0) { + global_result = result; + break; } } @@ -85,38 +71,12 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { global_result = 1; } } - GetOutput() = global_result; } else { - int start_idx = 0; - int current_chunk_size = 0; - - MPI_Recv(&start_idx, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - MPI_Recv(¤t_chunk_size, 1, MPI_INT, 0, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - - if (current_chunk_size > 0) { - std::string sub_str1(current_chunk_size, '\0'); - std::string sub_str2(current_chunk_size, '\0'); - - MPI_Recv(&sub_str1[0], current_chunk_size, MPI_CHAR, 0, 3, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - MPI_Recv(&sub_str2[0], current_chunk_size, MPI_CHAR, 0, 4, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - - for (int k = 0; k < current_chunk_size; ++k) { - if (sub_str1[k] < sub_str2[k]) { - local_result = -1; - break; - } - if (sub_str1[k] > sub_str2[k]) { - local_result = 1; - break; - } - } - } - MPI_Send(&local_result, 1, MPI_INT, 0, 5, MPI_COMM_WORLD); + MPI_Gather(&local_result, 1, MPI_INT, nullptr, 0, MPI_INT, 0, MPI_COMM_WORLD); } - MPI_Barrier(MPI_COMM_WORLD); return true; } From 1fc95a48fd61188f8faf8603600eb154b28cd7e3 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 17:47:26 +0300 Subject: [PATCH 15/28] add allgather --- .../mpi/src/ops_mpi.cpp | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index 7fa005dc7f..69a1fc2952 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -52,31 +52,27 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { } } - if (rank == 0) { - std::vector all_results(size); - MPI_Gather(&local_result, 1, MPI_INT, all_results.data(), 1, MPI_INT, 0, MPI_COMM_WORLD); - - int global_result = 0; - for (int result : all_results) { - if (result != 0) { - global_result = result; - break; - } - } + std::vector all_results(size); + MPI_Allgather(&local_result, 1, MPI_INT, all_results.data(), 1, MPI_INT, MPI_COMM_WORLD); - if (global_result == 0) { - if (str1.length() < str2.length()) { - global_result = -1; - } else if (str1.length() > str2.length()) { - global_result = 1; - } + int global_result = 0; + for (int result : all_results) { + if (result != 0) { + global_result = result; + break; } - GetOutput() = global_result; + } - } else { - MPI_Gather(&local_result, 1, MPI_INT, nullptr, 0, MPI_INT, 0, MPI_COMM_WORLD); + if (global_result == 0) { + if (str1.length() < str2.length()) { + global_result = -1; + } else if (str1.length() > str2.length()) { + global_result = 1; + } } + GetOutput() = global_result; + return true; } From dd2e5a350d3bf9280a348d0bd3373739050ebd5d Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 18:22:51 +0300 Subject: [PATCH 16/28] add perf test --- .../smyshlaev_a_str_order_check/tests/performance/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp index 1f7b5350b3..920783a6c9 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp @@ -10,17 +10,17 @@ namespace smyshlaev_a_str_order_check { -const size_t kStringLength = 1000000; +const size_t kStringLength = 2000000; class SmyshlaevAStrOrderCheckRunPerfTestsProcesses : public ppc::util::BaseRunPerfTests { private: - const OutType kExpectedResult_ = 0; + const OutType kExpectedResult_ = -1; InType input_data_{}; void SetUp() override { std::string long_str_A(kStringLength, 'a'); std::string long_str_B = long_str_A; - + long_str_B.back() = 'b'; input_data_ = std::make_pair(long_str_A, long_str_B); } From 3846a0524e0d6266c91730eda7802d261fdcf563 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 18:51:39 +0300 Subject: [PATCH 17/28] improve perf test --- tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp index 920783a6c9..2194a7ca81 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp @@ -10,7 +10,7 @@ namespace smyshlaev_a_str_order_check { -const size_t kStringLength = 2000000; +const size_t kStringLength = 20000000; class SmyshlaevAStrOrderCheckRunPerfTestsProcesses : public ppc::util::BaseRunPerfTests { private: From c96b8d38de915c1f20cc4353b16366ab44afa3b2 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 20:15:26 +0300 Subject: [PATCH 18/28] clang-tidy --- .../common/include/common.hpp | 1 + .../smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp | 5 +++-- .../smyshlaev_a_str_order_check/seq/src/ops_seq.cpp | 2 +- .../tests/functional/main.cpp | 12 ++++-------- .../tests/performance/main.cpp | 13 +++++++------ 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/common/include/common.hpp b/tasks/smyshlaev_a_str_order_check/common/include/common.hpp index 519726bec8..ef990a185d 100644 --- a/tasks/smyshlaev_a_str_order_check/common/include/common.hpp +++ b/tasks/smyshlaev_a_str_order_check/common/include/common.hpp @@ -2,6 +2,7 @@ #include #include +#include #include "task/include/task.hpp" diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index 69a1fc2952..640cd7ff69 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -2,6 +2,7 @@ #include +#include #include #include @@ -33,11 +34,11 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); - const int min_len = std::min(str1.length(), str2.length()); + const int min_len = static_cast(std::min(str1.length(), str2.length())); const int chunk_size = (size > 0) ? (min_len / size) : 0; const int remainder = (size > 0) ? (min_len % size) : 0; - const int start_idx = rank * chunk_size + std::min(rank, remainder); + const int start_idx = (rank * chunk_size) + std::min(rank, remainder); const int end_idx = start_idx + chunk_size + (rank < remainder ? 1 : 0); int local_result = 0; diff --git a/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp b/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp index 5089430428..496bced7b3 100644 --- a/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp +++ b/tasks/smyshlaev_a_str_order_check/seq/src/ops_seq.cpp @@ -28,7 +28,7 @@ bool SmyshlaevAStrOrderCheckSEQ::RunImpl() { const std::string &str1 = input_data.first; const std::string &str2 = input_data.second; - int min_len = std::min(str1.length(), str2.length()); + int min_len = static_cast(std::min(str1.length(), str2.length())); for (int i = 0; i < min_len; ++i) { if (str1[i] < str2[i]) { diff --git a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp index eb95533c31..a5fe041a5d 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp @@ -1,15 +1,11 @@ #include -#include #include #include -#include -#include -#include #include #include #include -#include +#include #include "smyshlaev_a_str_order_check/common/include/common.hpp" #include "smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp" @@ -22,8 +18,8 @@ namespace smyshlaev_a_str_order_check { class SmyshlaevAStrOrderCheckRunFuncTestsProcesses : public ppc::util::BaseRunFuncTests { public: static std::string PrintTestParam(const TestType &test_param) { - const auto &strA = std::get<0>(test_param); - const auto &strB = std::get<1>(test_param); + const auto &str_a = std::get<0>(test_param); + const auto &str_b = std::get<1>(test_param); const auto &expected = std::get<2>(test_param); std::string expected_str; @@ -32,7 +28,7 @@ class SmyshlaevAStrOrderCheckRunFuncTestsProcesses : public ppc::util::BaseRunFu } else { expected_str = std::to_string(expected); } - return strA + "_" + strB + "_expect_" + expected_str; + return str_a + "_" + str_b + "_expect_" + expected_str; } protected: diff --git a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp index 2194a7ca81..6b9e3f8b72 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp @@ -1,7 +1,8 @@ #include -#include #include +#include +#include #include "smyshlaev_a_str_order_check/common/include/common.hpp" #include "smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp" @@ -15,13 +16,13 @@ const size_t kStringLength = 20000000; class SmyshlaevAStrOrderCheckRunPerfTestsProcesses : public ppc::util::BaseRunPerfTests { private: const OutType kExpectedResult_ = -1; - InType input_data_{}; + InType input_data_; void SetUp() override { - std::string long_str_A(kStringLength, 'a'); - std::string long_str_B = long_str_A; - long_str_B.back() = 'b'; - input_data_ = std::make_pair(long_str_A, long_str_B); + std::string long_str_a(kStringLength, 'a'); + std::string long_str_b = long_str_a; + long_str_b.back() = 'b'; + input_data_ = std::make_pair(long_str_a, long_str_b); } bool CheckTestOutputData(OutType &output_data) final { From 3ed56764d6bded1b9c40b5efbdb9828e6f03fe1c Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 10 Nov 2025 20:20:04 +0300 Subject: [PATCH 19/28] clang --- tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp | 2 +- tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp | 2 +- tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index 640cd7ff69..fe609a8ae5 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -2,9 +2,9 @@ #include -#include #include #include +#include #include "smyshlaev_a_str_order_check/common/include/common.hpp" diff --git a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp index a5fe041a5d..773cdcb346 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp @@ -1,11 +1,11 @@ #include #include +#include #include #include #include #include -#include #include "smyshlaev_a_str_order_check/common/include/common.hpp" #include "smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp" diff --git a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp index 6b9e3f8b72..67b4660ea9 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/performance/main.cpp @@ -1,8 +1,8 @@ #include +#include #include #include -#include #include "smyshlaev_a_str_order_check/common/include/common.hpp" #include "smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp" From 12bf865da6f193a4a6fef53d4cbda72947f6966a Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Sun, 16 Nov 2025 14:39:11 +0300 Subject: [PATCH 20/28] fix_func_tests --- .../common/include/common.hpp | 2 +- .../tests/functional/main.cpp | 30 ++++++++----------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/common/include/common.hpp b/tasks/smyshlaev_a_str_order_check/common/include/common.hpp index ef990a185d..3d8fa87c02 100644 --- a/tasks/smyshlaev_a_str_order_check/common/include/common.hpp +++ b/tasks/smyshlaev_a_str_order_check/common/include/common.hpp @@ -10,7 +10,7 @@ namespace smyshlaev_a_str_order_check { using InType = std::pair; using OutType = int; -using TestType = std::tuple; +using TestType = std::tuple; using BaseTask = ppc::task::Task; } // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp index 773cdcb346..fd625fd257 100644 --- a/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp +++ b/tasks/smyshlaev_a_str_order_check/tests/functional/main.cpp @@ -18,17 +18,7 @@ namespace smyshlaev_a_str_order_check { class SmyshlaevAStrOrderCheckRunFuncTestsProcesses : public ppc::util::BaseRunFuncTests { public: static std::string PrintTestParam(const TestType &test_param) { - const auto &str_a = std::get<0>(test_param); - const auto &str_b = std::get<1>(test_param); - const auto &expected = std::get<2>(test_param); - - std::string expected_str; - if (expected < 0) { - expected_str = "neg_" + std::to_string(std::abs(expected)); - } else { - expected_str = std::to_string(expected); - } - return str_a + "_" + str_b + "_expect_" + expected_str; + return std::get<3>(test_param); } protected: @@ -58,12 +48,18 @@ TEST_P(SmyshlaevAStrOrderCheckRunFuncTestsProcesses, StringOrderCheckTest) { ExecuteTest(GetParam()); } -const std::array kTestParam = {std::make_tuple(std::string("apple"), std::string("apple"), 0), - std::make_tuple(std::string("apple"), std::string("banana"), -1), - std::make_tuple(std::string("zebra"), std::string("yak"), 1), - std::make_tuple(std::string("cat"), std::string("caterpillar"), -1), - std::make_tuple(std::string("caterpillar"), std::string("cat"), 1), - std::make_tuple(std::string("Zebra"), std::string("zebra"), -1)}; +const std::array kTestParam = { + std::make_tuple(std::string("car"), std::string("car"), 0, std::string("equal_not_empty_strings")), + std::make_tuple(std::string("air"), std::string("bike"), -1, std::string("first_string_less_than_second")), + std::make_tuple(std::string("plane"), std::string("material"), 1, std::string("first_string_greater_than_second")), + std::make_tuple(std::string("abc"), std::string("abcdefg"), -1, std::string("first_string_prefix_of_second")), + std::make_tuple(std::string("gdefg"), std::string("gde"), 1, std::string("second_string_prefix_of_first")), + std::make_tuple(std::string("Abc"), std::string("abc"), -1, std::string("case_sensitive_comparison")), + std::make_tuple(std::string(""), std::string(""), 0, std::string("both_strings_empty")), + std::make_tuple(std::string("a"), std::string(""), 1, std::string("right_string_empty")), + std::make_tuple(std::string(""), std::string("a"), -1, std::string("left_string_empty")), + std::make_tuple(std::string("a"), std::string("a"), 0, std::string("characters_equal")), + std::make_tuple(std::string("a"), std::string("b"), -1, std::string("left_character_less"))}; const auto kTestTasksList = std::tuple_cat( ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_smyshlaev_a_str_order_check), From 1a1cc5ef0d6432562e387186b1043a90177b98fc Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Sun, 16 Nov 2025 21:52:08 +0300 Subject: [PATCH 21/28] add report --- tasks/smyshlaev_a_str_order_check/report.md | 59 ++++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/report.md b/tasks/smyshlaev_a_str_order_check/report.md index cf2abd1b0e..b20fff1ca9 100644 --- a/tasks/smyshlaev_a_str_order_check/report.md +++ b/tasks/smyshlaev_a_str_order_check/report.md @@ -1,2 +1,57 @@ -отчет - \ No newline at end of file +# <Проверка лексикографической упорядоченности двух строк> + +- Student: <Смышляев Александр Павлович>, group <3823Б1ФИ2> +- Technology: +- Variant: <26> + +## 1. Introduction +**Мотивация:** Исследовать эффективность распараллеливания задачи сравнения строк через MPI, которая, в отличие от простых арифметических операций, имеет переменную вычислительную сложность. + +**Проблема:** Производительность алгоритма сильно зависит от входных данных. В "лучшем случае" (различие в начале строк) затраты на коммуникацию могут превысить выгоду, в то время как в "худшем" (различие в конце) распараллеливание должно быть эффективным. + +**Ожидаемый результат:** MPI-версия покажет значительное ускорение по сравнению с последовательной в "худшем случае", но эффективность будет снижаться с ростом числа процессов из-за накладных расходов. +## 2. Problem Statement +На вход поступают две строки произвольного размера. Задача — определить их лексикографический порядок. + +## 3. Baseline Algorithm (Sequential) +Базовый (последовательный) алгоритм посимвольно сравнивает строки до первого различия. Если общая часть идентична (одна строка является префиксом другой), результат определяется сравнением длин строк. + +## 4. Parallelization Scheme +Параллельный алгоритм основан на декомпозиции задачи. Вместо рассылки данных, предполагается, что каждый процесс уже имеет полные копии исходных строк. + +1. **Распределение работы:** Каждый процесс на основе своего ранга и общего числа процессов вычисляет уникальный, непересекающийся диапазон индексов для сравнения. Длина общего участка строк делится на `N` процессов, а остаток от деления распределяется по первым процессам. +2. **Локальное сравнение:** Каждый процесс выполняет сравнение символов только в своем диапазоне. Если различие найдено, он сохраняет локальный результат (`-1` или `1`), иначе — `0`. +3. **Сбор результатов:** С помощью операции `MPI_Allgather` каждый процесс отправляет свой локальный результат всем остальным. В итоге каждый процесс получает полный массив результатов от всех участников. +4. **Финализация:** Каждый процесс анализирует полученный массив. Итоговый результат — это первый ненулевой элемент в этом массиве (так как массив упорядочен по рангам, это гарантирует нахождение самого первого различия в строках). Если все результаты нулевые, итоговый ответ определяется сравнением длин строк. + +## 5. Experimental Setup +- **Hardware/OS:** `Intel Core i7-1255U` (10 ядер, 12 потоков), `16GB RAM`, `Windows 11` +- **Toolchain:** `MSVC v19.38.33130 (Visual Studio 2022)`, `MS-MPI`, `Release` +- **Environment:** `PPC_NUM_PROC` +- **Data:** Две строки на 20'000'000 элементов, различающиеся в последнем символе ("худший случай" для вычислений). + +## 6. Results and Discussion + +### 6.1 Correctness +Корректность реализаций проверена функциональными тестами (GTest). Тесты покрывают все основные сценарии: равные строки, пустые строки, строки-префиксы и строки с различиями в разных позициях. + +### 6.2 Performance +Present time, speedup and efficiency. Example table: + +| Mode | Count | Time, s | Speedup | Efficiency | +|-------------|-------|---------|---------|------------| +| seq | 1 | 0.018 | 1.00 | N/A | +| mpi | 2 | 0.01 | 1.8 | 90.0% | +| mpi | 4 | 0.00865 | 2.09 | 52.3% | +| mpi | 8 | 0.0111 | 1.62 | 20.3% | +MPI-реализация показывает хорошее ускорение на 2 и 4 процессах с пиком производительности при N=4. + +Высокая эффективность на 2 процессах (90%) говорит о том, что задача хорошо подходит для распараллеливания. + +При увеличении числа процессов до 8 наблюдается падение производительности: время выполнения увеличилось по сравнению с 4 процессами. Накладные расходы на коммуникацию (MPI_Allgather) и синхронизацию начинают преобладать над выгодой от дальнейшего дробления вычислений. +## 7. Conclusions +Реализация распределенного сравнения строк с использованием MPI показала свою высокую эффективность для сценариев с большой вычислительной нагрузкой. Выбранный подход с репликацией данных и ручным разделением диапазонов позволил избежать затрат на пересылку больших объемов данных (`Scatterv`), заменив их одной коллективной операцией `Allgather` для сбора небольших локальных результатов. С ростом числа процессов ускорение остается значительным, хотя эффективность падает из-за накладных расходов на синхронизацию. В целом, MPI-подход является оправданным и эффективным решением для сравнения очень больших, преимущественно схожих строк. + +## 8. References +1. Лекции по параллельному программированию ННГУ +2. Стандарт MPI From c163ad213ce94360cba40b9a039d8bd6a036afc1 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 17 Nov 2025 10:24:09 +0300 Subject: [PATCH 22/28] fix cov --- tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index fe609a8ae5..4834809e77 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -35,8 +35,8 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { MPI_Comm_size(MPI_COMM_WORLD, &size); const int min_len = static_cast(std::min(str1.length(), str2.length())); - const int chunk_size = (size > 0) ? (min_len / size) : 0; - const int remainder = (size > 0) ? (min_len % size) : 0; + const int chunk_size = min_len / size; + const int remainder = min_len % size; const int start_idx = (rank * chunk_size) + std::min(rank, remainder); const int end_idx = start_idx + chunk_size + (rank < remainder ? 1 : 0); From 7b88eee64edeafeb7fe545ed303f4441d77baf8c Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Wed, 26 Nov 2025 18:26:35 +0300 Subject: [PATCH 23/28] del unused picture --- tasks/smyshlaev_a_str_order_check/data/pic.jpg | Bin 15356 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tasks/smyshlaev_a_str_order_check/data/pic.jpg diff --git a/tasks/smyshlaev_a_str_order_check/data/pic.jpg b/tasks/smyshlaev_a_str_order_check/data/pic.jpg deleted file mode 100644 index 34458023494a39d66880a98aa5dcad18eb14b249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15356 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 Date: Wed, 26 Nov 2025 18:46:22 +0300 Subject: [PATCH 24/28] add data scatter --- .../mpi/src/ops_mpi.cpp | 104 ++++++++++++++---- 1 file changed, 84 insertions(+), 20 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index 4834809e77..b423976176 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -12,7 +12,13 @@ namespace smyshlaev_a_str_order_check { SmyshlaevAStrOrderCheckMPI::SmyshlaevAStrOrderCheckMPI(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; + + int rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + if (rank == 0) { + GetInput() = in; + } + GetOutput() = 0; } @@ -25,49 +31,107 @@ bool SmyshlaevAStrOrderCheckMPI::PreProcessingImpl() { } bool SmyshlaevAStrOrderCheckMPI::RunImpl() { - const auto &input_data = GetInput(); - const std::string &str1 = input_data.first; - const std::string &str2 = input_data.second; - + int proc_count = 0; int rank = 0; - int size = 0; + MPI_Comm_size(MPI_COMM_WORLD, &proc_count); MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); + + int len1 = 0; + int len2 = 0; + + if (rank == 0) { + const auto &input_data = GetInput(); + len1 = static_cast(input_data.first.length()); + len2 = static_cast(input_data.second.length()); + } + + MPI_Bcast(&len1, 1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(&len2, 1, MPI_INT, 0, MPI_COMM_WORLD); const int min_len = static_cast(std::min(str1.length(), str2.length())); - const int chunk_size = min_len / size; - const int remainder = min_len % size; - const int start_idx = (rank * chunk_size) + std::min(rank, remainder); - const int end_idx = start_idx + chunk_size + (rank < remainder ? 1 : 0); + if (proc_count > min_len) { + if (rank == 0) { + const auto &str1 = GetInput().first; + const auto &str2 = GetInput().second; + int res = 0; + for (int i = 0; i < min_len; ++i) { + if (str1[i] < str2[i]) { + res = -1; + break; + } + if (str1[i] > str2[i]) { + res = 1; + break; + } + } + if (res == 0) { + if (len1 < len2) { + res = -1; + } else if (len1 > len2) { + res = 1; + } + } + GetOutput() = res; + } else { + GetOutput() = 0; + } + + int output = GetOutput(); + MPI_Bcast(&output, 1, MPI_INT, 0, MPI_COMM_WORLD); + GetOutput() = output; + return true; + } + + std::vector sendcounts(proc_count); + std::vector offsets(proc_count); + + const int part = min_len / proc_count; + const int remainder = min_len % proc_count; + + int offset = 0; + for (int i = 0; i < proc_count; i++) { + sendcounts[i] = part + (i < remainder ? 1 : 0); + offsets[i] = offset; + offset += sendcounts[i]; + } + + int local_size = sendcounts[rank]; + std::vector local_str1(local_size); + std::vector local_str2(local_size); + MPI_Scatterv(rank == 0 ? GetInput().first.data() : nullptr, sendcounts.data(), offsets.data(), MPI_CHAR, + local_str1.data(), local_size, MPI_CHAR, 0, MPI_COMM_WORLD); + + MPI_Scatterv(rank == 0 ? GetInput().second.data() : nullptr, sendcounts.data(), offsets.data(), MPI_CHAR, + local_str2.data(), local_size, MPI_CHAR, 0, MPI_COMM_WORLD); int local_result = 0; - for (int i = start_idx; i < end_idx; ++i) { - if (str1[i] < str2[i]) { + for (int i = 0; i < local_size; ++i) { + if (local_str1[i] < local_str2[i]) { local_result = -1; break; } - if (str1[i] > str2[i]) { + if (local_str1[i] > local_str2[i]) { local_result = 1; break; } } - std::vector all_results(size); + std::vector all_results(proc_count); MPI_Allgather(&local_result, 1, MPI_INT, all_results.data(), 1, MPI_INT, MPI_COMM_WORLD); int global_result = 0; - for (int result : all_results) { - if (result != 0) { - global_result = result; + for (int res : all_results) { + if (res != 0) { + global_result = res; break; } } if (global_result == 0) { - if (str1.length() < str2.length()) { + if (len1 < len2) { global_result = -1; - } else if (str1.length() > str2.length()) { + } else if (len1 > len2) { global_result = 1; } } From e30a39f84178f273c91e486997a92c3866776464 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Wed, 26 Nov 2025 19:12:45 +0300 Subject: [PATCH 25/28] fix min len calc --- tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index b423976176..3789c68ce2 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -48,7 +48,7 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { MPI_Bcast(&len1, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&len2, 1, MPI_INT, 0, MPI_COMM_WORLD); - const int min_len = static_cast(std::min(str1.length(), str2.length())); + const int min_len = static_cast(std::min(len1, len2)); if (proc_count > min_len) { if (rank == 0) { From 258df7b0f18904c7f92d1cab3d5d2380c6f70c21 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 1 Dec 2025 10:58:46 +0300 Subject: [PATCH 26/28] fix cognitive complexity clang --- .../mpi/include/ops_mpi.hpp | 2 + .../mpi/src/ops_mpi.cpp | 129 +++++++++--------- 2 files changed, 67 insertions(+), 64 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp b/tasks/smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp index b7dd026b9b..6de0bfc5ac 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/include/ops_mpi.hpp @@ -17,6 +17,8 @@ class SmyshlaevAStrOrderCheckMPI : public BaseTask { bool PreProcessingImpl() override; bool RunImpl() override; bool PostProcessingImpl() override; + + bool RunSequential(int min_len, int len1, int len2); }; } // namespace smyshlaev_a_str_order_check diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index 3789c68ce2..7875024531 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -10,6 +10,42 @@ namespace smyshlaev_a_str_order_check { +static int CompareBuffers(const char *s1, const char *s2, int len) { + for (int i = 0; i < len; ++i) { + if (s1[i] < s2[i]) { + return -1; + } + if (s1[i] > s2[i]) { + return 1; + } + } + return 0; +} + +static int ResolveResult(int diff_res, int len1, int len2) { + if (diff_res != 0) { + return diff_res; + } + if (len1 < len2) { + return -1; + } + if (len1 > len2) { + return 1; + } + return 0; +} + +static void CalculateDistribution(int total_len, int proc_count, std::vector &counts, std::vector &offsets) { + const int chunk = total_len / proc_count; + const int remainder = total_len % proc_count; + int offset = 0; + for (int i = 0; i < proc_count; i++) { + counts[i] = chunk + (i < remainder ? 1 : 0); + offsets[i] = offset; + offset += counts[i]; + } +} + SmyshlaevAStrOrderCheckMPI::SmyshlaevAStrOrderCheckMPI(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); @@ -30,6 +66,23 @@ bool SmyshlaevAStrOrderCheckMPI::PreProcessingImpl() { return true; } +bool SmyshlaevAStrOrderCheckMPI::RunSequential(int min_len, int len1, int len2) { + int rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + int res = 0; + if (rank == 0) { + const auto &str1 = GetInput().first; + const auto &str2 = GetInput().second; + int cmp = CompareBuffers(str1.data(), str2.data(), min_len); + res = ResolveResult(cmp, len1, len2); + } + + MPI_Bcast(&res, 1, MPI_INT, 0, MPI_COMM_WORLD); + GetOutput() = res; + return true; +} + bool SmyshlaevAStrOrderCheckMPI::RunImpl() { int proc_count = 0; int rank = 0; @@ -51,71 +104,27 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { const int min_len = static_cast(std::min(len1, len2)); if (proc_count > min_len) { - if (rank == 0) { - const auto &str1 = GetInput().first; - const auto &str2 = GetInput().second; - int res = 0; - for (int i = 0; i < min_len; ++i) { - if (str1[i] < str2[i]) { - res = -1; - break; - } - if (str1[i] > str2[i]) { - res = 1; - break; - } - } - if (res == 0) { - if (len1 < len2) { - res = -1; - } else if (len1 > len2) { - res = 1; - } - } - GetOutput() = res; - } else { - GetOutput() = 0; - } - - int output = GetOutput(); - MPI_Bcast(&output, 1, MPI_INT, 0, MPI_COMM_WORLD); - GetOutput() = output; - return true; + return RunSequential(min_len, len1, len2); } std::vector sendcounts(proc_count); std::vector offsets(proc_count); - - const int part = min_len / proc_count; - const int remainder = min_len % proc_count; - - int offset = 0; - for (int i = 0; i < proc_count; i++) { - sendcounts[i] = part + (i < remainder ? 1 : 0); - offsets[i] = offset; - offset += sendcounts[i]; - } + CalculateDistribution(min_len, proc_count, sendcounts, offsets); int local_size = sendcounts[rank]; std::vector local_str1(local_size); std::vector local_str2(local_size); - MPI_Scatterv(rank == 0 ? GetInput().first.data() : nullptr, sendcounts.data(), offsets.data(), MPI_CHAR, - local_str1.data(), local_size, MPI_CHAR, 0, MPI_COMM_WORLD); - MPI_Scatterv(rank == 0 ? GetInput().second.data() : nullptr, sendcounts.data(), offsets.data(), MPI_CHAR, - local_str2.data(), local_size, MPI_CHAR, 0, MPI_COMM_WORLD); + const char *s1_ptr = (rank == 0) ? GetInput().first.data() : nullptr; + const char *s2_ptr = (rank == 0) ? GetInput().second.data() : nullptr; - int local_result = 0; - for (int i = 0; i < local_size; ++i) { - if (local_str1[i] < local_str2[i]) { - local_result = -1; - break; - } - if (local_str1[i] > local_str2[i]) { - local_result = 1; - break; - } - } + MPI_Scatterv(s1_ptr, sendcounts.data(), offsets.data(), MPI_CHAR, local_str1.data(), local_size, MPI_CHAR, 0, + MPI_COMM_WORLD); + + MPI_Scatterv(s2_ptr, sendcounts.data(), offsets.data(), MPI_CHAR, local_str2.data(), local_size, MPI_CHAR, 0, + MPI_COMM_WORLD); + + int local_result = CompareBuffers(local_str1.data(), local_str2.data(), local_size); std::vector all_results(proc_count); MPI_Allgather(&local_result, 1, MPI_INT, all_results.data(), 1, MPI_INT, MPI_COMM_WORLD); @@ -128,15 +137,7 @@ bool SmyshlaevAStrOrderCheckMPI::RunImpl() { } } - if (global_result == 0) { - if (len1 < len2) { - global_result = -1; - } else if (len1 > len2) { - global_result = 1; - } - } - - GetOutput() = global_result; + GetOutput() = ResolveResult(global_result, len1, len2); return true; } From bfea5abdbd6b3e16e8d204be0342061b9deea7c0 Mon Sep 17 00:00:00 2001 From: P_Alex_Tr Date: Mon, 1 Dec 2025 11:43:10 +0300 Subject: [PATCH 27/28] fix clang error with static funcs --- tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp index 7875024531..706b4551c4 100644 --- a/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp +++ b/tasks/smyshlaev_a_str_order_check/mpi/src/ops_mpi.cpp @@ -10,7 +10,9 @@ namespace smyshlaev_a_str_order_check { -static int CompareBuffers(const char *s1, const char *s2, int len) { +namespace { + +int CompareBuffers(const char *s1, const char *s2, int len) { for (int i = 0; i < len; ++i) { if (s1[i] < s2[i]) { return -1; @@ -22,7 +24,7 @@ static int CompareBuffers(const char *s1, const char *s2, int len) { return 0; } -static int ResolveResult(int diff_res, int len1, int len2) { +int ResolveResult(int diff_res, int len1, int len2) { if (diff_res != 0) { return diff_res; } @@ -35,7 +37,7 @@ static int ResolveResult(int diff_res, int len1, int len2) { return 0; } -static void CalculateDistribution(int total_len, int proc_count, std::vector &counts, std::vector &offsets) { +void CalculateDistribution(int total_len, int proc_count, std::vector &counts, std::vector &offsets) { const int chunk = total_len / proc_count; const int remainder = total_len % proc_count; int offset = 0; @@ -46,6 +48,8 @@ static void CalculateDistribution(int total_len, int proc_count, std::vector Date: Mon, 1 Dec 2025 13:00:57 +0300 Subject: [PATCH 28/28] fix report --- tasks/smyshlaev_a_str_order_check/report.md | 28 ++++++++++----------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/tasks/smyshlaev_a_str_order_check/report.md b/tasks/smyshlaev_a_str_order_check/report.md index b20fff1ca9..507660ccf3 100644 --- a/tasks/smyshlaev_a_str_order_check/report.md +++ b/tasks/smyshlaev_a_str_order_check/report.md @@ -1,8 +1,8 @@ # <Проверка лексикографической упорядоченности двух строк> -- Student: <Смышляев Александр Павлович>, group <3823Б1ФИ2> -- Technology: -- Variant: <26> +- Student: Смышляев Александр Павлович, group 3823Б1ФИ2 +- Technology: SEQ | MPI +- Variant: 26 ## 1. Introduction **Мотивация:** Исследовать эффективность распараллеливания задачи сравнения строк через MPI, которая, в отличие от простых арифметических операций, имеет переменную вычислительную сложность. @@ -17,9 +17,7 @@ Базовый (последовательный) алгоритм посимвольно сравнивает строки до первого различия. Если общая часть идентична (одна строка является префиксом другой), результат определяется сравнением длин строк. ## 4. Parallelization Scheme -Параллельный алгоритм основан на декомпозиции задачи. Вместо рассылки данных, предполагается, что каждый процесс уже имеет полные копии исходных строк. - -1. **Распределение работы:** Каждый процесс на основе своего ранга и общего числа процессов вычисляет уникальный, непересекающийся диапазон индексов для сравнения. Длина общего участка строк делится на `N` процессов, а остаток от деления распределяется по первым процессам. +1. **Распределение работы:** 0-й процесс получает входные данные и рассылает длины строк всем процессам через MPI_Bcast. Затем вычисляются смещения (offsets) и размеры порций (counts). С помощью операции MPI_Scatterv части строк рассылаются по процессам. Таким образом, память расходуется экономно, и каждый процесс хранит только свою часть данных. 2. **Локальное сравнение:** Каждый процесс выполняет сравнение символов только в своем диапазоне. Если различие найдено, он сохраняет локальный результат (`-1` или `1`), иначе — `0`. 3. **Сбор результатов:** С помощью операции `MPI_Allgather` каждый процесс отправляет свой локальный результат всем остальным. В итоге каждый процесс получает полный массив результатов от всех участников. 4. **Финализация:** Каждый процесс анализирует полученный массив. Итоговый результат — это первый ненулевой элемент в этом массиве (так как массив упорядочен по рангам, это гарантирует нахождение самого первого различия в строках). Если все результаты нулевые, итоговый ответ определяется сравнением длин строк. @@ -36,21 +34,21 @@ Корректность реализаций проверена функциональными тестами (GTest). Тесты покрывают все основные сценарии: равные строки, пустые строки, строки-префиксы и строки с различиями в разных позициях. ### 6.2 Performance -Present time, speedup and efficiency. Example table: +Результаты исследования производительности для различного числа процессов: | Mode | Count | Time, s | Speedup | Efficiency | |-------------|-------|---------|---------|------------| -| seq | 1 | 0.018 | 1.00 | N/A | -| mpi | 2 | 0.01 | 1.8 | 90.0% | -| mpi | 4 | 0.00865 | 2.09 | 52.3% | -| mpi | 8 | 0.0111 | 1.62 | 20.3% | -MPI-реализация показывает хорошее ускорение на 2 и 4 процессах с пиком производительности при N=4. +| seq | 1 | 0.0243 | 1.00 | N/A | +| mpi | 2 | 0.0149 | 1.64 | 82.0% | +| mpi | 4 | 0.014 | 1.74 | 44.0% | +| mpi | 8 | 0.0153 | 1.60 | 20.0% | +Результаты показывают, что алгоритм эффективно масштабируется при переходе от 1 к 2 процессам (ускорение 1.64, эффективность 82%). -Высокая эффективность на 2 процессах (90%) говорит о том, что задача хорошо подходит для распараллеливания. +Однако при дальнейшем увеличении числа процессов (N=4) прирост производительности становится незначительным (ускорение выросло лишь до 1.74), а эффективность резко падает. -При увеличении числа процессов до 8 наблюдается падение производительности: время выполнения увеличилось по сравнению с 4 процессами. Накладные расходы на коммуникацию (MPI_Allgather) и синхронизацию начинают преобладать над выгодой от дальнейшего дробления вычислений. +На 8 процессах наблюдается деградация производительности: время выполнения (0.01527 с) оказалось больше, чем на 4 процессах (0.01401 с). Это объясняется тем, что абсолютное время решения задачи очень мало (порядка 15-20 мс). В таких условиях накладные расходы на инициализацию коммуникаций, пересылку данных (MPI_Scatterv) и синхронизацию потоков начинают превышать выгоду от распараллеливания вычислений. ## 7. Conclusions -Реализация распределенного сравнения строк с использованием MPI показала свою высокую эффективность для сценариев с большой вычислительной нагрузкой. Выбранный подход с репликацией данных и ручным разделением диапазонов позволил избежать затрат на пересылку больших объемов данных (`Scatterv`), заменив их одной коллективной операцией `Allgather` для сбора небольших локальных результатов. С ростом числа процессов ускорение остается значительным, хотя эффективность падает из-за накладных расходов на синхронизацию. В целом, MPI-подход является оправданным и эффективным решением для сравнения очень больших, преимущественно схожих строк. +Реализация распределенного сравнения строк с использованием MPI показала свою высокую эффективность для сценариев с большой вычислительной нагрузкой. Использование MPI_Scatterv позволило выполнить эффективную декомпозицию данных, передав каждому процессу только необходимый фрагмент строки для независимой обработки. Однако, накладные расходы на пересылку данных и синхронизацию (Scatterv + Allgather) при большом числе процессов (8) начинают превышать выигрыш от параллельных вычислений, что видно по падению эффективности. В целом, MPI-подход является оправданным и эффективным решением для сравнения очень больших, преимущественно схожих строк. ## 8. References 1. Лекции по параллельному программированию ННГУ