From d2661263a3586afd8b006110571f9559d93fe57c Mon Sep 17 00:00:00 2001 From: SergeyK Date: Tue, 2 Dec 2025 17:45:08 +0000 Subject: [PATCH 1/7] Sudent folder for task 2 --- .../common/include/common.hpp | 15 +++ .../data/pic.jpg | Bin 0 -> 23 bytes .../info.json | 9 ++ .../mpi/include/ops_mpi.hpp | 22 +++++ .../mpi/src/ops_mpi.cpp | 72 +++++++++++++++ .../report.md | 0 .../seq/include/ops_seq.hpp | 22 +++++ .../seq/src/ops_seq.cpp | 60 ++++++++++++ .../settings.json | 7 ++ .../tests/.clang-tidy | 13 +++ .../tests/functional/main.cpp | 86 ++++++++++++++++++ .../tests/performance/main.cpp | 40 ++++++++ .../mpi/src/ops_mpi.cpp | 56 ++++++++++++ 13 files changed, 402 insertions(+) create mode 100644 tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp create mode 100644 tasks/konovalov_s_seidel_iterative_method/data/pic.jpg create mode 100644 tasks/konovalov_s_seidel_iterative_method/info.json create mode 100644 tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp create mode 100644 tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp create mode 100644 tasks/konovalov_s_seidel_iterative_method/report.md create mode 100644 tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp create mode 100644 tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp create mode 100644 tasks/konovalov_s_seidel_iterative_method/settings.json create mode 100644 tasks/konovalov_s_seidel_iterative_method/tests/.clang-tidy create mode 100644 tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp create mode 100644 tasks/konovalov_s_seidel_iterative_method/tests/performance/main.cpp create mode 100644 tasks/konovalov_s_symbol_count/mpi/src/ops_mpi.cpp diff --git a/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp b/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp new file mode 100644 index 0000000000..f5c3b8becb --- /dev/null +++ b/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include "task/include/task.hpp" + +namespace konovalov_s_seidel_iterative_method { + +using InType = int; +using OutType = int; +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/data/pic.jpg b/tasks/konovalov_s_seidel_iterative_method/data/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..637624238c89d914613ed301968bffbf462bc110 GIT binary patch literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY + +#include +#include + +#include "konovalov_s_seidel_iterative_method/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace konovalov_s_seidel_iterative_method { + +KonovalovSSeidelMethodMPI::KonovalovSSeidelMethodMPI(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool KonovalovSSeidelMethodMPI::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool KonovalovSSeidelMethodMPI::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool KonovalovSSeidelMethodMPI::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 KonovalovSSeidelMethodMPI::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/report.md b/tasks/konovalov_s_seidel_iterative_method/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp b/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp new file mode 100644 index 0000000000..28810c8fca --- /dev/null +++ b/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "konovalov_s_seidel_iterative_method/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace konovalov_s_seidel_iterative_method { + +class KonovalovSSeidelMethodSEQ : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSEQ; + } + explicit KonovalovSSeidelMethodSEQ(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp new file mode 100644 index 0000000000..b9187c65e7 --- /dev/null +++ b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp @@ -0,0 +1,60 @@ +#include "konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp" + +#include +#include + +#include "konovalov_s_seidel_iterative_method/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace konovalov_s_seidel_iterative_method { + +KonovalovSSeidelMethodSEQ::KonovalovSSeidelMethodSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool KonovalovSSeidelMethodSEQ::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool KonovalovSSeidelMethodSEQ::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool KonovalovSSeidelMethodSEQ::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 KonovalovSSeidelMethodSEQ::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/settings.json b/tasks/konovalov_s_seidel_iterative_method/settings.json new file mode 100644 index 0000000000..b1a0d52574 --- /dev/null +++ b/tasks/konovalov_s_seidel_iterative_method/settings.json @@ -0,0 +1,7 @@ +{ + "tasks_type": "processes", + "tasks": { + "mpi": "enabled", + "seq": "enabled" + } +} diff --git a/tasks/konovalov_s_seidel_iterative_method/tests/.clang-tidy b/tasks/konovalov_s_seidel_iterative_method/tests/.clang-tidy new file mode 100644 index 0000000000..ef43b7aa8a --- /dev/null +++ b/tasks/konovalov_s_seidel_iterative_method/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/konovalov_s_seidel_iterative_method/tests/functional/main.cpp b/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp new file mode 100644 index 0000000000..97e2622638 --- /dev/null +++ b/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp @@ -0,0 +1,86 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "konovalov_s_seidel_iterative_method/common/include/common.hpp" +#include "konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp" +#include "konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace konovalov_s_seidel_iterative_method { + +class KonovalovSRunFuncTestsProcesses2 : public ppc::util::BaseRunFuncTests { + public: + static std::string PrintTestParam(const TestType &test_param) { + return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); + } + + protected: + void SetUp() override { + int width = -1; + int height = -1; + int channels = -1; + std::vector img; + // Read image in RGB to ensure consistent channel count + { + std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_konovalov_s_seidel_iterative_method, "pic.jpg"); + auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); + if (data == nullptr) { + throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); + } + channels = STBI_rgb; + img = std::vector(data, data + (static_cast(width * height * channels))); + stbi_image_free(data); + if (std::cmp_not_equal(width, height)) { + throw std::runtime_error("width != height: "); + } + } + + TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); + } + + bool CheckTestOutputData(OutType &output_data) final { + return (input_data_ == output_data); + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_ = 0; +}; + +namespace { + +TEST_P(KonovalovSRunFuncTestsProcesses2, 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_konovalov_s_seidel_iterative_method), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_konovalov_s_seidel_iterative_method)); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kPerfTestName = KonovalovSRunFuncTestsProcesses2::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, KonovalovSRunFuncTestsProcesses2, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/tests/performance/main.cpp b/tasks/konovalov_s_seidel_iterative_method/tests/performance/main.cpp new file mode 100644 index 0000000000..fa2a1f4634 --- /dev/null +++ b/tasks/konovalov_s_seidel_iterative_method/tests/performance/main.cpp @@ -0,0 +1,40 @@ +#include + +#include "konovalov_s_seidel_iterative_method/common/include/common.hpp" +#include "konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp" +#include "konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp" +#include "util/include/perf_test_util.hpp" + +namespace konovalov_s_seidel_iterative_method { + +class ExampleRunPerfTestProcesses2 : 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(ExampleRunPerfTestProcesses2, RunPerfModes) { + ExecuteTest(GetParam()); +} + +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_konovalov_s_seidel_iterative_method); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = ExampleRunPerfTestProcesses2::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses2, kGtestValues, kPerfTestName); + +} // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_symbol_count/mpi/src/ops_mpi.cpp b/tasks/konovalov_s_symbol_count/mpi/src/ops_mpi.cpp new file mode 100644 index 0000000000..c191f89f6b --- /dev/null +++ b/tasks/konovalov_s_symbol_count/mpi/src/ops_mpi.cpp @@ -0,0 +1,56 @@ +#include "konovalov_s_symbol_count/mpi/include/ops_mpi.hpp" + +#include + +#include +#include + +#include "konovalov_s_symbol_count/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace konovalov_s_symbol_count { + +KonovalovSSymbolCountMPI::KonovalovSSymbolCountMPI(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool KonovalovSSymbolCountMPI::ValidationImpl() { + return true; +} + +bool KonovalovSSymbolCountMPI::PreProcessingImpl() { + return true; +} + +bool KonovalovSSymbolCountMPI::RunImpl() { + InType &line = GetInput(); + std::size_t line_length = line.length(); + + int rank = 0; + int size = 1; + + MPI_COMM_rank(MPI_COMM_WORLD, &rank); + MPI_COMM_size(MPI_COMM_WORLD, &size); + + int process_line_lenth = line_length/size; + + int process_symbols_count = 0; + + for (std::uint32_t i = rank; i < process_line_lenth*rank; i++){ + if(isalnum(line[i]) && !isdigit(line[i])) process_symbols_count++; + } + + int general_symbols_count = 0; + + MPI_Bcast(&general_symbols_count, 1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Reduce(&general_symbols_count, 1, MPI_INT, 0, MPI_COMM_WORLD); + return true; +} + +bool KonovalovSSymbolCountMPI::PostProcessingImpl() { + return true; +} + +} // namespace konovalov_s_symbol_count From 9e773b9427201ee24e9daa0529be850e089a9822 Mon Sep 17 00:00:00 2001 From: SergeyK Date: Fri, 5 Dec 2025 15:00:02 +0000 Subject: [PATCH 2/7] Seq version of task 2 --- .../common/include/common.hpp | 6 +- .../data/sys_1.txt | 1 + .../mpi/src/ops_mpi.cpp | 47 ++----------- .../seq/include/ops_seq.hpp | 6 ++ .../seq/src/ops_seq.cpp | 56 ++++++++------- .../tests/functional/main.cpp | 69 ++++++++++++------- .../tests/performance/main.cpp | 5 +- .../mpi/src/ops_mpi.cpp | 56 --------------- 8 files changed, 91 insertions(+), 155 deletions(-) create mode 100644 tasks/konovalov_s_seidel_iterative_method/data/sys_1.txt delete mode 100644 tasks/konovalov_s_symbol_count/mpi/src/ops_mpi.cpp diff --git a/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp b/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp index f5c3b8becb..8805487d56 100644 --- a/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp +++ b/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp @@ -7,9 +7,9 @@ namespace konovalov_s_seidel_iterative_method { -using InType = int; -using OutType = int; -using TestType = std::tuple; +using InType = std::tuple>, std::vector, int>; +using OutType = std::vector; +using TestType = std::string; using BaseTask = ppc::task::Task; } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/data/sys_1.txt b/tasks/konovalov_s_seidel_iterative_method/data/sys_1.txt new file mode 100644 index 0000000000..857a668f9d --- /dev/null +++ b/tasks/konovalov_s_seidel_iterative_method/data/sys_1.txt @@ -0,0 +1 @@ +3 3 3.1 1.9 7.5 2.8 3.1 3.8 1.9 2.1 4.8 0.2 2.1 5.6 -1.235 -1.431 4.230 \ No newline at end of file diff --git a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp index 9f9c416cb1..aa013ec7b6 100644 --- a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp @@ -13,60 +13,23 @@ namespace konovalov_s_seidel_iterative_method { KonovalovSSeidelMethodMPI::KonovalovSSeidelMethodMPI(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; - GetOutput() = 0; + GetOutput() = std::vector(3, 0.0); } bool KonovalovSSeidelMethodMPI::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); + return true; } bool KonovalovSSeidelMethodMPI::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; + return true; } bool KonovalovSSeidelMethodMPI::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; + return true; } bool KonovalovSSeidelMethodMPI::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; + return true; } } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp b/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp index 28810c8fca..793d40a4eb 100644 --- a/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp +++ b/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp @@ -13,6 +13,12 @@ class KonovalovSSeidelMethodSEQ : public BaseTask { explicit KonovalovSSeidelMethodSEQ(const InType &in); private: + int size; + std::vector> A; + std::vector B; + int max_iter; + int iter; + bool ValidationImpl() override; bool PreProcessingImpl() override; bool RunImpl() override; diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp index b9187c65e7..37439af47c 100644 --- a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp @@ -11,50 +11,54 @@ namespace konovalov_s_seidel_iterative_method { KonovalovSSeidelMethodSEQ::KonovalovSSeidelMethodSEQ(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; - GetOutput() = 0; + GetOutput() = std::vector(size, 0.0); } bool KonovalovSSeidelMethodSEQ::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); + /* + if(std::get<3>(GetInput()) < 0) return false; + if(std::get<2>(GetInput()).size() != std::get<0>(GetInput()) || + std::get<1>(GetInput()).size() != std::get<0>(GetInput())) + return false;*/ + return true; } bool KonovalovSSeidelMethodSEQ::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; + size = std::get<0>(GetInput()); + A.resize(size, std::vector(size, 0.0)); + A = std::get<1>(GetInput()); + B.resize(size); + B = std::get<2>(GetInput()); + iter = std::get<3>(GetInput()); + return true; } bool KonovalovSSeidelMethodSEQ::RunImpl() { - if (GetInput() == 0) { - return false; - } + std::vector X(size, 0.0), X_new(size, 0.0); + + while (iter != 0){ - 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; + for(int i = 0; i < size; i++){ + X_new[i] = B[i]/A[i][i]; + + for(int j = 0; j < size; j++){ + if(j == i) continue; + X_new[i] -= (A[i][j]/A[i][i]) * X[i]; + X[i] = round(X_new[i]*1000)/1000; } } - } + iter--; - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; + } - if (counter != 0) { - GetOutput() /= counter; - } - return GetOutput() > 0; + + GetOutput() = X; + return true; } bool KonovalovSSeidelMethodSEQ::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; + return true; } } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp b/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp index 97e2622638..23995c67cc 100644 --- a/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp @@ -23,36 +23,54 @@ namespace konovalov_s_seidel_iterative_method { class KonovalovSRunFuncTestsProcesses2 : 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); + int fndot = test_param.find("."); + return test_param.substr(0, fndot); } protected: void SetUp() override { - int width = -1; - int height = -1; - int channels = -1; - std::vector img; - // Read image in RGB to ensure consistent channel count - { - std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_konovalov_s_seidel_iterative_method, "pic.jpg"); - auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); - if (data == nullptr) { - throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); - } - channels = STBI_rgb; - img = std::vector(data, data + (static_cast(width * height * channels))); - stbi_image_free(data); - if (std::cmp_not_equal(width, height)) { - throw std::runtime_error("width != height: "); - } + TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + std::string data4test = ppc::util::GetAbsoluteTaskPath(PPC_SETTINGS_konovalov_s_seidel_iterative_method, params); + + std::string raw_data; + std::ifstream in(data4test); + std::vector segmlist; + + while(std::getline(in, raw_data, ' ')){ + segmlist.push_back(raw_data); } - TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); + int _size = (int)raw_data[0]; + int _iter = (int)raw_data[1]; + std::vector> _A(_size, std::vector(_size, 0.00)); + std::vector _B(_size, 0.00); + + size_t count = 2; + + for(int i = 0; i < _size; i++){ + for(int j = 0; j < _size; j++){ + _A[i][j] = (double)raw_data[count]; + count++; + } + } + + for(int i = 0; i < _size; i++){ + _B[i] = (double)raw_data[count]; + count++; + } + + input_data_ = std::make_tuple(_size, _A, _B, _iter); + + correct_output.resize(_size, 0.000); + + for(int i = 0; i < _size; i++){ + correct_output[i] = (double)raw_data[count]; + count++; + } } bool CheckTestOutputData(OutType &output_data) final { - return (input_data_ == output_data); + return correct_output == output_data; } InType GetTestInputData() final { @@ -60,16 +78,17 @@ class KonovalovSRunFuncTestsProcesses2 : public ppc::util::BaseRunFuncTests kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; +const std::array kTestParam = {"sys_1.txt"}; const auto kTestTasksList = std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_konovalov_s_seidel_iterative_method), @@ -79,7 +98,7 @@ const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); const auto kPerfTestName = KonovalovSRunFuncTestsProcesses2::PrintFuncTestName; -INSTANTIATE_TEST_SUITE_P(PicMatrixTests, KonovalovSRunFuncTestsProcesses2, kGtestValues, kPerfTestName); +INSTANTIATE_TEST_SUITE_P(LinearSysOfEqFromFileF, KonovalovSRunFuncTestsProcesses2, kGtestValues, kPerfTestName); } // namespace diff --git a/tasks/konovalov_s_seidel_iterative_method/tests/performance/main.cpp b/tasks/konovalov_s_seidel_iterative_method/tests/performance/main.cpp index fa2a1f4634..d25e6e4599 100644 --- a/tasks/konovalov_s_seidel_iterative_method/tests/performance/main.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/tests/performance/main.cpp @@ -10,13 +10,12 @@ namespace konovalov_s_seidel_iterative_method { class ExampleRunPerfTestProcesses2 : public ppc::util::BaseRunPerfTests { const int kCount_ = 100; InType input_data_{}; - + std::vector s; void SetUp() override { - input_data_ = kCount_; } bool CheckTestOutputData(OutType &output_data) final { - return input_data_ == output_data; + return output_data == s; } InType GetTestInputData() final { diff --git a/tasks/konovalov_s_symbol_count/mpi/src/ops_mpi.cpp b/tasks/konovalov_s_symbol_count/mpi/src/ops_mpi.cpp deleted file mode 100644 index c191f89f6b..0000000000 --- a/tasks/konovalov_s_symbol_count/mpi/src/ops_mpi.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "konovalov_s_symbol_count/mpi/include/ops_mpi.hpp" - -#include - -#include -#include - -#include "konovalov_s_symbol_count/common/include/common.hpp" -#include "util/include/util.hpp" - -namespace konovalov_s_symbol_count { - -KonovalovSSymbolCountMPI::KonovalovSSymbolCountMPI(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool KonovalovSSymbolCountMPI::ValidationImpl() { - return true; -} - -bool KonovalovSSymbolCountMPI::PreProcessingImpl() { - return true; -} - -bool KonovalovSSymbolCountMPI::RunImpl() { - InType &line = GetInput(); - std::size_t line_length = line.length(); - - int rank = 0; - int size = 1; - - MPI_COMM_rank(MPI_COMM_WORLD, &rank); - MPI_COMM_size(MPI_COMM_WORLD, &size); - - int process_line_lenth = line_length/size; - - int process_symbols_count = 0; - - for (std::uint32_t i = rank; i < process_line_lenth*rank; i++){ - if(isalnum(line[i]) && !isdigit(line[i])) process_symbols_count++; - } - - int general_symbols_count = 0; - - MPI_Bcast(&general_symbols_count, 1, MPI_INT, 0, MPI_COMM_WORLD); - MPI_Reduce(&general_symbols_count, 1, MPI_INT, 0, MPI_COMM_WORLD); - return true; -} - -bool KonovalovSSymbolCountMPI::PostProcessingImpl() { - return true; -} - -} // namespace konovalov_s_symbol_count From 0a380411d9cb73efd25b5b2cb09c20262e962c1f Mon Sep 17 00:00:00 2001 From: SergeyK Date: Fri, 19 Dec 2025 16:16:25 +0000 Subject: [PATCH 3/7] Generation matrix add, updated result calculation and test data loading --- .../common/include/common.hpp | 4 +- .../data/sys_1.txt | 2 +- .../data/sys_2.txt | 1 + .../data/sys_3.txt | 1 + .../mpi/include/ops_mpi.hpp | 8 + .../mpi/src/ops_mpi.cpp | 62 +++++++- .../seq/include/ops_seq.hpp | 13 +- .../seq/src/ops_seq.cpp | 72 ++++++--- .../tests/functional/main.cpp | 64 +++----- tasks/test/a.out | Bin 0 -> 67504 bytes tasks/test/main.cpp | 103 ++++++++++++ tasks/test/sys_1.txt | 1 + tasks/test/sys_2.txt | 1 + tasks/test/sys_3.txt | 1 + tasks/test2/a.out | Bin 0 -> 52432 bytes tasks/test2/main.cpp | 148 ++++++++++++++++++ tasks/test2/sys_1.txt | 1 + tasks/test2/sys_2.txt | 1 + tasks/test2/sys_3.txt | 1 + tasks/test3/a.out | Bin 0 -> 16352 bytes tasks/test3/main.cpp | 47 ++++++ tasks/test4/a.out | Bin 0 -> 24744 bytes tasks/test4/main.cpp | 60 +++++++ 23 files changed, 517 insertions(+), 74 deletions(-) create mode 100644 tasks/konovalov_s_seidel_iterative_method/data/sys_2.txt create mode 100644 tasks/konovalov_s_seidel_iterative_method/data/sys_3.txt create mode 100644 tasks/test/a.out create mode 100644 tasks/test/main.cpp create mode 100644 tasks/test/sys_1.txt create mode 100644 tasks/test/sys_2.txt create mode 100644 tasks/test/sys_3.txt create mode 100644 tasks/test2/a.out create mode 100644 tasks/test2/main.cpp create mode 100644 tasks/test2/sys_1.txt create mode 100644 tasks/test2/sys_2.txt create mode 100644 tasks/test2/sys_3.txt create mode 100644 tasks/test3/a.out create mode 100644 tasks/test3/main.cpp create mode 100644 tasks/test4/a.out create mode 100644 tasks/test4/main.cpp diff --git a/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp b/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp index 8805487d56..67c2074a10 100644 --- a/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp +++ b/tasks/konovalov_s_seidel_iterative_method/common/include/common.hpp @@ -7,9 +7,9 @@ namespace konovalov_s_seidel_iterative_method { -using InType = std::tuple>, std::vector, int>; +using InType = int; using OutType = std::vector; -using TestType = std::string; +using TestType = std::tuple; using BaseTask = ppc::task::Task; } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/data/sys_1.txt b/tasks/konovalov_s_seidel_iterative_method/data/sys_1.txt index 857a668f9d..ef2c91e5a3 100644 --- a/tasks/konovalov_s_seidel_iterative_method/data/sys_1.txt +++ b/tasks/konovalov_s_seidel_iterative_method/data/sys_1.txt @@ -1 +1 @@ -3 3 3.1 1.9 7.5 2.8 3.1 3.8 1.9 2.1 4.8 0.2 2.1 5.6 -1.235 -1.431 4.230 \ No newline at end of file +3 5 10 1 1 2 10 1 2 2 10 12 13 14 1 1 1 \ No newline at end of file diff --git a/tasks/konovalov_s_seidel_iterative_method/data/sys_2.txt b/tasks/konovalov_s_seidel_iterative_method/data/sys_2.txt new file mode 100644 index 0000000000..98202614a1 --- /dev/null +++ b/tasks/konovalov_s_seidel_iterative_method/data/sys_2.txt @@ -0,0 +1 @@ +3 100 4 -1 1 1 6 2 -1 -2 5 4 9 2 1 1 1 \ No newline at end of file diff --git a/tasks/konovalov_s_seidel_iterative_method/data/sys_3.txt b/tasks/konovalov_s_seidel_iterative_method/data/sys_3.txt new file mode 100644 index 0000000000..f1b1f72a70 --- /dev/null +++ b/tasks/konovalov_s_seidel_iterative_method/data/sys_3.txt @@ -0,0 +1 @@ +4 10 20.9 1.2 2.1 0.9 1.2 21.2 1.5 2.5 2.1 1.5 19.8 1.3 0.9 2.5 1.3 32.1 21.7 27.46 28.76 49.72 0.8 1 1.2 1.4 \ No newline at end of file diff --git a/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp b/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp index c0da5bf315..b1460a8b6e 100644 --- a/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp +++ b/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp @@ -13,10 +13,18 @@ class KonovalovSSeidelMethodMPI : public BaseTask { explicit KonovalovSSeidelMethodMPI(const InType &in); private: + int size; + std::vector A; + std::vector B; + int max_iter; + int iter; + bool ValidationImpl() override; bool PreProcessingImpl() override; bool RunImpl() override; bool PostProcessingImpl() override; + std::vector IterationProcess(std::vector &_A, std::vector &_B, double X0, int _iter, + double _epsi); }; } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp index aa013ec7b6..7900113dd8 100644 --- a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp @@ -17,15 +17,75 @@ KonovalovSSeidelMethodMPI::KonovalovSSeidelMethodMPI(const InType &in) { } bool KonovalovSSeidelMethodMPI::ValidationImpl() { + // size = std::get<0>(GetInput()); + // A.resize(size, 0.0); + // A = std::get<1>(GetInput()); + // B.resize(size); + // B = std::get<2>(GetInput()); + // iter = std::get<3>(GetInput()); return true; } bool KonovalovSSeidelMethodMPI::PreProcessingImpl() { + if (A.size() == 0 || B.size() == 0 || size == 0 || iter == 0) { + return false; + } + for (int i = 0; i < size; i++) { + if (A[i * size + i] == 0) { + return false; + } + } return true; } +std::vector KonovalovSSeidelMethodMPI::IterationProcess(std::vector &_A, std::vector &_B, + double X0, int _iter, double _epsi) { + double epsi = _epsi; + int iter = _iter; + std::vector X(_B.size(), X0); + + while (iter != 0) { + bool flag = true; + + std::vector X_new(_B.size(), 0.0); + for (long unsigned int i = 0; i < _B.size(); i++) { + X_new[i] = _B[i] / _A[i * _B.size() + i]; + for (long unsigned int j = 0; j < _B.size(); j++) { + if (j == i) { + continue; + } + X_new[i] -= (_A[i * _B.size() + j] / _A[i * _B.size() + i]) * X[j]; + } + + flag = flag && (std::fabs(X_new[i] - X[i]) < epsi); + + X[i] = round(X_new[i] * 1000) / 1000; + } + iter--; + + if (flag) { + break; + } + } + + return X; +} + bool KonovalovSSeidelMethodMPI::RunImpl() { - return true; + int rank = 0; + int size = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + // MPI_Datatype custom_vec; + if (rank == 0) { + } + + MPI_Barrier(MPI_COMM_WORLD); + + MPI_Finalize(); + // GetOutput() = + return true; } bool KonovalovSSeidelMethodMPI::PostProcessingImpl() { diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp b/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp index 793d40a4eb..f854d38f34 100644 --- a/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp +++ b/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp @@ -13,16 +13,21 @@ class KonovalovSSeidelMethodSEQ : public BaseTask { explicit KonovalovSSeidelMethodSEQ(const InType &in); private: - int size; - std::vector> A; + int size = 0; + std::vector A; std::vector B; - int max_iter; - int iter; + int max_iter = 0; + int iter = 0; bool ValidationImpl() override; bool PreProcessingImpl() override; bool RunImpl() override; bool PostProcessingImpl() override; + static std::vector IterationProcess(std::vector &_A, std::vector &_B, double X0, int _iter, + double _epsi); + void InitMatrixA(long unsigned int size, int fmax, std::vector &A); + void InitMatrixB(long unsigned int size, int fmax, std::vector &B); + }; } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp index 37439af47c..bd5b0ab7c3 100644 --- a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp @@ -15,46 +15,76 @@ KonovalovSSeidelMethodSEQ::KonovalovSSeidelMethodSEQ(const InType &in) { } bool KonovalovSSeidelMethodSEQ::ValidationImpl() { - /* - if(std::get<3>(GetInput()) < 0) return false; - if(std::get<2>(GetInput()).size() != std::get<0>(GetInput()) || - std::get<1>(GetInput()).size() != std::get<0>(GetInput())) - return false;*/ + if(GetInput() < 3) return false; return true; } bool KonovalovSSeidelMethodSEQ::PreProcessingImpl() { - size = std::get<0>(GetInput()); - A.resize(size, std::vector(size, 0.0)); - A = std::get<1>(GetInput()); - B.resize(size); - B = std::get<2>(GetInput()); - iter = std::get<3>(GetInput()); + size = GetInput(); + return true; } -bool KonovalovSSeidelMethodSEQ::RunImpl() { - std::vector X(size, 0.0), X_new(size, 0.0); +void KonovalovSSeidelMethodSEQ::InitMatrixA(long unsigned int size, int fmax, std::vector &A) { + A.resize(size*size, 0.0); + double x = 1 + rand() % fmax; + for (long unsigned int i = 0; i < size; i++) { + if (i != 0) { + A[i * size + i - 1] = x; + } + if (i != size) { + A[i * size + i + 1] = x; + } + A[i * size + i] = x * 2 + 1; + } +} + +void KonovalovSSeidelMethodSEQ::InitMatrixB(long unsigned int size, int fmax, std::vector &B) { + for (long unsigned int i = 0; i < size; i++) { + B[i] = 1 + rand() % fmax; + } +} - while (iter != 0){ +std::vector KonovalovSSeidelMethodSEQ::IterationProcess(std::vector &_A, std::vector &_B, double X0, int _iter, + double _epsi) { + double epsi = _epsi; + int iter = _iter; + std::vector X(_B.size(), X0); - for(int i = 0; i < size; i++){ - X_new[i] = B[i]/A[i][i]; + std::vector X_new(_B.size(), 0.0); - for(int j = 0; j < size; j++){ - if(j == i) continue; - X_new[i] -= (A[i][j]/A[i][i]) * X[i]; - X[i] = round(X_new[i]*1000)/1000; + while (iter != 0) { + bool flag = true; + for (long unsigned int i = 0; i < _B.size(); i++) { + X_new[i] = _B[i] / _A[i * _B.size() + i]; + for (long unsigned int j = 0; j < _B.size(); j++) { + if (j == i) { + continue; + } + X_new[i] -= (_A[i * _B.size() + j] / _A[i * _B.size() + i]) * X[j]; } + + flag = flag && (std::fabs(X_new[i] - X[i]) < epsi); + + X[i] = round(X_new[i] * 1000) / 1000; } iter--; + if (flag) break; } + return X; +} +bool KonovalovSSeidelMethodSEQ::RunImpl() { + std::vector A(size*size, 0.0); + std::vector B(size, 0.0); + InitMatrixA(GetInput(), 100, A); + InitMatrixB(GetInput(), 100, B); + GetOutput() = IterationProcess(A, B, 0, iter, 0.001); - GetOutput() = X; return true; + } bool KonovalovSSeidelMethodSEQ::PostProcessingImpl() { diff --git a/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp b/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp index 23995c67cc..1158d87c29 100644 --- a/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp @@ -23,54 +23,21 @@ namespace konovalov_s_seidel_iterative_method { class KonovalovSRunFuncTestsProcesses2 : public ppc::util::BaseRunFuncTests { public: static std::string PrintTestParam(const TestType &test_param) { - int fndot = test_param.find("."); - return test_param.substr(0, fndot); + std::string test_name = std::get<0>(test_param); + return test_name; } protected: void SetUp() override { TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - std::string data4test = ppc::util::GetAbsoluteTaskPath(PPC_SETTINGS_konovalov_s_seidel_iterative_method, params); - - std::string raw_data; - std::ifstream in(data4test); - std::vector segmlist; - - while(std::getline(in, raw_data, ' ')){ - segmlist.push_back(raw_data); - } - - int _size = (int)raw_data[0]; - int _iter = (int)raw_data[1]; - std::vector> _A(_size, std::vector(_size, 0.00)); - std::vector _B(_size, 0.00); - - size_t count = 2; - - for(int i = 0; i < _size; i++){ - for(int j = 0; j < _size; j++){ - _A[i][j] = (double)raw_data[count]; - count++; - } - } - - for(int i = 0; i < _size; i++){ - _B[i] = (double)raw_data[count]; - count++; - } - - input_data_ = std::make_tuple(_size, _A, _B, _iter); - - correct_output.resize(_size, 0.000); - - for(int i = 0; i < _size; i++){ - correct_output[i] = (double)raw_data[count]; - count++; - } + + int _size = std::get<1>(params); + input_data_ = _size; + incorrect_output.resize(_size, 0.0); } bool CheckTestOutputData(OutType &output_data) final { - return correct_output == output_data; + return output_data != incorrect_output; } InType GetTestInputData() final { @@ -79,7 +46,7 @@ class KonovalovSRunFuncTestsProcesses2 : public ppc::util::BaseRunFuncTests kTestParam = {"sys_1.txt"}; +const std::array kTestParam = {std::make_tuple("sys_1", 3), std::make_tuple("sys_2", 6), + std::make_tuple("sys_3", 10)}; + +const auto kTestTasksList = std::tuple_cat(ppc::util::AddFuncTask( + kTestParam, PPC_SETTINGS_konovalov_s_seidel_iterative_method), + ppc::util::AddFuncTask( + kTestParam, PPC_SETTINGS_konovalov_s_seidel_iterative_method)); -const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_konovalov_s_seidel_iterative_method), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_konovalov_s_seidel_iterative_method)); +// const auto kTestTasksList = +// std::tuple_cat( +// ppc::util::AddFuncTask(kTestParam, +// PPC_SETTINGS_konovalov_s_seidel_iterative_method)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); diff --git a/tasks/test/a.out b/tasks/test/a.out new file mode 100644 index 0000000000000000000000000000000000000000..914b6a7d3909eeaccd530a4768e0be64b5b51d5d GIT binary patch literal 67504 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + int main(int argc, char const *argv[]) + { + std::string segmlist; + std::ifstream in("sys_3.txt"); + std::vector raw_data; + + while(std::getline(in, segmlist, ' ')){ + raw_data.push_back(segmlist); + } + + for(auto i: raw_data){ + std::cout << i << " "; + } + std::cout << std::endl; + + for(auto i: raw_data){ + + } + int _size = std::stoi(raw_data[0]); + + std::cout << _size << std::endl; + int _iter = std::stoi(raw_data[1]); + + std::vector> _A(_size, std::vector(_size, 0.00)); + std::vector _B(_size, 0.00); + + int count = 2; + + for(int i = 0; i < _size; i++){ + for(int j = 0; j < _size; j++){ + _A[i][j] = std::stod(raw_data[count]); + count++; + } + } + + for(int i = 0; i < _size; i++){ + _B[i] = std::stod(raw_data[count]); + std::cout << _B[i] << " "; + count++; + } + std::cout << std::endl; + auto input_data_ = std::make_tuple(_size, _A, _B, _iter); + double epsi = 0.001; + std::vector X(_size, 0.0); + + while(_iter != 0){ + bool flag = true; + + std::vector X_new(_size, 0.0); + for(int i = 0; i < _size; i++){ + + X_new[i] = _B[i]/_A[i][i]; + + for(int j = 0; j < _size; j++){ + if(j == i) continue; + X_new[i] -= (_A[i][j]/_A[i][i]) * X[j]; + } + + + flag = flag && (std::fabs(X_new[i] - X[i]) < epsi); + + std::cout << std::fabs(X_new[i] - X[i]) << std::endl; + X[i] = round(X_new[i]*1000)/1000; + + } + + std::cout << "Values "; + for(auto i: X){ + std::cout << i << " "; + } + for(auto i: X_new){ + std::cout << i << " "; + } + std::cout << std::endl; + _iter--; + + if(flag){ + return 0; + } + } + for(auto i: X){ + std::cout << i << " "; + } + std::cout << std::endl; + + return 0; + } + \ No newline at end of file diff --git a/tasks/test/sys_1.txt b/tasks/test/sys_1.txt new file mode 100644 index 0000000000..ef2c91e5a3 --- /dev/null +++ b/tasks/test/sys_1.txt @@ -0,0 +1 @@ +3 5 10 1 1 2 10 1 2 2 10 12 13 14 1 1 1 \ No newline at end of file diff --git a/tasks/test/sys_2.txt b/tasks/test/sys_2.txt new file mode 100644 index 0000000000..98202614a1 --- /dev/null +++ b/tasks/test/sys_2.txt @@ -0,0 +1 @@ +3 100 4 -1 1 1 6 2 -1 -2 5 4 9 2 1 1 1 \ No newline at end of file diff --git a/tasks/test/sys_3.txt b/tasks/test/sys_3.txt new file mode 100644 index 0000000000..f1b1f72a70 --- /dev/null +++ b/tasks/test/sys_3.txt @@ -0,0 +1 @@ +4 10 20.9 1.2 2.1 0.9 1.2 21.2 1.5 2.5 2.1 1.5 19.8 1.3 0.9 2.5 1.3 32.1 21.7 27.46 28.76 49.72 0.8 1 1.2 1.4 \ No newline at end of file diff --git a/tasks/test2/a.out b/tasks/test2/a.out new file mode 100644 index 0000000000000000000000000000000000000000..e547ad02d4ddac5cb8f3899197069fc2be1b00a1 GIT binary patch literal 52432 zcmeHw3wTu3wf~twBqESN)#9TvJ_|+COcF3?)$kaY$ip-bMJpaAGm~U=GLudw5L&R2 zkY1)CZ7u~%)wZ;?Ew}A0)M_uaR-;gZULWysZM4>=mbMe28m-m%sPq4=z1KeH%*h-; z^#A%kj!xFu>$TTjd+oI!=gjaW@6ts%E|;dRG1_ICD4i!UTE^DdTU1+8+TzE#X`gNHsY@d{ey$T#ilB)xreCfvd8E>ewQJIP%nx1Hs-vz&r% z_NRi%pQMI9Wvtf@i$J4GLAzWd%h};VDW)k%bZ@eA-K&He%?@k00tHol zpM@Oxjw#{lQn=@-pX<bmA|(dO_$|m$gfq%e(zrdm1 z_Z;-x>R|sx4*X9#;IBu$lR>jzQyu))=wRom4)|vs?7RjQX7lHl9rXOeLC+)yJJ&sHW?I zHosmUj`}0vFN9DGx5NU)C18msVi7Iwj|PE+K;T9_(0HR>?+-_S2*u;km>!7*{E2WZ zsx^h0nqsR-oV589p|)@Wg@&eBlq=IUy`pBB9t_1p4dIqVC|N)TSsy~)WudFU*VNWSHyq=Y3Ydy?_ zr^pb!BG#f`*&K>C#e#4-Ikr?eHXL1z00`>-ctdMbD4LMYg?$a71m?C-w&qDUSlWnw zwYKphy~??TXhijFy~d+^y{bLbE0v3?s$LaYu^6x9)Z zfkxR94|-pRJ3rZUE@&hLEUL)Q3UC{TGk5iX_tz2#o5e z+US}v7^^}p2ulrJ+mZ+dX3nG~)*LD}8FwVzLM0F30}{V@X~p~ndU0WK;cRX3f(3d> zVG+X;@CoXQ6~LAjmK19XR;-veze4vEmK4s-pcUJS9t*3LQQo7vk}~7A)VM1tMLN#G zS}g}_@G)2uo}i7xXAJ(Mzb9yU+KGZbMjMavNsJ}V3Bc##zcEdy)oC|6-h9zX1GWwOq0JA^sD@!j$wi z<1>Hc8>nc4mJd4N);_rl^5eC$R9VnZ)Mj$|^P+r$b}^Tq-gP7HaN>ydQDugbk&lXzNNt2H%Y_FM4dC5!mmZ^7qV@Bp( z1&_cpuIU#1Bm;~6vIS4^sje~$-nvdMx8SYoH=hMhYdCdPTJW?#RM!d%{uG4-TxG$Z zYQZ;J@O&g8sLdAqX%_xA3;uKqzTJX9!-C&r!GFSn@3G*|vf#H{@NNr!hXrq4$L_S? z&$aOHw%~c_3hEvU{sIgC@!R7bIPQVt9ysoS;~qHff#V)H?t$YTIPQVt9ysoS>>l_> z{#oz%Iu7Oex^kb3X_~LIH<6R>_jT;c+baapvu}-RTKfFk@i%{3xkmhrL>YQ1ole*H zh%y}<3_WF*>A+yDRWjY8Lnqrpe0AMJ`Eay}C_4keT(m}w`OJhJWZzvrHTPq3@Yx+TaguG0U{EAKGA+X+u90H_LROG*oAnX=6WB zWtM3}KQ!Mg(?))%*euga6+`EkW!lgWO)<*p^M8nE$o2Wt7HXouQI2GmzilhuVk>{u zR{pZBe3Pxb+E$L*%JsJL^|ta=w(@dYd6BJrnXNp>RxY%aFR+!*vXxJ@l_%NCC)mpG z-mlEh?+865 zJl*<|e@RU6bzQm$g;d4A(&l6|Q%ROm}S*tLu>!}F5+eaQ#lkh}2;kuUiWTJxP7 z=&mm{G(poI-YaXCs#1_h`I6AXx;7&>^z=L|?ddpFpe!WuH;|V=Qt}zJN2y5<@1^F6 zrgR)Cf@mt)dcc>g9Y}@VOQ*m2*7^g<{*GQ(eg3PxujhXXpUJ4W&pS*VH1r_(v19$P zmMD2Wzo2#m)Y^Vw9z=ZkyS&4`?#eU}1HR<5WX_*p4srH_vjF&E-zDCZ5MD{bD@O^t zEW&q4;guvj6+lX!6~d1E z4MpS;i%Y6~Hy_$5VrBg%U$V8`m)zC{7D#qB117s8vedl_FzD+Vd;WC6?M->$se(>I zgW0>YtCKjB-mSiFZ$J93x2MO~)k(U@D+kfX)a%_ayn7pIhDoTfFZEBN2$8Ol>@tj=BXm`|NNhX$ntToi39)xh5@IAO#9q(8p4=_& zxf;fbG*FEr${F^2ooI_Jb4GkOb&iedMKd^e-9$J4L%-utt-{k%JsJf<`s&a3K z`0M%C?63Fb-$Z|+y{WY$SlFQ03zfO+NIlTQ@Etyr@6Kx6vsiI~TM)ri)ZyJOVkyHH zPlCzx#kEM99Zg$Z!XM*)O|~A){WV#x0(>#d?0DDJI=*B5RxQ8tX{0b@)!=M!h^#sz zM0b6u3fN2O*Si(yH+2(L zj*8y|G(|*;C?S!9;}n*2(w{M>XVEi<_52JlHG>Mo-?ehYoPFFhy^yVN;s~Ia2?wxJ zcACAOLH8f!>_w@XURX{3=27bO>!Hwz(451iEk8>pB^XQ{#a7o%sdN&_26kp^+LM4 zQ{qKm-$eo6-OYqSQs*XhQcs-pbQSnIUY_dfn&NYbhBM0J;Ys?LK^80bx&j!UW;!+4B!%*K z_4)$)(F{TveiRKp1+^Vnpk4Sw2pmAWM+;=AUuAOt^2prfCif=cQ<)5sog-+pF==+D z3>WwUSgdr*jIoW-Xpv|b+!e*{5=B8o@eH)Cr?2w>m@sb|cAL5k&#;~yrZMlLgQWW~ zVRdgK%6%BhqE|%s_H_F5}qq5;%(I2;tC4xw@y~qXCtE7D34KOAjL~_Af zOwcHj%k}?I{YBpF658(}^}e@W^Ch43B_EOIbfjFcXzqipr$OUux|HwAeM{W+r4~bt zuR}_!5vzmTJ%-?YEI5e-yTu^857|*P^mzkX~c}r&msPSsh^rbGuP9McV;o`p3cU}|K^>VQY3P3IA;wPo-DlSfy#da>9D2qF| z_ztC$%zT-@@o6++=wbX(S=uHs^iEVgseD~mh0IERY1Mj+`YNhKoL1^1-ZQ9&eX-UbxV4kG1+ zImk6g)5(HV847)9_2_(@`ULT5oxQCSQ&Vt@`DLVQO0ocX+t?uOL2!HtpR{kTcjTs% zXqC}Ux9c+29dg4|jiaPS7_bKm?%mjk?DQpZ~=bl>1eR zgy~|*kZeU~)D9pL`q4ftA;c~dIFTg&O2Zc0=PvRTtc78JOo_481(~j8gR;58-g{y1 z!LyWa*$w|<-@+rquP7H1k7Zj7MYM~>3Qn|`6j#A=3b+$t7u<;!ie(L;&?{{F2F~%w z-9mI5>QTdj_wv@D9`W>|Whul3GzsZC>0KzS9kH(29{GDZZS42m*)HPtIZqJV(Czcub%R3K z46+xU+Fat@lfQ*FhG6PTEu#qD`1{1URH3np#QYc>g6q0-oA7QN@!g%GZlEyD+(2GR zY-T3N-n-OG(#iLd1=O3S-|75oR8k&K;fHw?VTxqam!fz0DIH}Oskw`6hu+x zOmMyM1_fN^tdjVfnpIRLyZKPR@ab=+BSx^Nb_=j=Du6Ze1}O461yA=Wgc_){)Qg4OjT?qr+gacr`?O$gyUNSrYCrN&F) zW`VBV1b)d;+k*kO9peFzQ}i?Nt2IS$r^+9}9+Fe^(!Yol-6!mm5ha}owv)xu1Y?yO z-K!pRENPX{f^Nj+r!mh?g6G;$PdbiTbz`O^IL9tWkC-- zJz%7x{EeSLObvYuf3nP48~x(z7AzQ2Qd*D{jrf|9d>=PwpV$Mvbs1Jq?wv#ZxN)uv>{Z&9G+d`Spnzul$hBp z%|zCH1$Cxo954>!QkUXhuKdXz#<|@?)KJ)X8OW($QQ_u&G+Hy~Vp@;fd}z>V6#J6h z1@M%0Fw->B@tdjSzx<6m#KMSskM;z7iy=G1*cV*VN!SHcO#Q2wrBFe~Xkv%sRE-C$^@%A}I}p=9Xs%qGqxMze`C z`6&%nN9u7BOh8r@djQUC^QjS{mq2-WMC2%i=~{uMqG9LTAc}^xwl7WoiI-Woo@n<} zn{Wti^59z2Q>LDuD?Mz~G8iR-;}GfM1Mu%*&;$Ohu|Ho*l$+PRIbH)B?oWfHr;F7^s$9X$6%(&~l(_wZEn zX-He98sW4qS*vt-i#S`&T;O-0nW_8mN49%!>M3gXXcv7>p!-r!6aR85+`MlP4Z~E! zyB+!J0Fo+pIJB*yt>#SZJ?IS$I)m$2Kd2=Z3KG1yUUa^(-NqKh@%-d!^drR?RMO_R zl9um$DpQV4(0=R8Mdv4b&}DSxqgu$oPx1(G5HN*u3UJuu!p2B!m!P|wc4ML^uE7RU z=Ix9_m)aL-d8~GHMaGU!ZsP`_90rO?sIpc)(tDi`5 zN_)U0W+vJW76>3l0~LwLhiNp0fe(u%!z*ss1r+Uju>VQY;TP?L#C8&Rk#4__8VrE~ zLx9u@eZmX7z+|d*;@WTFGPWbqN6HR5*HLXSc2sH?i~ectg{gb29VvIRAR(WUGw={o z^d$D6RKytocKWo;!f6UUB_Dkp`ybCENX6*rOa1FPaWB-hW~!?fMRa^O29p^8aYDn- zt^sr;97s`wqhP|~Bq2`6xdM|*7@SwMOj4MCV1hk37A4_!>vHYm!Xop$%xSlV&N9#J z?xNMd@L%Rm?GZFdb|Cq2Dta&lKa!<@eW~waY+BCjwumC!_`I=b!>XN3;gLi!BNd2o zI#cQqAv_2VAm*0g;~kcdjbsdcOFZn5FAQWTvIU zU-F3*{r-w+9gK6sxDhlDO`{w&Do@=H0rn5I#RvBNVDAOHQ@*&zumhZZsei}T`)KmT z+GoW;6EXDI|A>1b|5=h3UJ}LmqBtsF%onRwd%ie@m^1RlC&;*rd~p&m+4IHUgcYOm z1)9&Z=~0c+*N~xl__ZE0VN7=lif>~TXX(YSiDH(ZST7o^f?{+}B07x~8wIYIQ2zOh zN?Jy@Tc!r2+qn<6oIrst9HO2Z@JorJ-3Z}_ylEFA1!FGbvCb@5%2|j*N}a=wiZa-y zP6G_nt~E`w%*%L1gHzVK)Lw*>iyYG79dQf7CEnrIKhUwPS`!qAhOtakIxm%iti?2< zW_jk7YaSbm0U_8Z>kZRHl+82pNdpa`lyVNHdmg<=b*LVPPS7w&me&evXdVT3Uuuyw z4#j?K8<*m>T@3Zh3E8pFEtYlW91c?+LKK+>8mFSlS7a=wv+(cIR-`PG4dpp zD8-qphqDNy+-R9$50~lQLy)MM!0J_0;1(71rB1+hfIWLuYlru-a+dLv>A_J{j%P-a+Hj-Yg0nbU@Vrc5MMv9=oI2^evSU{~vROtmOuRi3djzh9h} zp;?(t`Za1-qcCGdfy`8tF+k)7V8pD3A2;RyvKQ~3=WnCMQqaUGb*L2stmObU|3>w(JEtEFE==K@M7G7f~R|YvdbfKyC~9(*=x?2 zPf;Iscn940lX45mOT7K9_u>xorICL#sz=SpFvfFN6-_kDiqX}V!d!=zP;x=nTec1v zu6oG(zRMxmz6+}yg2F9ocb?Jzo+(O<7~@82K@4De6N@u1-ntcwF7L=eT5zXO^p0Q= zMh;2k5r%rF^+1m$Gf|U_e3Q`}!B0zB6=3;??fGfk^RCCy^O47lo=5QZrOpJ>4EBsB z_n@9(;(3aqMZA-M&cMP(E}G9UnomK}24`(Yi+j-GO%Md^OLfpmZWqepbh#FEb+k;W z8tx%64G5?F63SZor*@ zdjR)Pr7z>F0>;|+C{x;I7-D1u_Yvaa$Ii_3^@3Jf7mSFpgD6&KYUs`G33Pgku|T0L z_O@Mg*h`&YWpnjQOGdAVd3vO`x-2PvpD5avuTK)v9CV{o%OH+Cu(%LM9+(i+{aRi8ECd{LFF=xWJk&exoaD`B8oe57ScH2xS zZQ+4W_AG}O4Rtg@3~!9AjI{^WKgN(gQW((_cn2RGNfg6MiGHx2J(~amwdz&cI`<=fMclgFg zZtd@>OYn~G!-A!kB_>FTup#jyL*iVPm@OrK#uCr}w@`4AA+gPncunkxvDT3i^!`6p zxl>By8WJ6b#QiMs3}@GirQG6v*S(aSt5#z;O>8_rU*G z9-!ZkY)QnzS{Ogv>(*MOG;GKYtfR6!g z0z4hN^4);*0s8^NfWv^d0v6zT)BzlOlmSk8I-PCPsVX#BVZ-qCctLEoq!tv_XF+*OaZGXAg>j2jQ zo;QH@0Tu)H0C>zXKE0z7jP`zRJsgr0G$We4!98T zS->FRI2^)m1e^tU2VgbeKEOJ_1Ay&-WAUz7dkX#n+z;pj9FJEH8v&~UHvxVba3|na z!2N&=@mlR6z#hN}_y*he051eQ0Js$JqJxMZzzu*~0e1u5MetBMP2YHX8*l`0Dc-j| z6Tc0y9`G}OI{~i)d=79OU<&Ydz^QmI{a(N-z!v}$fbRi*1Mo~NdmjY+4B!Q?A|3(D z0NVi<0`35;1MCHC1{?(33rIiC{sy2MFlQL?3>X0n0^SO^5%6BXI{?SN2EPG%01p6O z4mcL?wqFZ)9^e4rLcqTQ1_77hizOQYKL>aR;G=;10iOp<0j2=+@Gj%zf57j6ivWFq zHGqwPHv?`0{5s%Hz^4HB0}cYF02jXjdAt?d4mcg~@_)kbfDyn5;5Pv`1HK9PQ^0w6 znV}!>1;AmzmjMg#n;8@EYD5v>YQP#mdVeDU_zS?TfP;W{0lotG4B#0f>GT_b-vK=N zRE+Dl)9F$`x}a8Et}j$+uC@Z#8573k^1}Ff&0?w3y5RkIP?I<5jQy$O7F06$3bd{JGS@u@;? zLx`dAlM23^vtZ&06)*@zqW=`1a?sHgCViPne-!9q&=F!L{R)$Q27;(R6!c|e$M4~7s~w*)?YItl>K;j_KM8)rpLM3c)`5P*Vd%Gm{&~&m23io60u<}ShOb4F6Wq9Ue>GU{?kBt_dC0`xWJ$7?$#|b%akyX^DJjC({c-^=+ ze8z1e+;pbzw9?^|oNt@$S_+i-Ud3B2&N5-O!`kj4}!kj zO3#rA(hc0Bpl<>FJ61Z`xJ~Lf5BNs-e$o@^v>*3lzcj(Dhxo2G>zaynoDY0ntFD}K z!9e~h13d~lBGA-f$<-@BzYcWqo5?DcSD5i`Dy_4`JiX> z71=)mdh=oGpNe(q^`K`PBNSU@@Z(oNe;6?~b^)wVZCtKmYs@dlptspn5$0!pBsFe!B>y9XB_uq=|z8~GpEV$`)=5E7kJi#$E3>yLG9`X zeG1l}^Q`oBrr(D_F9n^(jVW*Dj)FY7uFaNnNq-UOUxfSxR(ZdvzY_GD4?}MT{og=$ ziklwLX+51SZrrGIH|Pn_)7JVacK>PG@CA=v+W6gh{w}C$2N{0^eBDL{k>c_QCiXb@gJ+4IXP#+iIe7jGo^0ckbkOgB zyaD>*`fDS2`tgQlg|!~`H|e+o^tVBGvX%U?A3W2s&vJ^}6zFq7pJ}b5-fTx6hTFo! z$WI5o7Ie)1=D4w}EqyFsWToF|>Td+S2J-m9CsRIQ(l>z~1^pZ=eWgj?33@Z==UVB! zeh}>ky#@4{Ryw!O4O|LzdTTgfr7x!ZBeOo~n1JcvKJYlj)Pa-xoAKCgKz#hN^_z3FU**UWVJ6HxUDK}4y1y9Bp;$-a7E`6Tkh#UB{{1+b1L?w+SzP~oKOLi+-8lE43yD@-`*E&77mhf@ zMgOiZUD$SstDPCe-T|1YjK^b%jElvzJztgR9H#d34Lv`gi>uR&fAfnQpzyoJglpPe z$&SRfS6r%ou~z{`weQ`uY#-PK>U}QnU`M98%s(=5`E{lI!^J4e(+PcGyT zTv}LEI)l-6$;`3~#j)CJ;`qZ#p*W;}BXTnbyqk$11I)%xahiisT67*WGH^3~l?`9Q zc$HU}U86G=mv)Bc?vWU>kFHvLTo_Gi+zTZBtiy-uRryNcH{r&mooeI}g(sNJ{vQEP zdR}Hbd3b8Qj2~gV*i!+wpYh|*#|Z(=!fw6l<}2!Dr-{~`zcI2@=_ zzZ7x5sQgq3e!^GU@YgWD*@mZQZp7bX!-p8ZlksEO&Knv3Qyc#Cz?1#=v;E?kC1kcS zzJMMA<8q6?n)WlsKP3)^HI1H8()D}B7cu|260MCezJ~D|7=IeZ1J(O1<9XWBiWy%d zHuZQm!TeV;zK!uq8Gi%g-E$;jGUI>1c#ZLH#{ZG=`&iEJC=n`t=&YXb zr!%99pFcS8m%|^#zlimy_}RwzVzx)c&j{n|Z2XHb!IB<3ekH~!&%bBG`k4QUMPq?E=R4GQW5} z0+t}-U$p7@9^>tCl{-P|Kg9gXZ%vF}#r>}Q_8{Xg;5b))n?6zMvB$}3#wVCxwd+O3 z|H0O-8DOCHj`7L%D*i2u-@tm7vOiy9{Ns$L=Wlea!305iwu?hIJV!&^)78iL_qjvj z60Hq0{uz!RRc~#9)bk!YK*iyg7~i}|D&QjtjehTt>V1Xr^H~3Lj4$H$s&O=avgH3V z?vZrT6o;8@D)-4leKYJa1ehR((ketM6I>MdU)5in0&<&3Xlyt3z8 zjNi)mYUckR#{Z4+477I{U(A71$o!|AD(iiN?NM=6&iGY~P<{(5Jja9b!&b)s2ji7J z1B{=={WX*8eTDJ%IB{bGLw;Dn{3;%nGd{_9gsZsLGk!ngIX!8AWV}5dYNks4Iaf;g zb6C%h8Gjz*&t?33j9<)nW&f1Zq@G)1*o@IX3@0T%t zN~KgViS;BH{|57`{n{N0Z|lb=7@uPPlUUD~Gi1GP*01`jjPWguSN`u{{2exXzQg!C z8Gi%of12@UepVt18UGsNuVB3L{}gPjso#5QB%|`@#f*lwfKYKc&GKF0VTGQY~7?=k*0#^1(z{74j}|5nxmHgWxo@%J)b zjf>|Pf58gLr}D|Cv5+P`Rg9m^dMX(oV7zMAI>z@fUfKUM#(&$!|2*UWoADc2f6@7} z-Yc(>h^HB^1MkwNXg9Bt2p8kGFn)s#|69g)*zhB)U!Cjav!0IuX4@B!#{$oVw`Iq! zVMYtc#y=JOn)Wem_bLk`Zf6QTQ#JefP^rM5W}K%fsVjh2v8`|f8-T~I#yB5Pw5S9B ze>mX(`YGBQA{qB64HDkt!2cZZlgXl0l5Z@F(GTQivvcAnv*SPIfNyiae+76I!(62R zKXBlGUEm9}^%qKRdIy%Sw;cE{o1WdyM&KvsoUYl=pIROGA8^3G>VPjpVmurAr?UU^ zq?uX`@KbUoYwA3h(b~0yR|N}P8F&?tnISqKXGQt8cap13V z!0&LtpMeP?oBmG$pUs|f2mWgv__gXlJmD#fX}a#O3+oAgg9b!PqP4!hFrWoP@lZp! z1z#c46HR&`5{rgfz!{9`4Ut%#KcWZmU9uM4-`b`HVolAFP$Cp8EXvNI*N3BF-5-zp z*Xp5YBED9ukNcZKda$*rX)Q!7C4BWPoXB9+udPmaF4D!9%k)GH42clFb=IWm*GAVg zRjvjMMk-fV>$q87od9Q`tprLVwwtClRU);+~_{+4h+Z%M?%(T0iu^mzh}el#rZ z4<}kG0^Vvr{&>BWO<__pSJxY&t)ylSs!hcF6_Ie@iZB>ziuB4wHG1We8joICSzV$p zY_2KRy_HJ>)wA`=rs}zDgr``)N_^Q)N6n#%AoK^lUK1OJ!xk2M$#$6RnXT*5&>CHQ zCC?AHg4sen8eJYkS61!?W?fn7nU*auw9S!U^ivHm)z}F_VxAs}1^f|BpO635J$)xo z)9I^-XspL0y0^)Xo@i?dS5+r$iljqq$Z(sNdfPLHwD=R@ShP7F3xrx)M$1%nl4 zv@98=yOc~(ezH}8CO1_r305tsF5)hUr5i+A`9PdU#T6 zad0fPI1im;(dJ;Y5e??Z5hMM>RAG*;k5H+pigM2Ak^RvatOm=6(q{PdqtG_DxwWMc z**9<_<^V)pW@7m;c5*g?3S}p!_c`&9$S{;hKDz2S@qD;h$-CU+(X0KdLwYD4kH$FC zK3bi!`#w^gJPCfZIzJ*ii}Wggv>~Ji8gHDVR}=6?XrUsOCvoKVKrGsl@JACBbxZ3! zUayP@b2vIL3>@=-T1H%?78f+6^`JlDKa$81R}&@pO@N^MO#pn!-&+}^33qgeqn^W0 zlbGAc7oot7av>K9MM=V#RkOEWsx_Ew3@~xn2EvC?|G&rPql@Qbv0Ds*i)aX7TU8&6 zukpu&6|`V9Hd#l#^z&X>qgO%DgGsU}hIuF+s>cR18VFTXm+9Wp#M0`x3bC%hrf{`o!!O3tsKo>2Sb5733#`>#fI-<9Y|*}7~ST2IkY z%rCS`(bX@>PzqJMF*9==X5JJ@_XrZyk@A;pXlEbyH()9eo+&QX_0}kDPvr~~lv7Sr z_hT|>3I@GmI>4T&iZ=gMh&0;yQ+tnLdMGxhhiu#bW9ptv2dm6=1mljSCUZztW95TA z-5i9XS5A2%TUhtr$5es2Pef;l#e`T#;Fv|m*GG{etowG;NloF3%40Iw*bG>G;-$kU z$Gx>@b}(GeSx^@V5CQMit9@z|WggWWlUd4>9)vv~FUf#kexzl|F;$n<3mL1KkD}{D zmWYSwu!+{HlwQl||0?)CGeFded5&HaYHG%CkFV8N`y;KP1s=-ZIFp082d8+BiFuUd z9C#8c><26qI9bkcjv)fjl=;+*>O^s|Jtc{$lM)gVBSs$VM?ykkD$#N9RfW7HO?6msi8`(bdlFo?o^%R=stBCHu{hai8}k3b;#hO0<$_%GAa{` z=7j5UY8Gk>gqm?ad?Xi?G=-xTO~|rv4w_t?eMqVH83T=%#cJX~7Zhci6Ht4TZ9BthF{hk+nk829qq(v_JcTWSu(n%AOJM@!)-0aFap zg~-&Ul&r<-5es-DDw?Pc`K$=+7{8p!X$BCAGZH$gq0GW*-9rcUl;l{Z4A0Z(HykNP zj>_$pVZ`3IjWgIkD*l7ng1H2ySsZ6c&W67*AKG1r){!GB)jnwS6enzt%G61w$o$KT zahZ6@K_%2`u@sk1^xz?8Fo+Y_mRNnou?#FPY~lrk^&se&RITRr!P~ZJ?^x8S+~slH z>08GAhpNE7`x473(FPs+A|pbNr4H&dK1#r5*OCTx&;O-FXk-FRUi={T17r^=1K(r> z9`@N3MPeO=6&8)!iYmnXm2g>>qYum0*;o?Tat?%%Zk0w)S>|$ta)V>av1S}2(^&g4 zBh!>*&orLHr5c*hq{20Ee=`OrdKv2ggc0W=EI?!~LMI~`S+~mYTPW(Ui-h!WeZ`8F zxO8Q>MQ_0)WPiK@!`q9klUS{LS9|d!UTl#NMp)=CsV)^usL=yV%_)v!1ydxan5>I9 zm;s}WSvppC1D@j}mmW*Z)5e51V3ZLmDPtKEb(YMCKr{|Kii=e0Q^ygauf>WI$CN59 z9wq=vj3okg>EZzxrY(nFEQ!6IFO_{QiL za~mzvM1UfiXqvR-PQ2Ms6NqGD1Cd~&zFC+1WIS>oHESYI$N`*DfYrGb&L&t@$y>T>tm#EVU?yYyk_~lWfcny*((<Gc#Ca%I$b0p8%og%DWqTLPODl7!VZ{pka(Ssn*(Fn@-Vg}r z&7pWpEQ-g02^{JamE&v8;4UfjXnMt!=%!#es<*a;{0iMuSi+(IK~KzQi#N_P+frEU(c-bzQSG71@sgZ)wwc*f z>pN{ndsZ*cVoPf@RMPxFH|;JMnEBKfcs*R7H{REs_Iy^?#+~-w&IyT-h$BUk?jm4(Ok-uXhF@g1)N_@ z|BV{NR0}4Vxtt|pcsDak+XAcWMvp2A1}p$t*+HB-kbaSTWKSRyMft^?V+cT7r*QNc z0{|84v3eb;sv$JW!=n4*A<^R&ufi*JST2b$kzwHp$6CZO00odZttRhfR$Wr8HHDgJ zYhid}ti{KeP#A~jY%$*BnV`g<`xG;xHj*iQnW=@?|WqV3Cy>_v-s7 z3O&arPrsK=mxBCt5{blL_5C1)sKCuQd{q7FcU2U0D@KNPdHUKK{&|I%l2^ZPq@b$* z1eUkk?+5-Qe3bkE+ppj-m&r!*osyr5d%D8-5Q~ymzo(?2`u!y0rOWPr`u-*THj$E7 zzel7Xe+|+2eI~`H;7yRH-#Sud^?OGO7I1}RKlx7Ck6Uqd<1gWry!!nm1=a5_+5M;5 z{|%O(FSOwgzCt7}hU)j9NFHA;HtJXM-vy3LRQfeH3Us-}Uwk7b^RoBe8D-A+kjSK+}q`M+vMFWui)Sj>i?BZUVZ;cK@SZu%cbg9DEc0% z)qeH;Fa;+nMuv9({g&lb|7)w5ks-CudfDrL3`DA5$*b=-DoFpPfc3H!wcmqimCp-F zZUyaM2C~QRU+nVyeat+D2dtIj-d_J(z|nV7d6*l&i`2eO3fkMN>Q`_KjHmC4DtYxg zOg${G_@p*7{uMqS@)Y|@UVRUAJIlM-u{3_^QgX_!p8!YxQ}XKf*Y;3iz~v*NH9GA^=} zE-O^ACn@r8WxIp}r$~sew`+IeqwH7t=S1L??UGaeoqmgit@wVK^-}dJ9DRo{oBX%- ON)GzBXRMd4sQoX + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +std::vector _A; +std::vector _A_local; +std::vector _B; +std::vector _B_local; +int _size, _iter; + +void init_matrix(long unsigned int size, int fmax, std::vector &A) { + double x = 1 + rand() % fmax;; + for (long unsigned int i = 0; i < size; i++) { + if (i != 0) { + A[i * size + i - 1] = x; + } + if (i != size) { + A[i * size + i + 1] = x; + } + A[i * size + i] = x * 2 + 1; + } +} +std::vector iterationprocess(std::vector &_A, std::vector &_B, double X0, int _iter, + double _epsi) { + double epsi = _epsi; + int iter = _iter; + std::vector X(_B.size(), X0); + + while (iter != 0) { + bool flag = true; + + std::vector X_new(_B.size(), 0.0); + for (int i = 0; i < _B.size(); i++) { + X_new[i] = _B[i] / _A[i * _B.size() + i]; + for (int j = 0; j < _B.size(); j++) { + if (j == i) { + continue; + } + X_new[i] -= (_A[i * _B.size() + j] / _A[i * _B.size() + i]) * X[j]; + } + + flag = flag && (std::fabs(X_new[i] - X[i]) < epsi); + + X[i] = round(X_new[i] * 1000) / 1000; + } + iter--; + + if (flag) { + break; + } + } + + std::cout << "iter " << iter << std::endl; + for (auto i : _A) { + std::cout << i << " "; + } + std::cout << std::endl; + return X; +} + +int main(int argc, const char *argv[]) { + int rank = 0; + int size = 0; + // MPI_Init(&argc, (char ***)&argv); + // MPI_Comm_rank(MPI_COMM_WORLD, &rank); + // MPI_Comm_size(MPI_COMM_WORLD, &size); + + std::vector _A; + std::vector _A_local; + std::vector _B; + std::vector _B_local; + + // MPI_Datatype custom_vec; + std::string segmlist; + std::ifstream in("sys_3.txt"); + std::vector raw_data; + + while (std::getline(in, segmlist, ' ')) { + raw_data.push_back(segmlist); + } + + int _size = 8; + int _iter = std::stoi(raw_data[1]); + std::cout << _size << std::endl; + + // std::vector> _A1(_size, std::vector(_size, 0.00)); + // std::vector> _A_local1(_size, std::vector(_size, 0.00)); + + _A.resize(_size * _size, 0.00); + _A_local.resize(_size * _size, 0.00); + _B.resize(_size, 0.00); + _B_local.resize(_size, 0.00); + + std::vector X(_size, 0.00); + + int count = 2; + + // for (int i = 0; i < _size * _size; i++) { + // _A[i] = std::stod(raw_data[count]); + // std::cout << _A[i] << " "; + // count++; + // } + // std::cout << std::endl; + // for (int i = 0; i < _size; i++) { + // _B[i] = std::stod(raw_data[count]); + // std::cout << _B[i] << " "; + // count++; + // } + // std::cout << std::endl; + _A.resize(_size * _size, 0.0); + init_matrix(_size, 100, _A); + // MPI_Type_vector(_size, 1, _size, MPI_DOUBLE, &custom_vec); + + // MPI_Type_commit(&custom_vec); + + // MPI_Scatter(&_A, _size, MPI_DOUBLE, &_A_local, _size, MPI_DOUBLE, 0, MPI_COMM_WORLD); + + // MPI_Scatter(&_B, _size, MPI_DOUBLE, &_B_local, _size, MPI_DOUBLE, 0, MPI_COMM_WORLD); + + // MPI_Gather() + + // std::cout << "rank " << rank << std::endl; + for (unsigned long int i = 0; i < _size * _size; i++) { + std::cout << _A[i] << " "; + if (i % _size == _size - 1) { + std::cout << std::endl; + } + } + std::cout << std::endl; + std::cout << _A[11] << std::endl; + + // MPI_Type_free(&custom_vec);} + + // // MPI_Finalize(); + return 0; +} diff --git a/tasks/test2/sys_1.txt b/tasks/test2/sys_1.txt new file mode 100644 index 0000000000..ef2c91e5a3 --- /dev/null +++ b/tasks/test2/sys_1.txt @@ -0,0 +1 @@ +3 5 10 1 1 2 10 1 2 2 10 12 13 14 1 1 1 \ No newline at end of file diff --git a/tasks/test2/sys_2.txt b/tasks/test2/sys_2.txt new file mode 100644 index 0000000000..98202614a1 --- /dev/null +++ b/tasks/test2/sys_2.txt @@ -0,0 +1 @@ +3 100 4 -1 1 1 6 2 -1 -2 5 4 9 2 1 1 1 \ No newline at end of file diff --git a/tasks/test2/sys_3.txt b/tasks/test2/sys_3.txt new file mode 100644 index 0000000000..f1b1f72a70 --- /dev/null +++ b/tasks/test2/sys_3.txt @@ -0,0 +1 @@ +4 10 20.9 1.2 2.1 0.9 1.2 21.2 1.5 2.5 2.1 1.5 19.8 1.3 0.9 2.5 1.3 32.1 21.7 27.46 28.76 49.72 0.8 1 1.2 1.4 \ No newline at end of file diff --git a/tasks/test3/a.out b/tasks/test3/a.out new file mode 100644 index 0000000000000000000000000000000000000000..8489bd708d836c53961f3be9bae9b98d11d95b09 GIT binary patch literal 16352 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 QT=w(7scWpT7+6^LZ)AH&Pyhe` literal 0 HcmV?d00001 diff --git a/tasks/test3/main.cpp b/tasks/test3/main.cpp new file mode 100644 index 0000000000..1578c54f52 --- /dev/null +++ b/tasks/test3/main.cpp @@ -0,0 +1,47 @@ +#include +#include +#include + +int main(int argc, char *argv[]) { + int rank, size; + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + int rows = 3, cols = 4; + int full_array[3][4] = { + {1, 2, 3, 4}, + {5, 6, 7, 8}, + {9, 10, 11, 12} + }; + + // Создаем тип для строки + MPI_Datatype ROW_TYPE; + MPI_Type_vector(cols, 1, 1, MPI_INT, &ROW_TYPE); + MPI_Type_commit(&ROW_TYPE); + + // Процесс 0 рассылает строки всем процессам + if (rank == 0) { + for (int dest = 1; dest < size; dest++) { + if (dest - 1 < rows) { + MPI_Send(&full_array[dest - 1][0], 1, ROW_TYPE, + dest, 0, MPI_COMM_WORLD); + printf("Отправлена строка %d процессу %d\n", dest - 1, dest); + } + } + } else if (rank - 1 < rows) { + int my_row[cols]; + MPI_Recv(my_row, cols, MPI_INT, 0, 0, + MPI_COMM_WORLD, MPI_STATUS_IGNORE); + + printf("Процесс %d получил строку: ", rank); + for (int j = 0; j < cols; j++) { + printf("%d ", my_row[j]); + } + printf("\n"); + } + + MPI_Type_free(&ROW_TYPE); + MPI_Finalize(); + return 0; +} diff --git a/tasks/test4/a.out b/tasks/test4/a.out new file mode 100644 index 0000000000000000000000000000000000000000..1397ff6ce976e366441e646033e2bc364a54a799 GIT binary patch literal 24744 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 MP|kBGII7~m0dMcrQ~&?~ literal 0 HcmV?d00001 diff --git a/tasks/test4/main.cpp b/tasks/test4/main.cpp new file mode 100644 index 0000000000..a73eb2dc7c --- /dev/null +++ b/tasks/test4/main.cpp @@ -0,0 +1,60 @@ +#include +#include +#include + +int main(int argc, char** argv) { + MPI_Init(&argc, &argv); + + int world_size, world_rank; + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + + const int ROWS = 4; + const int COLS = 3; + // Use a 1D vector to represent a 2D matrix (ROWS x COLS) in row-major order + std::vector matrix(ROWS * COLS); + + if (world_rank == 0) { + // Initialize the matrix with some values + for (int i = 0; i < ROWS * COLS; ++i) { + matrix[i] = i; + } + // Example: matrix looks like + // 0 1 2 + // 3 4 5 + // 6 7 8 + // 9 10 11 + } + + // --- Create a new MPI Datatype for a single column --- + MPI_Datatype column_type; + int count = ROWS; // Number of blocks (rows) + int blocklength = 1; // Number of elements in each block (one per row) + // Stride is the distance between the start of one block and the next + int stride = COLS; // Stride in terms of the number of 'oldtype' elements + + // The oldtype is the basic data type of elements in the vector + MPI_Type_vector(count, blocklength, stride, MPI_INT, &column_type); + MPI_Type_commit(&column_type); // Commit the new type before use + + // Example MPI communication (sending the first column from rank 0 to rank 1) + if (world_rank == 0) { + // Send the first column (starting at the beginning of the data array) + MPI_Send(matrix.data(), 1, column_type, 1, 0, MPI_COMM_WORLD); + } else { + std::vector received_column(ROWS); // Vector to store the received column + // Receive into a contiguous vector + MPI_Recv(received_column.data(), ROWS, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + + std::cout << "Rank 1 received column: "; + for (int val : received_column) { + std::cout << val << " "; // Expected: 0 3 6 9 + } + std::cout << std::endl; + } + + // Clean up the created datatype + MPI_Type_free(&column_type); + MPI_Finalize(); + return 0; +} From 65c7aa3b0fe3d0f786dd860fada4c0d16ee2e809 Mon Sep 17 00:00:00 2001 From: SergeyK Date: Tue, 23 Dec 2025 15:20:47 +0000 Subject: [PATCH 4/7] Beta version of mpi complete, changed test data --- .../mpi/include/ops_mpi.hpp | 11 +- .../mpi/src/ops_mpi.cpp | 259 +++++++++++++++--- .../seq/include/ops_seq.hpp | 10 +- .../seq/src/ops_seq.cpp | 100 +++++-- .../tests/functional/main.cpp | 9 +- tasks/test/a.out | Bin 67504 -> 16280 bytes tasks/test/main.cpp | 161 +++++------ tasks/test2/a.out | Bin 52432 -> 66088 bytes tasks/test2/main.cpp | 94 +++---- 9 files changed, 431 insertions(+), 213 deletions(-) diff --git a/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp b/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp index b1460a8b6e..df9671607e 100644 --- a/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp +++ b/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp @@ -13,18 +13,15 @@ class KonovalovSSeidelMethodMPI : public BaseTask { explicit KonovalovSSeidelMethodMPI(const InType &in); private: - int size; - std::vector A; - std::vector B; - int max_iter; - int iter; bool ValidationImpl() override; bool PreProcessingImpl() override; bool RunImpl() override; bool PostProcessingImpl() override; - std::vector IterationProcess(std::vector &_A, std::vector &_B, double X0, int _iter, - double _epsi); + static std::vector IterationProcess(int mtr_szie, int diff, int rank, std::vector &_A, std::vector &_B); + void InitMatrixA(int size, int fmax, std::vector &A, int diff); + void InitMatrixB(int size, int fmax, std::vector &B); + std::vector Coloring(int size, std::vector &_A); }; } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp index 7900113dd8..ed53d9a78f 100644 --- a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp @@ -13,7 +13,7 @@ namespace konovalov_s_seidel_iterative_method { KonovalovSSeidelMethodMPI::KonovalovSSeidelMethodMPI(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); GetInput() = in; - GetOutput() = std::vector(3, 0.0); + GetOutput() = std::vector(GetInput(), 0.0); } bool KonovalovSSeidelMethodMPI::ValidationImpl() { @@ -23,68 +23,257 @@ bool KonovalovSSeidelMethodMPI::ValidationImpl() { // B.resize(size); // B = std::get<2>(GetInput()); // iter = std::get<3>(GetInput()); - return true; + return GetInput() > 3; } bool KonovalovSSeidelMethodMPI::PreProcessingImpl() { - if (A.size() == 0 || B.size() == 0 || size == 0 || iter == 0) { - return false; + return true; +} + +void KonovalovSSeidelMethodMPI::InitMatrixA(int size, int fmax, std::vector &A, int _diff) { + int diff = _diff; + int x = size + rand() % fmax; + + for (int i = 0; i < size; i++) { + int sum = 0; + int j = 1; + do { + int diff_addr_pos = i * size + i + j; + int diff_addr_neg = i * size + i - j; + + if (diff_addr_neg > 0 && diff_addr_neg >= i * size) { + A[diff_addr_neg] = x * (diff - j); + sum += A[diff_addr_neg]; + } + + if (diff_addr_pos < size * size && i + j < size) { + A[diff_addr_pos] = x * (diff - j); + sum += A[diff_addr_pos]; + } + j++; + } while (j < diff); + A[i * size + i] = abs(sum + 1); } + std::cout << __FILE__ << ":" << __LINE__ << ": initial x: " << x << " " << std::endl; +} + +void KonovalovSSeidelMethodMPI::InitMatrixB(int size, int fmax, std::vector &B) { for (int i = 0; i < size; i++) { - if (A[i * size + i] == 0) { - return false; - } + B[i] = pow(size + rand() % fmax, 2); } - return true; } -std::vector KonovalovSSeidelMethodMPI::IterationProcess(std::vector &_A, std::vector &_B, - double X0, int _iter, double _epsi) { - double epsi = _epsi; - int iter = _iter; - std::vector X(_B.size(), X0); - - while (iter != 0) { - bool flag = true; - - std::vector X_new(_B.size(), 0.0); - for (long unsigned int i = 0; i < _B.size(); i++) { - X_new[i] = _B[i] / _A[i * _B.size() + i]; - for (long unsigned int j = 0; j < _B.size(); j++) { - if (j == i) { - continue; - } - X_new[i] -= (_A[i * _B.size() + j] / _A[i * _B.size() + i]) * X[j]; +std::vector KonovalovSSeidelMethodMPI::Coloring(int size, std::vector &_A) { + std::vector A = _A; // coefficient matrix.int + std::vector color(size); // colors of rows. + for (int i = 0; i < size; ++i) { + color[i] = -1; + } + for (int i = 0; i < size; ++i) { + int m = 0; + for (int j = 0; j < i; j++) { + if (A[i * size + j] != 0 && color[j] == m) { + ++m; } + } + color[i] = m; + } + std::cout << "colors "; + for (auto i : color) { + std::cout << i << " "; + } + std::cout << std::endl; + return color; +} - flag = flag && (std::fabs(X_new[i] - X[i]) < epsi); +std::vector KonovalovSSeidelMethodMPI::IterationProcess(int mtr_size, int diff, int rank, std::vector &_A, + std::vector &_B, std::vector X_gl) { + // auto it = std::find_if_not(a.begin(), a.end(), iszero()); + // int d = distance(_A.begin(), it); + std::vector X = X_gl; + std::vector X_ret(diff, 0.0); - X[i] = round(X_new[i] * 1000) / 1000; - } - iter--; + // while (iter != 0) { + // bool flag = true; - if (flag) { - break; + std::vector X_new(mtr_size, 0.0); + for (int i = 0; i < diff; i++) { + int diag = (rank - 1) * (diff) + i; + X_new[diag] = (double)_B[i] / (double)_A[diag + i * mtr_size]; + for (int j = 0; j < mtr_size; j++) { + if (i * mtr_size + j == diag) { + continue; + } + X_new[diag] -= ((double)_A[i * mtr_size + j] / (double)_A[diag + i * mtr_size]) * X[j]; } + + // flag = flag && (std::fabs(X_new[diag] - X[diag]) < epsi); + + // std::cout << __FILE__ << ":" << __LINE__ << ": r: " << rank << " iter: " << iter << " daig:" << diag + // << " B[i]: " << _B[i] << " A: " << _A[diag + i * mtr_size]; + // std::cout << " old: " << X[diag] << " stored: " << X_new[diag] << std::endl; + X[diag] = round(X_new[diag] * 1000) / 1000; + X_ret[i] = X[diag]; + // MPI_Barrier(MPI_COMM_WORLD); } + // iter--; - return X; + // if (flag) { + // break; + // } + // } + return X_ret; } bool KonovalovSSeidelMethodMPI::RunImpl() { + srand(time(NULL)); + int rank = 0; int size = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); + int matrix_size = GetInput(); + int diff = matrix_size / (size - 1); + std::vector gl_x_vec(size*diff, 0.0); + std::vector local_x_vec(diff, 0.0); + std::vector colors(matrix_size); + std::vector A_local; + std::vector B_local; - // MPI_Datatype custom_vec; if (rank == 0) { + std::vector A; + std::vector B; + gl_x_vec.resize(matrix_size, 0.0); + colors.resize(matrix_size, 0); + B.resize(matrix_size, 0); + A.resize(matrix_size * matrix_size, 0); + + InitMatrixA(matrix_size, 10, A, matrix_size / (size - 1)); + InitMatrixB(matrix_size, 10, B); + colors = Coloring(matrix_size, A); + + std::cout << "mtr size: " << matrix_size << std::endl; + + // MPI_Bcast(&matrix_size, 1, MPI_INT, 0, MPI_COMM_WORLD); + + std::cout << "p" << rank << " B: " << std::endl; + for (int i = 0; i < matrix_size; i++) { + std::cout << B[i] << " "; + } + std::cout << std::endl; + // int *ndisplacement = new int[size]; + // for (int i = 0; i < size; i++) { + // ndisplacement[i] = i * matrix_size * GetInput(); + // } + // const int *sdisplacement = ndisplacement; + + // int *ncounts = new int[size]; + // for (int i = 0; i < size; i++) { + // ncounts[i] = matrix_size * GetInput(); + // } + // const int *scounts = ncounts; + + // std::cout << "0r scounts: "; + // for (int i = 0; i < size - 1; i++) { + // std::cout << scounts[i] << " "; + // } + // std::cout << std::endl; + + // std::cout << "0r displ: "; + // for (int i = 0; i < size - 1; i++) { + // std::cout << sdisplacement[i] << " "; + // } + // std::cout << std::endl; + + // MPI_Scatterv(&A, scounts, sdisplacement, MPI_INT, &A_local, matrix_size*GetInput(), MPI_INT, 0, MPI_COMM_WORLD); + + int r = matrix_size * diff; + for (int i = 1; i < size; i++) { + int p = (i - 1) * r; + MPI_Send(&A[p], r, MPI_INT, i, 0, MPI_COMM_WORLD); + MPI_Send(&B[(i - 1) * diff], diff, MPI_INT, i, 0, MPI_COMM_WORLD); + } + + // MPI_Status s; + // for (int i = 1; i < size; i++) { + // std::vector ret(matrix_size); + // MPI_Recv(&ret[(s.MPI_SOURCE-1)*diff], diff, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &s); + // // cout << "source: " << s.MPI_SOURCE << " tag: " << s.MPI_TAG << " ret: " << ret << endl; + + // } + // std::cout << "p" << rank << " global: " << std::endl; + // for (int i = 0; i < matrix_size; i++) { + // std::cout << gl_x_vec[i] << " "; + // } + // std::cout << std::endl; } + // MPI_Bcast(&B[0], matrix_size, MPI_INT, 0, MPI_COMM_WORLD); + if (rank != 0) { + MPI_Status s; + MPI_Probe(0, 0, MPI_COMM_WORLD, &s); + int n; + MPI_Get_count(&s, MPI_CHAR, &n); + A_local.resize(matrix_size * diff); + B_local.resize(diff); + + MPI_Recv(&A_local[0], matrix_size * diff, MPI_INT, 0, 0, MPI_COMM_WORLD, &s); + MPI_Recv(&B_local[0], diff, MPI_INT, 0, 0, MPI_COMM_WORLD, &s); + // std::cout << "size: " << A_local.size() << std::endl; + // std::cout << "mtr size: " << matrix_size << std::endl; + // std::cout << "p" << rank << " local A: " << std::endl; + // int c = 0; + // for (int i = 0; i < matrix_size * diff; i++) { + // std::cout << A_local[i] << " "; + // if (i % matrix_size == matrix_size - 1) { + // std::cout << B_local[c] << std::endl; + // c++; + // } + // } + // std::cout << std::endl; + local_x_vec = IterationProcess(matrix_size, diff, rank, A_local, B_local); + std::cout << "p" << rank << " local X: " << std::endl; + for (int i = 0; i < diff; i++) { + std::cout << local_x_vec[i] << " "; + } + std::cout << std::endl; + // MPI_Send(&local_x_vec[(rank - 1) * diff], diff, MPI_INT, s.MPI_SOURCE, rank, MPI_COMM_WORLD); + } + + MPI_Barrier(MPI_COMM_WORLD); + + if (rank == 0) { + std::vector counts(size, diff); + + std::cout << "p" << rank << " counts: " << counts.data() << std::endl; + + std::vector displacements(size, size); + + for (int i = 0; i < size; i++) { + displacements[i] = diff*i; + } + + std::cout << "p" << rank << " displ: " ;//<< displacements.data() << std::endl; + for (int i = 0; i < size; i++) { + std::cout << displacements[i] << " "; + } + std::cout << std::endl; + + MPI_Gatherv(&local_x_vec[0], diff, MPI_DOUBLE, &gl_x_vec[0], counts.data(), displacements.data(), MPI_DOUBLE, 0, MPI_COMM_WORLD); + std::cout << std::endl; + std::cout << "p" << rank << " gl X: " << std::endl; + for (int i = 0; i < size*diff; i++) { + std::cout << gl_x_vec[i] << " "; + } + std::cout << std::endl; + } else + MPI_Gatherv(&local_x_vec[0], diff, MPI_DOUBLE, NULL, NULL, NULL, MPI_DOUBLE, 0, MPI_COMM_WORLD); + MPI_Bcast(&gl_x_vec[0], size*diff, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); + for(int i = diff; i < size*diff; i++) + GetOutput()[i-diff] = gl_x_vec[i]; + // GetOutput() = gl_x_vec; - MPI_Finalize(); - // GetOutput() = return true; } diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp b/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp index f854d38f34..afcdcdca3b 100644 --- a/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp +++ b/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp @@ -14,8 +14,6 @@ class KonovalovSSeidelMethodSEQ : public BaseTask { private: int size = 0; - std::vector A; - std::vector B; int max_iter = 0; int iter = 0; @@ -23,11 +21,11 @@ class KonovalovSSeidelMethodSEQ : public BaseTask { bool PreProcessingImpl() override; bool RunImpl() override; bool PostProcessingImpl() override; - static std::vector IterationProcess(std::vector &_A, std::vector &_B, double X0, int _iter, + static std::vector IterationProcess(std::vector &_A, std::vector &_B, int _iter, double _epsi); - void InitMatrixA(long unsigned int size, int fmax, std::vector &A); - void InitMatrixB(long unsigned int size, int fmax, std::vector &B); - + void InitMatrixA(int size, int fmax, std::vector &A, int diff); + void InitMatrixB(int size, int fmax, std::vector &B); + std::vector Coloring(int size, std::vector _A); }; } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp index bd5b0ab7c3..5cc8459170 100644 --- a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp @@ -15,7 +15,7 @@ KonovalovSSeidelMethodSEQ::KonovalovSSeidelMethodSEQ(const InType &in) { } bool KonovalovSSeidelMethodSEQ::ValidationImpl() { - if(GetInput() < 3) return false; + if(GetInput() < 16) return false; return true; } @@ -25,31 +25,66 @@ bool KonovalovSSeidelMethodSEQ::PreProcessingImpl() { return true; } -void KonovalovSSeidelMethodSEQ::InitMatrixA(long unsigned int size, int fmax, std::vector &A) { - A.resize(size*size, 0.0); - double x = 1 + rand() % fmax; - for (long unsigned int i = 0; i < size; i++) { - if (i != 0) { - A[i * size + i - 1] = x; - } - if (i != size) { - A[i * size + i + 1] = x; - } - A[i * size + i] = x * 2 + 1; +void KonovalovSSeidelMethodSEQ::InitMatrixA(int size, int fmax, std::vector &A, int _diff) { + int diff = _diff; + int x = rand() % fmax; + + for (int i = 0; i < size; i++) { + int sum = 0; + int j = 1; + do { + int diff_addr_pos = i * size + i + j; + int diff_addr_neg = i * size + i - j; + + if (diff_addr_neg > 0 && diff_addr_neg >= i * size) { + A[diff_addr_neg] = x * (diff - j); + sum += A[diff_addr_neg]; + } + + if (diff_addr_pos < size*size && i + j < size) { + A[diff_addr_pos] = x * (diff - j); + sum += A[diff_addr_pos]; + } + j++; + } while (j < diff); + A[i * size + i] = abs(sum + 1); } + // std::cout << __FILE__ << ":" << __LINE__ << ": initial x: " << x << " " << std::endl; } -void KonovalovSSeidelMethodSEQ::InitMatrixB(long unsigned int size, int fmax, std::vector &B) { - for (long unsigned int i = 0; i < size; i++) { - B[i] = 1 + rand() % fmax; +void KonovalovSSeidelMethodSEQ::InitMatrixB(int size, int fmax, std::vector &B) { + for (int i = 0; i < size; i++) { + B[i] = rand() % fmax; } + } -std::vector KonovalovSSeidelMethodSEQ::IterationProcess(std::vector &_A, std::vector &_B, double X0, int _iter, +std::vector KonovalovSSeidelMethodSEQ::Coloring(int size, std::vector _A){ + std::vector A = _A; //coefficient matrix.int + std::vector color(size); //colors of rows. + for (int i = 0; i < size; ++i) color[i] = -1; + for (int i = 0; i < size; ++i) { + int m = 0; + for (int j = 0; j < i; j++) { + if (A[i*size + j] != 0 && color[j] == m) { + ++m; + } + } + color[i] = m; + } + // std::cout << "colors "; + // for (auto i : color) { + // std::cout << i << " "; + // } + // std::cout << std::endl; + return color; +} + +std::vector KonovalovSSeidelMethodSEQ::IterationProcess(std::vector &_A, std::vector &_B, int _iter, double _epsi) { double epsi = _epsi; int iter = _iter; - std::vector X(_B.size(), X0); + std::vector X(_B.size(), 0.0); std::vector X_new(_B.size(), 0.0); @@ -70,18 +105,39 @@ std::vector KonovalovSSeidelMethodSEQ::IterationProcess(std::vector A(size*size, 0.0); std::vector B(size, 0.0); - InitMatrixA(GetInput(), 100, A); - InitMatrixB(GetInput(), 100, B); - GetOutput() = IterationProcess(A, B, 0, iter, 0.001); + InitMatrixA(size, 10, A, size/4); + InitMatrixB(size, 10, B); + // int c = 0; + // std::cout << "x" << c << ": "; + + // for (int i = 0; i < size * size; i++) { + // std::cout << A[i] << " "; + // if (i % size == size - 1) { + // std::cout << std::endl; + // c++; + // std::cout << "x" << c << ": "; + // } + // } + // for (int i = 0; i < size; i++) { + // std::cout << B[i] << " "; + // } + // std::cout << std::endl; + Coloring(size, A); + GetOutput() = IterationProcess(A, B, 10, 0.001); return true; diff --git a/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp b/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp index 1158d87c29..43301a35cf 100644 --- a/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp @@ -37,6 +37,11 @@ class KonovalovSRunFuncTestsProcesses2 : public ppc::util::BaseRunFuncTests kTestParam = {std::make_tuple("sys_1", 3), std::make_tuple("sys_2", 6), - std::make_tuple("sys_3", 10)}; +const std::array kTestParam = {std::make_tuple("sys_1", 32), std::make_tuple("sys_2", 64), + std::make_tuple("sys_3", 128)}; const auto kTestTasksList = std::tuple_cat(ppc::util::AddFuncTask( kTestParam, PPC_SETTINGS_konovalov_s_seidel_iterative_method), diff --git a/tasks/test/a.out b/tasks/test/a.out index 914b6a7d3909eeaccd530a4768e0be64b5b51d5d..6dcf1515f115cefd1da8ae6539cd6210c3ae2314 100644 GIT binary patch literal 16280 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include - int main(int argc, char const *argv[]) - { - std::string segmlist; - std::ifstream in("sys_3.txt"); - std::vector raw_data; +#define SIZE 4 - while(std::getline(in, segmlist, ' ')){ - raw_data.push_back(segmlist); +int main(int argc, char *argv[]) +{ + // Get number of processes and check that 3 processes are used + MPI_Init(&argc, &argv); + int size; + MPI_Comm_size(MPI_COMM_WORLD, &size); + if(size != 3) + { + printf("This application is meant to be run with 3 processes.\n"); + MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE); } - - for(auto i: raw_data){ - std::cout << i << " "; - } - std::cout << std::endl; - - for(auto i: raw_data){ - - } - int _size = std::stoi(raw_data[0]); - - std::cout << _size << std::endl; - int _iter = std::stoi(raw_data[1]); - - std::vector> _A(_size, std::vector(_size, 0.00)); - std::vector _B(_size, 0.00); - - int count = 2; - - for(int i = 0; i < _size; i++){ - for(int j = 0; j < _size; j++){ - _A[i][j] = std::stod(raw_data[count]); - count++; - } - } - - for(int i = 0; i < _size; i++){ - _B[i] = std::stod(raw_data[count]); - std::cout << _B[i] << " "; - count++; - } - std::cout << std::endl; - auto input_data_ = std::make_tuple(_size, _A, _B, _iter); - double epsi = 0.001; - std::vector X(_size, 0.0); - - while(_iter != 0){ - bool flag = true; - - std::vector X_new(_size, 0.0); - for(int i = 0; i < _size; i++){ - - X_new[i] = _B[i]/_A[i][i]; - - for(int j = 0; j < _size; j++){ - if(j == i) continue; - X_new[i] -= (_A[i][j]/_A[i][i]) * X[j]; + + // Determine root's rank + int root_rank = 0; + + // Get my rank + int my_rank; + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + + switch(my_rank) + { + case 0: + { + // Define my value + int my_value; + + // Declare the buffer + int buffer[7] = {100, 0, 101, 102, 0, 0, 103}; + + // Declare the counts + int counts[3] = {1, 2, 1}; + + // Declare the displacements + int displacements[3] = {0, 2, 6}; + + printf("Values in the buffer of root process:"); + for(int i = 0; i < 7; i++) + { + printf(" %d", buffer[i]); } - - - flag = flag && (std::fabs(X_new[i] - X[i]) < epsi); - - std::cout << std::fabs(X_new[i] - X[i]) << std::endl; - X[i] = round(X_new[i]*1000)/1000; - + printf("\n"); + MPI_Scatterv(buffer, counts, displacements, MPI_INT, &my_value, 1, MPI_INT, root_rank, MPI_COMM_WORLD); + printf("Process %d received value %d.\n", my_rank, my_value); + break; } - - std::cout << "Values "; - for(auto i: X){ - std::cout << i << " "; - } - for(auto i: X_new){ - std::cout << i << " "; + case 1: + { + // Declare my values + int my_values[2]; + + MPI_Scatterv(NULL, NULL, NULL, MPI_INT, my_values, 2, MPI_INT, root_rank, MPI_COMM_WORLD); + printf("Process %d received values %d and %d.\n", my_rank, my_values[0], my_values[1]); + break; } - std::cout << std::endl; - _iter--; - - if(flag){ - return 0; + case 2: + { + // Declare my values + int my_value; + + MPI_Scatterv(NULL, NULL, NULL, MPI_INT, &my_value, 1, MPI_INT, root_rank, MPI_COMM_WORLD); + printf("Process %d received value %d.\n", my_rank, my_value); + break; } } - for(auto i: X){ - std::cout << i << " "; - } - std::cout << std::endl; - - return 0; - } - \ No newline at end of file + MPI_Finalize(); + return 0; +} \ No newline at end of file diff --git a/tasks/test2/a.out b/tasks/test2/a.out index e547ad02d4ddac5cb8f3899197069fc2be1b00a1..daf75d7a52428c6e4d209b1321cb0fa8aff56665 100644 GIT binary patch literal 66088 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

JlTuD(hk)i~1o=^N{d@ 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 ON)GzBXRMd4sQoX _B_local; int _size, _iter; void init_matrix(long unsigned int size, int fmax, std::vector &A) { - double x = 1 + rand() % fmax;; + int diff = 2; + double x = 1 + rand() % fmax; for (long unsigned int i = 0; i < size; i++) { - if (i != 0) { - A[i * size + i - 1] = x; + for(int j = 0; j < diff; j++) { + if (i * size + i - j > 0 && i * size + i - j >= i * size) { + A[i * size + i - j] = x * (diff - j); + } + if (i * size + i + j < size*size && i + j < size) { + A[i * size + i + j] = x * (diff - j); + } } - if (i != size) { - A[i * size + i + 1] = x; + A[i * size + i] = x * (diff*diff); + } +} + +void InitMatrixB(long unsigned int size, int fmax, std::vector &B) { + for (long unsigned int i = 0; i < size; i++) { + B[i] = 1 + rand() % fmax; + } +} + +void coloring(int N, std::vector _A){ + std::vector A = _A; //coefficient matrix.int + std::vector color(N); //colors of rows. + for (int i = 0; i < N; ++i) color[i] = -1; + for (int i = 0; i < N; ++i) { + int m = 0; + for (int j = 0; j < i; j++) { + if (A[i*N + j] != 0 && color[j] == m) { + ++m; + } } - A[i * size + i] = x * 2 + 1; + color[i] = m; + } + std::cout << "colors "; + for (auto i : color) { + std::cout << i << " "; } + std::cout << std::endl; } + std::vector iterationprocess(std::vector &_A, std::vector &_B, double X0, int _iter, double _epsi) { double epsi = _epsi; @@ -63,7 +93,7 @@ std::vector iterationprocess(std::vector &_A, std::vector iterationprocess(std::vector &_A, std::vector _A; std::vector _A_local; std::vector _B; std::vector _B_local; - // MPI_Datatype custom_vec; std::string segmlist; std::ifstream in("sys_3.txt"); std::vector raw_data; @@ -95,43 +123,14 @@ int main(int argc, const char *argv[]) { int _iter = std::stoi(raw_data[1]); std::cout << _size << std::endl; - // std::vector> _A1(_size, std::vector(_size, 0.00)); - // std::vector> _A_local1(_size, std::vector(_size, 0.00)); - _A.resize(_size * _size, 0.00); _A_local.resize(_size * _size, 0.00); _B.resize(_size, 0.00); _B_local.resize(_size, 0.00); - std::vector X(_size, 0.00); - - int count = 2; - - // for (int i = 0; i < _size * _size; i++) { - // _A[i] = std::stod(raw_data[count]); - // std::cout << _A[i] << " "; - // count++; - // } - // std::cout << std::endl; - // for (int i = 0; i < _size; i++) { - // _B[i] = std::stod(raw_data[count]); - // std::cout << _B[i] << " "; - // count++; - // } - // std::cout << std::endl; _A.resize(_size * _size, 0.0); - init_matrix(_size, 100, _A); - // MPI_Type_vector(_size, 1, _size, MPI_DOUBLE, &custom_vec); - - // MPI_Type_commit(&custom_vec); - - // MPI_Scatter(&_A, _size, MPI_DOUBLE, &_A_local, _size, MPI_DOUBLE, 0, MPI_COMM_WORLD); - - // MPI_Scatter(&_B, _size, MPI_DOUBLE, &_B_local, _size, MPI_DOUBLE, 0, MPI_COMM_WORLD); - - // MPI_Gather() - - // std::cout << "rank " << rank << std::endl; + init_matrix(_size, 10, _A); + InitMatrixB(_size, 10, _B); for (unsigned long int i = 0; i < _size * _size; i++) { std::cout << _A[i] << " "; if (i % _size == _size - 1) { @@ -139,10 +138,13 @@ int main(int argc, const char *argv[]) { } } std::cout << std::endl; - std::cout << _A[11] << std::endl; - - // MPI_Type_free(&custom_vec);} - // // MPI_Finalize(); + std::vector X(_size, 0.0); + X = iterationprocess(_A, _B, 0, 10, 0.001); + coloring(_size, _A); + for (unsigned long int i = 0; i < _size; i++) { + std::cout << X[i] << " "; + } + std::cout << std::endl; return 0; } From d26dcf7b2ed1c0b77c821109642e1e22db219818 Mon Sep 17 00:00:00 2001 From: SergeyK Date: Tue, 23 Dec 2025 17:01:35 +0000 Subject: [PATCH 5/7] Complete version of mpi --- .../mpi/include/ops_mpi.hpp | 4 +- .../mpi/src/ops_mpi.cpp | 251 ++++++++---------- 2 files changed, 118 insertions(+), 137 deletions(-) diff --git a/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp b/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp index df9671607e..84acea9c1c 100644 --- a/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp +++ b/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp @@ -18,9 +18,11 @@ class KonovalovSSeidelMethodMPI : public BaseTask { bool PreProcessingImpl() override; bool RunImpl() override; bool PostProcessingImpl() override; - static std::vector IterationProcess(int mtr_szie, int diff, int rank, std::vector &_A, std::vector &_B); + static std::vector IterationStep(int mtr_szie, int diff, int rank, std::vector &_A, std::vector &_B, std::vector &X_gl); void InitMatrixA(int size, int fmax, std::vector &A, int diff); void InitMatrixB(int size, int fmax, std::vector &B); + void DataDistr(int size, int diff, int mtr_size); + void DataRecv(std::vector &A_local, std::vector &B_local, int matrix_size, int diff); std::vector Coloring(int size, std::vector &_A); }; diff --git a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp index ed53d9a78f..666151a69f 100644 --- a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp @@ -86,35 +86,35 @@ std::vector KonovalovSSeidelMethodMPI::Coloring(int size, std::vector return color; } -std::vector KonovalovSSeidelMethodMPI::IterationProcess(int mtr_size, int diff, int rank, std::vector &_A, - std::vector &_B, std::vector X_gl) { - // auto it = std::find_if_not(a.begin(), a.end(), iszero()); - // int d = distance(_A.begin(), it); +std::vector KonovalovSSeidelMethodMPI::IterationStep(int mtr_size, int diff, int rank, std::vector &_A, + std::vector &_B, std::vector &X_gl) { std::vector X = X_gl; std::vector X_ret(diff, 0.0); - - // while (iter != 0) { - // bool flag = true; - std::vector X_new(mtr_size, 0.0); + for (int i = 0; i < diff; i++) { int diag = (rank - 1) * (diff) + i; + + // std::cout << rank << " " << diag << std::endl; X_new[diag] = (double)_B[i] / (double)_A[diag + i * mtr_size]; for (int j = 0; j < mtr_size; j++) { + // std::cout << rank << " for " << i << std::endl; + if (i * mtr_size + j == diag) { + // std::cout << rank << " if " << j << std::endl; + continue; } + X_new[diag] -= ((double)_A[i * mtr_size + j] / (double)_A[diag + i * mtr_size]) * X[j]; } - // flag = flag && (std::fabs(X_new[diag] - X[diag]) < epsi); - - // std::cout << __FILE__ << ":" << __LINE__ << ": r: " << rank << " iter: " << iter << " daig:" << diag - // << " B[i]: " << _B[i] << " A: " << _A[diag + i * mtr_size]; - // std::cout << " old: " << X[diag] << " stored: " << X_new[diag] << std::endl; X[diag] = round(X_new[diag] * 1000) / 1000; X_ret[i] = X[diag]; // MPI_Barrier(MPI_COMM_WORLD); + // std::cout << __FILE__ << ":" << __LINE__ << ": r: " << rank << " daig:" << diag << " B[i]: " << _B[i] + // << " A: " << _A[diag + i * mtr_size]; + // std::cout << " old: " << X[diag] << " stored: " << X_new[diag] << std::endl; } // iter--; @@ -125,6 +125,46 @@ std::vector KonovalovSSeidelMethodMPI::IterationProcess(int mtr_size, in return X_ret; } +void KonovalovSSeidelMethodMPI::DataDistr(int matrix_size, int size, int diff) { + std::vector A; + std::vector B; + + A.resize(matrix_size * matrix_size, 0); + B.resize(matrix_size, 0); + + InitMatrixA(matrix_size, 10, A, matrix_size / (size - 1)); + InitMatrixB(matrix_size, 10, B); + + int r = matrix_size * diff; + for (int i = 1; i < size; i++) { + int p = (i - 1) * r; + MPI_Send(&A[p], r, MPI_INT, i, 0, MPI_COMM_WORLD); + MPI_Send(&B[(i - 1) * diff], diff, MPI_INT, i, 0, MPI_COMM_WORLD); + } +} + +void KonovalovSSeidelMethodMPI::DataRecv(std::vector &A_local, std::vector &B_local, int matrix_size, + int diff) { + MPI_Status s; + A_local.resize(matrix_size * diff); + B_local.resize(diff); + + MPI_Recv(&A_local[0], matrix_size * diff, MPI_INT, 0, 0, MPI_COMM_WORLD, &s); + MPI_Recv(&B_local[0], diff, MPI_INT, 0, 0, MPI_COMM_WORLD, &s); + // std::cout << "size: " << A_local.size() << std::endl; + // std::cout << "mtr size: " << matrix_size << std::endl; + // std::cout << " local A: " << std::endl; + // int c = 0; + // for (int i = 0; i < matrix_size * diff; i++) { + // std::cout << A_local[i] << " "; + // if (i % matrix_size == matrix_size - 1) { + // std::cout << B_local[c] << std::endl; + // c++; + // } + // } + // std::cout << std::endl; +} + bool KonovalovSSeidelMethodMPI::RunImpl() { srand(time(NULL)); @@ -132,147 +172,86 @@ bool KonovalovSSeidelMethodMPI::RunImpl() { int size = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); + int matrix_size = GetInput(); int diff = matrix_size / (size - 1); - std::vector gl_x_vec(size*diff, 0.0); + // std::cout << rank << " diff " << diff << std::endl; + + std::vector gl_x_vec(size * diff, 0.0); std::vector local_x_vec(diff, 0.0); std::vector colors(matrix_size); std::vector A_local; std::vector B_local; + double epsi = 0.001; + int iter = 10; + bool stop_calc = true; + + gl_x_vec.resize(matrix_size, 0.0); + colors.resize(matrix_size, 0); if (rank == 0) { - std::vector A; - std::vector B; - gl_x_vec.resize(matrix_size, 0.0); - colors.resize(matrix_size, 0); - B.resize(matrix_size, 0); - A.resize(matrix_size * matrix_size, 0); + DataDistr(matrix_size, size, diff); + } else { + DataRecv(A_local, B_local, matrix_size, diff); + } - InitMatrixA(matrix_size, 10, A, matrix_size / (size - 1)); - InitMatrixB(matrix_size, 10, B); - colors = Coloring(matrix_size, A); + while (iter != 0) { + bool cover_tracker = true; + if (rank != 0) { + local_x_vec = IterationStep(matrix_size, diff, rank, A_local, B_local, gl_x_vec); - std::cout << "mtr size: " << matrix_size << std::endl; + for (int i = 0; i < diff; i++) { + cover_tracker = cover_tracker && (std::fabs(local_x_vec[i] - gl_x_vec[(rank)*diff + i]) < epsi); + } + // std::cout << "p" << rank << " local X: " << std::endl; + // for (int i = 0; i < diff; i++) { + // std::cout << local_x_vec[i] << " "; + // } + // std::cout << std::endl; + } - // MPI_Bcast(&matrix_size, 1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Barrier(MPI_COMM_WORLD); - std::cout << "p" << rank << " B: " << std::endl; - for (int i = 0; i < matrix_size; i++) { - std::cout << B[i] << " "; - } - std::cout << std::endl; - // int *ndisplacement = new int[size]; - // for (int i = 0; i < size; i++) { - // ndisplacement[i] = i * matrix_size * GetInput(); - // } - // const int *sdisplacement = ndisplacement; - - // int *ncounts = new int[size]; - // for (int i = 0; i < size; i++) { - // ncounts[i] = matrix_size * GetInput(); - // } - // const int *scounts = ncounts; - - // std::cout << "0r scounts: "; - // for (int i = 0; i < size - 1; i++) { - // std::cout << scounts[i] << " "; - // } - // std::cout << std::endl; - - // std::cout << "0r displ: "; - // for (int i = 0; i < size - 1; i++) { - // std::cout << sdisplacement[i] << " "; - // } - // std::cout << std::endl; - - // MPI_Scatterv(&A, scounts, sdisplacement, MPI_INT, &A_local, matrix_size*GetInput(), MPI_INT, 0, MPI_COMM_WORLD); - - int r = matrix_size * diff; - for (int i = 1; i < size; i++) { - int p = (i - 1) * r; - MPI_Send(&A[p], r, MPI_INT, i, 0, MPI_COMM_WORLD); - MPI_Send(&B[(i - 1) * diff], diff, MPI_INT, i, 0, MPI_COMM_WORLD); - } + if (rank == 0) { + std::vector counts(size, diff); - // MPI_Status s; - // for (int i = 1; i < size; i++) { - // std::vector ret(matrix_size); - // MPI_Recv(&ret[(s.MPI_SOURCE-1)*diff], diff, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &s); - // // cout << "source: " << s.MPI_SOURCE << " tag: " << s.MPI_TAG << " ret: " << ret << endl; - - // } - // std::cout << "p" << rank << " global: " << std::endl; - // for (int i = 0; i < matrix_size; i++) { - // std::cout << gl_x_vec[i] << " "; - // } - // std::cout << std::endl; - } - // MPI_Bcast(&B[0], matrix_size, MPI_INT, 0, MPI_COMM_WORLD); - if (rank != 0) { - MPI_Status s; - MPI_Probe(0, 0, MPI_COMM_WORLD, &s); - int n; - MPI_Get_count(&s, MPI_CHAR, &n); - A_local.resize(matrix_size * diff); - B_local.resize(diff); - - MPI_Recv(&A_local[0], matrix_size * diff, MPI_INT, 0, 0, MPI_COMM_WORLD, &s); - MPI_Recv(&B_local[0], diff, MPI_INT, 0, 0, MPI_COMM_WORLD, &s); - // std::cout << "size: " << A_local.size() << std::endl; - // std::cout << "mtr size: " << matrix_size << std::endl; - // std::cout << "p" << rank << " local A: " << std::endl; - // int c = 0; - // for (int i = 0; i < matrix_size * diff; i++) { - // std::cout << A_local[i] << " "; - // if (i % matrix_size == matrix_size - 1) { - // std::cout << B_local[c] << std::endl; - // c++; - // } - // } - // std::cout << std::endl; - local_x_vec = IterationProcess(matrix_size, diff, rank, A_local, B_local); - std::cout << "p" << rank << " local X: " << std::endl; - for (int i = 0; i < diff; i++) { - std::cout << local_x_vec[i] << " "; - } - std::cout << std::endl; - // MPI_Send(&local_x_vec[(rank - 1) * diff], diff, MPI_INT, s.MPI_SOURCE, rank, MPI_COMM_WORLD); - } - - MPI_Barrier(MPI_COMM_WORLD); + // std::cout << "p" << rank << " counts: " << counts.data() << std::endl; - if (rank == 0) { - std::vector counts(size, diff); - - std::cout << "p" << rank << " counts: " << counts.data() << std::endl; - - std::vector displacements(size, size); - - for (int i = 0; i < size; i++) { - displacements[i] = diff*i; - } + std::vector displacements(size); + + for (int i = 0; i < size; i++) { + displacements[i] = diff * i; + } - std::cout << "p" << rank << " displ: " ;//<< displacements.data() << std::endl; - for (int i = 0; i < size; i++) { - std::cout << displacements[i] << " "; + // std::cout << "p" << rank << " displ: "; //<< displacements.data() << std::endl; + // for (int i = 0; i < size; i++) { + // std::cout << displacements[i] << " "; + // } + // std::cout << std::endl; + + MPI_Gatherv(&local_x_vec[0], diff, MPI_DOUBLE, &gl_x_vec[0], counts.data(), displacements.data(), MPI_DOUBLE, + 0, + MPI_COMM_WORLD); + // std::cout << std::endl; + // std::cout << "p" << rank << " gl X: " << std::endl; + // for (int i = 0; i < size * diff; i++) { + // std::cout << gl_x_vec[i] << " "; + // } + // std::cout << std::endl; + } else { + MPI_Gatherv(&local_x_vec[0], diff, MPI_DOUBLE, NULL, NULL, NULL, MPI_DOUBLE, 0, MPI_COMM_WORLD); } - std::cout << std::endl; + MPI_Bcast(&gl_x_vec[0], size * diff, MPI_DOUBLE, 0, MPI_COMM_WORLD); - MPI_Gatherv(&local_x_vec[0], diff, MPI_DOUBLE, &gl_x_vec[0], counts.data(), displacements.data(), MPI_DOUBLE, 0, MPI_COMM_WORLD); - std::cout << std::endl; - std::cout << "p" << rank << " gl X: " << std::endl; - for (int i = 0; i < size*diff; i++) { - std::cout << gl_x_vec[i] << " "; + MPI_Allreduce(&cover_tracker, &stop_calc, 1, MPI_C_BOOL, MPI_LAND, MPI_COMM_WORLD); + if (stop_calc) { + std::cout << "iter : " << iter << std::endl; + break; } - std::cout << std::endl; - } else - MPI_Gatherv(&local_x_vec[0], diff, MPI_DOUBLE, NULL, NULL, NULL, MPI_DOUBLE, 0, MPI_COMM_WORLD); - MPI_Bcast(&gl_x_vec[0], size*diff, MPI_DOUBLE, 0, MPI_COMM_WORLD); - - MPI_Barrier(MPI_COMM_WORLD); - for(int i = diff; i < size*diff; i++) - GetOutput()[i-diff] = gl_x_vec[i]; - // GetOutput() = gl_x_vec; + iter--; + } + for (int i = diff; i < size * diff; i++) { + GetOutput()[i - diff] = gl_x_vec[i]; return true; } From 6b8efdf49c2385d8458ae4854b480c4ba6eafc1d Mon Sep 17 00:00:00 2001 From: SergeyK Date: Tue, 23 Dec 2025 18:44:13 +0000 Subject: [PATCH 6/7] perf tests done --- .../common/include/common.hpp | 15 -- tasks/example_processes/data/pic.jpg | Bin 23 -> 0 bytes tasks/example_processes/info.json | 9 -- .../example_processes/mpi/include/ops_mpi.hpp | 22 --- tasks/example_processes/mpi/src/ops_mpi.cpp | 72 --------- tasks/example_processes/report.md | 0 .../example_processes/seq/include/ops_seq.hpp | 22 --- tasks/example_processes/seq/src/ops_seq.cpp | 60 ------- tasks/example_processes/settings.json | 7 - tasks/example_processes/tests/.clang-tidy | 13 -- .../tests/functional/main.cpp | 86 ---------- .../tests/performance/main.cpp | 40 ----- .../common/include/common.hpp | 15 -- tasks/example_processes_2/data/pic.jpg | Bin 23 -> 0 bytes tasks/example_processes_2/info.json | 9 -- .../mpi/include/ops_mpi.hpp | 22 --- tasks/example_processes_2/mpi/src/ops_mpi.cpp | 72 --------- tasks/example_processes_2/report.md | 0 .../seq/include/ops_seq.hpp | 22 --- tasks/example_processes_2/seq/src/ops_seq.cpp | 60 ------- tasks/example_processes_2/settings.json | 7 - tasks/example_processes_2/tests/.clang-tidy | 13 -- .../tests/functional/main.cpp | 86 ---------- .../tests/performance/main.cpp | 40 ----- .../common/include/common.hpp | 15 -- tasks/example_processes_3/data/pic.jpg | Bin 23 -> 0 bytes tasks/example_processes_3/info.json | 9 -- .../mpi/include/ops_mpi.hpp | 22 --- tasks/example_processes_3/mpi/src/ops_mpi.cpp | 72 --------- tasks/example_processes_3/report.md | 0 .../seq/include/ops_seq.hpp | 22 --- tasks/example_processes_3/seq/src/ops_seq.cpp | 60 ------- tasks/example_processes_3/settings.json | 7 - tasks/example_processes_3/tests/.clang-tidy | 13 -- .../tests/functional/main.cpp | 86 ---------- .../tests/performance/main.cpp | 40 ----- tasks/example_threads/all/include/ops_all.hpp | 22 --- tasks/example_threads/all/report.md | 0 tasks/example_threads/all/src/ops_all.cpp | 85 ---------- .../example_threads/common/include/common.hpp | 15 -- tasks/example_threads/data/pic.jpg | Bin 23 -> 0 bytes tasks/example_threads/info.json | 9 -- tasks/example_threads/omp/include/ops_omp.hpp | 22 --- tasks/example_threads/omp/report.md | 0 tasks/example_threads/omp/src/ops_omp.cpp | 54 ------- tasks/example_threads/report.md | 0 tasks/example_threads/seq/include/ops_seq.hpp | 22 --- tasks/example_threads/seq/report.md | 0 tasks/example_threads/seq/src/ops_seq.cpp | 60 ------- tasks/example_threads/settings.json | 10 -- tasks/example_threads/stl/include/ops_stl.hpp | 22 --- tasks/example_threads/stl/report.md | 0 tasks/example_threads/stl/src/ops_stl.cpp | 58 ------- tasks/example_threads/tbb/include/ops_tbb.hpp | 22 --- tasks/example_threads/tbb/report.md | 0 tasks/example_threads/tbb/src/ops_tbb.cpp | 56 ------- tasks/example_threads/tests/.clang-tidy | 13 -- .../example_threads/tests/functional/main.cpp | 92 ----------- .../tests/performance/main.cpp | 44 ----- .../mpi/include/ops_mpi.hpp | 1 - .../mpi/src/ops_mpi.cpp | 89 +---------- .../seq/include/ops_seq.hpp | 1 - .../seq/src/ops_seq.cpp | 37 ----- .../tests/functional/main.cpp | 5 - .../tests/performance/main.cpp | 23 +-- tasks/test/a.out | Bin 16280 -> 0 bytes tasks/test/main.cpp | 74 --------- tasks/test/sys_1.txt | 1 - tasks/test/sys_2.txt | 1 - tasks/test/sys_3.txt | 1 - tasks/test2/a.out | Bin 66088 -> 0 bytes tasks/test2/main.cpp | 150 ------------------ tasks/test2/sys_1.txt | 1 - tasks/test2/sys_2.txt | 1 - tasks/test2/sys_3.txt | 1 - tasks/test3/a.out | Bin 16352 -> 0 bytes tasks/test3/main.cpp | 47 ------ tasks/test4/a.out | Bin 24744 -> 0 bytes tasks/test4/main.cpp | 60 ------- 79 files changed, 21 insertions(+), 2116 deletions(-) delete mode 100644 tasks/example_processes/common/include/common.hpp delete mode 100644 tasks/example_processes/data/pic.jpg delete mode 100644 tasks/example_processes/info.json delete mode 100644 tasks/example_processes/mpi/include/ops_mpi.hpp delete mode 100644 tasks/example_processes/mpi/src/ops_mpi.cpp delete mode 100644 tasks/example_processes/report.md delete mode 100644 tasks/example_processes/seq/include/ops_seq.hpp delete mode 100644 tasks/example_processes/seq/src/ops_seq.cpp delete mode 100644 tasks/example_processes/settings.json delete mode 100644 tasks/example_processes/tests/.clang-tidy delete mode 100644 tasks/example_processes/tests/functional/main.cpp delete mode 100644 tasks/example_processes/tests/performance/main.cpp delete mode 100644 tasks/example_processes_2/common/include/common.hpp delete mode 100644 tasks/example_processes_2/data/pic.jpg delete mode 100644 tasks/example_processes_2/info.json delete mode 100644 tasks/example_processes_2/mpi/include/ops_mpi.hpp delete mode 100644 tasks/example_processes_2/mpi/src/ops_mpi.cpp delete mode 100644 tasks/example_processes_2/report.md delete mode 100644 tasks/example_processes_2/seq/include/ops_seq.hpp delete mode 100644 tasks/example_processes_2/seq/src/ops_seq.cpp delete mode 100644 tasks/example_processes_2/settings.json delete mode 100644 tasks/example_processes_2/tests/.clang-tidy delete mode 100644 tasks/example_processes_2/tests/functional/main.cpp delete mode 100644 tasks/example_processes_2/tests/performance/main.cpp delete mode 100644 tasks/example_processes_3/common/include/common.hpp delete mode 100644 tasks/example_processes_3/data/pic.jpg delete mode 100644 tasks/example_processes_3/info.json delete mode 100644 tasks/example_processes_3/mpi/include/ops_mpi.hpp delete mode 100644 tasks/example_processes_3/mpi/src/ops_mpi.cpp delete mode 100644 tasks/example_processes_3/report.md delete mode 100644 tasks/example_processes_3/seq/include/ops_seq.hpp delete mode 100644 tasks/example_processes_3/seq/src/ops_seq.cpp delete mode 100644 tasks/example_processes_3/settings.json delete mode 100644 tasks/example_processes_3/tests/.clang-tidy delete mode 100644 tasks/example_processes_3/tests/functional/main.cpp delete mode 100644 tasks/example_processes_3/tests/performance/main.cpp delete mode 100644 tasks/example_threads/all/include/ops_all.hpp delete mode 100644 tasks/example_threads/all/report.md delete mode 100644 tasks/example_threads/all/src/ops_all.cpp delete mode 100644 tasks/example_threads/common/include/common.hpp delete mode 100644 tasks/example_threads/data/pic.jpg delete mode 100644 tasks/example_threads/info.json delete mode 100644 tasks/example_threads/omp/include/ops_omp.hpp delete mode 100644 tasks/example_threads/omp/report.md delete mode 100644 tasks/example_threads/omp/src/ops_omp.cpp delete mode 100644 tasks/example_threads/report.md delete mode 100644 tasks/example_threads/seq/include/ops_seq.hpp delete mode 100644 tasks/example_threads/seq/report.md delete mode 100644 tasks/example_threads/seq/src/ops_seq.cpp delete mode 100644 tasks/example_threads/settings.json delete mode 100644 tasks/example_threads/stl/include/ops_stl.hpp delete mode 100644 tasks/example_threads/stl/report.md delete mode 100644 tasks/example_threads/stl/src/ops_stl.cpp delete mode 100644 tasks/example_threads/tbb/include/ops_tbb.hpp delete mode 100644 tasks/example_threads/tbb/report.md delete mode 100644 tasks/example_threads/tbb/src/ops_tbb.cpp delete mode 100644 tasks/example_threads/tests/.clang-tidy delete mode 100644 tasks/example_threads/tests/functional/main.cpp delete mode 100644 tasks/example_threads/tests/performance/main.cpp delete mode 100644 tasks/test/a.out delete mode 100644 tasks/test/main.cpp delete mode 100644 tasks/test/sys_1.txt delete mode 100644 tasks/test/sys_2.txt delete mode 100644 tasks/test/sys_3.txt delete mode 100644 tasks/test2/a.out delete mode 100644 tasks/test2/main.cpp delete mode 100644 tasks/test2/sys_1.txt delete mode 100644 tasks/test2/sys_2.txt delete mode 100644 tasks/test2/sys_3.txt delete mode 100644 tasks/test3/a.out delete mode 100644 tasks/test3/main.cpp delete mode 100644 tasks/test4/a.out delete mode 100644 tasks/test4/main.cpp diff --git a/tasks/example_processes/common/include/common.hpp b/tasks/example_processes/common/include/common.hpp deleted file mode 100644 index 127d96c4c2..0000000000 --- a/tasks/example_processes/common/include/common.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include -#include - -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_processes { - -using InType = int; -using OutType = int; -using TestType = std::tuple; -using BaseTask = ppc::task::Task; - -} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes/data/pic.jpg b/tasks/example_processes/data/pic.jpg deleted file mode 100644 index 637624238c89d914613ed301968bffbf462bc110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY - -#include -#include - -#include "example_processes/common/include/common.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_processes { - -NesterovATestTaskMPI::NesterovATestTaskMPI(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskMPI::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskMPI::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskMPI::RunImpl() { - auto input = GetInput(); - if (input == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int rank = 0; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - - if (rank == 0) { - GetOutput() /= num_threads; - } else { - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } - - if (counter != 0) { - GetOutput() /= counter; - } - } - - MPI_Barrier(MPI_COMM_WORLD); - return GetOutput() > 0; -} - -bool NesterovATestTaskMPI::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes/report.md b/tasks/example_processes/report.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tasks/example_processes/seq/include/ops_seq.hpp b/tasks/example_processes/seq/include/ops_seq.hpp deleted file mode 100644 index f264b4fd78..0000000000 --- a/tasks/example_processes/seq/include/ops_seq.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "example_processes/common/include/common.hpp" -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_processes { - -class NesterovATestTaskSEQ : public BaseTask { - public: - static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { - return ppc::task::TypeOfTask::kSEQ; - } - explicit NesterovATestTaskSEQ(const InType &in); - - private: - bool ValidationImpl() override; - bool PreProcessingImpl() override; - bool RunImpl() override; - bool PostProcessingImpl() override; -}; - -} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes/seq/src/ops_seq.cpp b/tasks/example_processes/seq/src/ops_seq.cpp deleted file mode 100644 index 2599c518ea..0000000000 --- a/tasks/example_processes/seq/src/ops_seq.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "example_processes/seq/include/ops_seq.hpp" - -#include -#include - -#include "example_processes/common/include/common.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_processes { - -NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskSEQ::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskSEQ::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskSEQ::RunImpl() { - if (GetInput() == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } - - if (counter != 0) { - GetOutput() /= counter; - } - return GetOutput() > 0; -} - -bool NesterovATestTaskSEQ::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes/settings.json b/tasks/example_processes/settings.json deleted file mode 100644 index b1a0d52574..0000000000 --- a/tasks/example_processes/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "tasks_type": "processes", - "tasks": { - "mpi": "enabled", - "seq": "enabled" - } -} diff --git a/tasks/example_processes/tests/.clang-tidy b/tasks/example_processes/tests/.clang-tidy deleted file mode 100644 index ef43b7aa8a..0000000000 --- a/tasks/example_processes/tests/.clang-tidy +++ /dev/null @@ -1,13 +0,0 @@ -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/example_processes/tests/functional/main.cpp b/tasks/example_processes/tests/functional/main.cpp deleted file mode 100644 index 23e91e3fdb..0000000000 --- a/tasks/example_processes/tests/functional/main.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "example_processes/common/include/common.hpp" -#include "example_processes/mpi/include/ops_mpi.hpp" -#include "example_processes/seq/include/ops_seq.hpp" -#include "util/include/func_test_util.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_processes { - -class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests { - public: - static std::string PrintTestParam(const TestType &test_param) { - return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); - } - - protected: - void SetUp() override { - int width = -1; - int height = -1; - int channels = -1; - std::vector img; - // Read image in RGB to ensure consistent channel count - { - std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_example_processes, "pic.jpg"); - auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); - if (data == nullptr) { - throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); - } - channels = STBI_rgb; - img = std::vector(data, data + (static_cast(width * height * channels))); - stbi_image_free(data); - if (std::cmp_not_equal(width, height)) { - throw std::runtime_error("width != height: "); - } - } - - TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); - } - - bool CheckTestOutputData(OutType &output_data) final { - return (input_data_ == output_data); - } - - InType GetTestInputData() final { - return input_data_; - } - - private: - InType input_data_ = 0; -}; - -namespace { - -TEST_P(NesterovARunFuncTestsProcesses, MatmulFromPic) { - ExecuteTest(GetParam()); -} - -const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; - -const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes)); - -const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); - -const auto kPerfTestName = NesterovARunFuncTestsProcesses::PrintFuncTestName; - -INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses, kGtestValues, kPerfTestName); - -} // namespace - -} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes/tests/performance/main.cpp b/tasks/example_processes/tests/performance/main.cpp deleted file mode 100644 index 5d9a4c7125..0000000000 --- a/tasks/example_processes/tests/performance/main.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include - -#include "example_processes/common/include/common.hpp" -#include "example_processes/mpi/include/ops_mpi.hpp" -#include "example_processes/seq/include/ops_seq.hpp" -#include "util/include/perf_test_util.hpp" - -namespace nesterov_a_test_task_processes { - -class ExampleRunPerfTestProcesses : public ppc::util::BaseRunPerfTests { - const int kCount_ = 100; - InType input_data_{}; - - void SetUp() override { - input_data_ = kCount_; - } - - bool CheckTestOutputData(OutType &output_data) final { - return input_data_ == output_data; - } - - InType GetTestInputData() final { - return input_data_; - } -}; - -TEST_P(ExampleRunPerfTestProcesses, RunPerfModes) { - ExecuteTest(GetParam()); -} - -const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_processes); - -const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); - -const auto kPerfTestName = ExampleRunPerfTestProcesses::CustomPerfTestName; - -INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses, kGtestValues, kPerfTestName); - -} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes_2/common/include/common.hpp b/tasks/example_processes_2/common/include/common.hpp deleted file mode 100644 index 145054df0b..0000000000 --- a/tasks/example_processes_2/common/include/common.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include -#include - -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_processes_2 { - -using InType = int; -using OutType = int; -using TestType = std::tuple; -using BaseTask = ppc::task::Task; - -} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_2/data/pic.jpg b/tasks/example_processes_2/data/pic.jpg deleted file mode 100644 index 637624238c89d914613ed301968bffbf462bc110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY - -#include -#include - -#include "example_processes_2/common/include/common.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_processes_2 { - -NesterovATestTaskMPI::NesterovATestTaskMPI(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskMPI::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskMPI::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskMPI::RunImpl() { - auto input = GetInput(); - if (input == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int rank = 0; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - - if (rank == 0) { - GetOutput() /= num_threads; - } else { - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } - - if (counter != 0) { - GetOutput() /= counter; - } - } - - MPI_Barrier(MPI_COMM_WORLD); - return GetOutput() > 0; -} - -bool NesterovATestTaskMPI::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_2/report.md b/tasks/example_processes_2/report.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tasks/example_processes_2/seq/include/ops_seq.hpp b/tasks/example_processes_2/seq/include/ops_seq.hpp deleted file mode 100644 index ac1ad69449..0000000000 --- a/tasks/example_processes_2/seq/include/ops_seq.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "example_processes_2/common/include/common.hpp" -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_processes_2 { - -class NesterovATestTaskSEQ : public BaseTask { - public: - static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { - return ppc::task::TypeOfTask::kSEQ; - } - explicit NesterovATestTaskSEQ(const InType &in); - - private: - bool ValidationImpl() override; - bool PreProcessingImpl() override; - bool RunImpl() override; - bool PostProcessingImpl() override; -}; - -} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_2/seq/src/ops_seq.cpp b/tasks/example_processes_2/seq/src/ops_seq.cpp deleted file mode 100644 index ea4a0c6297..0000000000 --- a/tasks/example_processes_2/seq/src/ops_seq.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "example_processes_2/seq/include/ops_seq.hpp" - -#include -#include - -#include "example_processes_2/common/include/common.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_processes_2 { - -NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskSEQ::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskSEQ::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskSEQ::RunImpl() { - if (GetInput() == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } - - if (counter != 0) { - GetOutput() /= counter; - } - return GetOutput() > 0; -} - -bool NesterovATestTaskSEQ::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_2/settings.json b/tasks/example_processes_2/settings.json deleted file mode 100644 index b1a0d52574..0000000000 --- a/tasks/example_processes_2/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "tasks_type": "processes", - "tasks": { - "mpi": "enabled", - "seq": "enabled" - } -} diff --git a/tasks/example_processes_2/tests/.clang-tidy b/tasks/example_processes_2/tests/.clang-tidy deleted file mode 100644 index ef43b7aa8a..0000000000 --- a/tasks/example_processes_2/tests/.clang-tidy +++ /dev/null @@ -1,13 +0,0 @@ -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/example_processes_2/tests/functional/main.cpp b/tasks/example_processes_2/tests/functional/main.cpp deleted file mode 100644 index dbe2b0c472..0000000000 --- a/tasks/example_processes_2/tests/functional/main.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "example_processes_2/common/include/common.hpp" -#include "example_processes_2/mpi/include/ops_mpi.hpp" -#include "example_processes_2/seq/include/ops_seq.hpp" -#include "util/include/func_test_util.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_processes_2 { - -class NesterovARunFuncTestsProcesses2 : public ppc::util::BaseRunFuncTests { - public: - static std::string PrintTestParam(const TestType &test_param) { - return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); - } - - protected: - void SetUp() override { - int width = -1; - int height = -1; - int channels = -1; - std::vector img; - // Read image in RGB to ensure consistent channel count - { - std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_example_processes_2, "pic.jpg"); - auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); - if (data == nullptr) { - throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); - } - channels = STBI_rgb; - img = std::vector(data, data + (static_cast(width * height * channels))); - stbi_image_free(data); - if (std::cmp_not_equal(width, height)) { - throw std::runtime_error("width != height: "); - } - } - - TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); - } - - bool CheckTestOutputData(OutType &output_data) final { - return (input_data_ == output_data); - } - - InType GetTestInputData() final { - return input_data_; - } - - private: - InType input_data_ = 0; -}; - -namespace { - -TEST_P(NesterovARunFuncTestsProcesses2, MatmulFromPic) { - ExecuteTest(GetParam()); -} - -const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; - -const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes_2), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes_2)); - -const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); - -const auto kPerfTestName = NesterovARunFuncTestsProcesses2::PrintFuncTestName; - -INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses2, kGtestValues, kPerfTestName); - -} // namespace - -} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_2/tests/performance/main.cpp b/tasks/example_processes_2/tests/performance/main.cpp deleted file mode 100644 index 23036173c2..0000000000 --- a/tasks/example_processes_2/tests/performance/main.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include - -#include "example_processes_2/common/include/common.hpp" -#include "example_processes_2/mpi/include/ops_mpi.hpp" -#include "example_processes_2/seq/include/ops_seq.hpp" -#include "util/include/perf_test_util.hpp" - -namespace nesterov_a_test_task_processes_2 { - -class ExampleRunPerfTestProcesses2 : 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(ExampleRunPerfTestProcesses2, RunPerfModes) { - ExecuteTest(GetParam()); -} - -const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_processes_2); - -const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); - -const auto kPerfTestName = ExampleRunPerfTestProcesses2::CustomPerfTestName; - -INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses2, kGtestValues, kPerfTestName); - -} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_3/common/include/common.hpp b/tasks/example_processes_3/common/include/common.hpp deleted file mode 100644 index ac343ab8f5..0000000000 --- a/tasks/example_processes_3/common/include/common.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include -#include - -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_processes_3 { - -using InType = int; -using OutType = int; -using TestType = std::tuple; -using BaseTask = ppc::task::Task; - -} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_processes_3/data/pic.jpg b/tasks/example_processes_3/data/pic.jpg deleted file mode 100644 index 637624238c89d914613ed301968bffbf462bc110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY - -#include -#include - -#include "example_processes_3/common/include/common.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_processes_3 { - -NesterovATestTaskMPI::NesterovATestTaskMPI(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskMPI::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskMPI::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskMPI::RunImpl() { - auto input = GetInput(); - if (input == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int rank = 0; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - - if (rank == 0) { - GetOutput() /= num_threads; - } else { - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } - - if (counter != 0) { - GetOutput() /= counter; - } - } - - MPI_Barrier(MPI_COMM_WORLD); - return GetOutput() > 0; -} - -bool NesterovATestTaskMPI::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_processes_3/report.md b/tasks/example_processes_3/report.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tasks/example_processes_3/seq/include/ops_seq.hpp b/tasks/example_processes_3/seq/include/ops_seq.hpp deleted file mode 100644 index 5a7b33677c..0000000000 --- a/tasks/example_processes_3/seq/include/ops_seq.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "example_processes_3/common/include/common.hpp" -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_processes_3 { - -class NesterovATestTaskSEQ : public BaseTask { - public: - static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { - return ppc::task::TypeOfTask::kSEQ; - } - explicit NesterovATestTaskSEQ(const InType &in); - - private: - bool ValidationImpl() override; - bool PreProcessingImpl() override; - bool RunImpl() override; - bool PostProcessingImpl() override; -}; - -} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_processes_3/seq/src/ops_seq.cpp b/tasks/example_processes_3/seq/src/ops_seq.cpp deleted file mode 100644 index 1db5c7340e..0000000000 --- a/tasks/example_processes_3/seq/src/ops_seq.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "example_processes_3/seq/include/ops_seq.hpp" - -#include -#include - -#include "example_processes_3/common/include/common.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_processes_3 { - -NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskSEQ::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskSEQ::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskSEQ::RunImpl() { - if (GetInput() == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } - - if (counter != 0) { - GetOutput() /= counter; - } - return GetOutput() > 0; -} - -bool NesterovATestTaskSEQ::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_processes_3/settings.json b/tasks/example_processes_3/settings.json deleted file mode 100644 index b1a0d52574..0000000000 --- a/tasks/example_processes_3/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "tasks_type": "processes", - "tasks": { - "mpi": "enabled", - "seq": "enabled" - } -} diff --git a/tasks/example_processes_3/tests/.clang-tidy b/tasks/example_processes_3/tests/.clang-tidy deleted file mode 100644 index ef43b7aa8a..0000000000 --- a/tasks/example_processes_3/tests/.clang-tidy +++ /dev/null @@ -1,13 +0,0 @@ -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/example_processes_3/tests/functional/main.cpp b/tasks/example_processes_3/tests/functional/main.cpp deleted file mode 100644 index 20a89ea793..0000000000 --- a/tasks/example_processes_3/tests/functional/main.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "example_processes_3/common/include/common.hpp" -#include "example_processes_3/mpi/include/ops_mpi.hpp" -#include "example_processes_3/seq/include/ops_seq.hpp" -#include "util/include/func_test_util.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_processes_3 { - -class NesterovARunFuncTestsProcesses3 : public ppc::util::BaseRunFuncTests { - public: - static std::string PrintTestParam(const TestType &test_param) { - return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); - } - - protected: - void SetUp() override { - int width = -1; - int height = -1; - int channels = -1; - std::vector img; - // Read image in RGB to ensure consistent channel count - { - std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_example_processes_3, "pic.jpg"); - auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); - if (data == nullptr) { - throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); - } - channels = STBI_rgb; - img = std::vector(data, data + (static_cast(width * height * channels))); - stbi_image_free(data); - if (std::cmp_not_equal(width, height)) { - throw std::runtime_error("width != height: "); - } - } - - TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); - } - - bool CheckTestOutputData(OutType &output_data) final { - return (input_data_ == output_data); - } - - InType GetTestInputData() final { - return input_data_; - } - - private: - InType input_data_ = 0; -}; - -namespace { - -TEST_P(NesterovARunFuncTestsProcesses3, MatmulFromPic) { - ExecuteTest(GetParam()); -} - -const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; - -const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes_3), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes_3)); - -const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); - -const auto kPerfTestName = NesterovARunFuncTestsProcesses3::PrintFuncTestName; - -INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses3, kGtestValues, kPerfTestName); - -} // namespace - -} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_processes_3/tests/performance/main.cpp b/tasks/example_processes_3/tests/performance/main.cpp deleted file mode 100644 index cae4b67d9b..0000000000 --- a/tasks/example_processes_3/tests/performance/main.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include - -#include "example_processes_3/common/include/common.hpp" -#include "example_processes_3/mpi/include/ops_mpi.hpp" -#include "example_processes_3/seq/include/ops_seq.hpp" -#include "util/include/perf_test_util.hpp" - -namespace nesterov_a_test_task_processes_3 { - -class ExampleRunPerfTestProcesses3 : 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(ExampleRunPerfTestProcesses3, RunPerfModes) { - ExecuteTest(GetParam()); -} - -const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_processes_3); - -const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); - -const auto kPerfTestName = ExampleRunPerfTestProcesses3::CustomPerfTestName; - -INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses3, kGtestValues, kPerfTestName); - -} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_threads/all/include/ops_all.hpp b/tasks/example_threads/all/include/ops_all.hpp deleted file mode 100644 index c2d44989da..0000000000 --- a/tasks/example_threads/all/include/ops_all.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "example_threads/common/include/common.hpp" -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_threads { - -class NesterovATestTaskALL : public BaseTask { - public: - static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { - return ppc::task::TypeOfTask::kALL; - } - explicit NesterovATestTaskALL(const InType &in); - - private: - bool ValidationImpl() override; - bool PreProcessingImpl() override; - bool RunImpl() override; - bool PostProcessingImpl() override; -}; - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/all/report.md b/tasks/example_threads/all/report.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tasks/example_threads/all/src/ops_all.cpp b/tasks/example_threads/all/src/ops_all.cpp deleted file mode 100644 index 92a438555e..0000000000 --- a/tasks/example_threads/all/src/ops_all.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include "example_threads/all/include/ops_all.hpp" - -#include - -#include -#include -#include -#include - -#include "example_threads/common/include/common.hpp" -#include "oneapi/tbb/parallel_for.h" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_threads { - -NesterovATestTaskALL::NesterovATestTaskALL(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskALL::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskALL::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskALL::RunImpl() { - 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 = -1; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - if (rank == 0) { - std::atomic counter(0); -#pragma omp parallel default(none) shared(counter) num_threads(ppc::util::GetNumThreads()) - counter++; - - GetOutput() /= counter; - } else { - GetOutput() /= num_threads; - } - } - - { - GetOutput() *= num_threads; - std::vector threads(num_threads); - std::atomic counter(0); - for (int i = 0; i < num_threads; i++) { - threads[i] = std::thread([&]() { counter++; }); - threads[i].join(); - } - GetOutput() /= counter; - } - - { - GetOutput() *= num_threads; - std::atomic counter(0); - tbb::parallel_for(0, ppc::util::GetNumThreads(), [&](int /*i*/) { counter++; }); - GetOutput() /= counter; - } - MPI_Barrier(MPI_COMM_WORLD); - return GetOutput() > 0; -} - -bool NesterovATestTaskALL::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/common/include/common.hpp b/tasks/example_threads/common/include/common.hpp deleted file mode 100644 index f75fe17799..0000000000 --- a/tasks/example_threads/common/include/common.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include -#include - -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_threads { - -using InType = int; -using OutType = int; -using TestType = std::tuple; -using BaseTask = ppc::task::Task; - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/data/pic.jpg b/tasks/example_threads/data/pic.jpg deleted file mode 100644 index 637624238c89d914613ed301968bffbf462bc110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY -#include -#include - -#include "example_threads/common/include/common.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_threads { - -NesterovATestTaskOMP::NesterovATestTaskOMP(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskOMP::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskOMP::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskOMP::RunImpl() { - 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; - - std::atomic counter(0); -#pragma omp parallel default(none) shared(counter) num_threads(ppc::util::GetNumThreads()) - counter++; - - GetOutput() /= counter; - return GetOutput() > 0; -} - -bool NesterovATestTaskOMP::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/report.md b/tasks/example_threads/report.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tasks/example_threads/seq/include/ops_seq.hpp b/tasks/example_threads/seq/include/ops_seq.hpp deleted file mode 100644 index a16e3a390d..0000000000 --- a/tasks/example_threads/seq/include/ops_seq.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "example_threads/common/include/common.hpp" -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_threads { - -class NesterovATestTaskSEQ : public BaseTask { - public: - static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { - return ppc::task::TypeOfTask::kSEQ; - } - explicit NesterovATestTaskSEQ(const InType &in); - - private: - bool ValidationImpl() override; - bool PreProcessingImpl() override; - bool RunImpl() override; - bool PostProcessingImpl() override; -}; - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/seq/report.md b/tasks/example_threads/seq/report.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tasks/example_threads/seq/src/ops_seq.cpp b/tasks/example_threads/seq/src/ops_seq.cpp deleted file mode 100644 index 8888b32587..0000000000 --- a/tasks/example_threads/seq/src/ops_seq.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "example_threads/seq/include/ops_seq.hpp" - -#include -#include - -#include "example_threads/common/include/common.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_threads { - -NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskSEQ::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskSEQ::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskSEQ::RunImpl() { - if (GetInput() == 0) { - return false; - } - - for (InType i = 0; i < GetInput(); i++) { - for (InType j = 0; j < GetInput(); j++) { - for (InType k = 0; k < GetInput(); k++) { - std::vector tmp(i + j + k, 1); - GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); - GetOutput() -= i + j + k; - } - } - } - - const int num_threads = ppc::util::GetNumThreads(); - GetOutput() *= num_threads; - - int counter = 0; - for (int i = 0; i < num_threads; i++) { - counter++; - } - - if (counter != 0) { - GetOutput() /= counter; - } - return GetOutput() > 0; -} - -bool NesterovATestTaskSEQ::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/settings.json b/tasks/example_threads/settings.json deleted file mode 100644 index f8c285c85e..0000000000 --- a/tasks/example_threads/settings.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "tasks_type": "threads", - "tasks": { - "all": "enabled", - "omp": "enabled", - "seq": "enabled", - "stl": "enabled", - "tbb": "enabled" - } -} diff --git a/tasks/example_threads/stl/include/ops_stl.hpp b/tasks/example_threads/stl/include/ops_stl.hpp deleted file mode 100644 index f33b8b8beb..0000000000 --- a/tasks/example_threads/stl/include/ops_stl.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "example_threads/common/include/common.hpp" -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_threads { - -class NesterovATestTaskSTL : public BaseTask { - public: - static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { - return ppc::task::TypeOfTask::kSTL; - } - explicit NesterovATestTaskSTL(const InType &in); - - private: - bool ValidationImpl() override; - bool PreProcessingImpl() override; - bool RunImpl() override; - bool PostProcessingImpl() override; -}; - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/stl/report.md b/tasks/example_threads/stl/report.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tasks/example_threads/stl/src/ops_stl.cpp b/tasks/example_threads/stl/src/ops_stl.cpp deleted file mode 100644 index 33fcaec2bb..0000000000 --- a/tasks/example_threads/stl/src/ops_stl.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include "example_threads/stl/include/ops_stl.hpp" - -#include -#include -#include -#include - -#include "example_threads/common/include/common.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_threads { - -NesterovATestTaskSTL::NesterovATestTaskSTL(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskSTL::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskSTL::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskSTL::RunImpl() { - 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(); - std::vector threads(num_threads); - GetOutput() *= num_threads; - - std::atomic counter(0); - for (int i = 0; i < num_threads; i++) { - threads[i] = std::thread([&]() { counter++; }); - threads[i].join(); - } - - GetOutput() /= counter; - return GetOutput() > 0; -} - -bool NesterovATestTaskSTL::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/tbb/include/ops_tbb.hpp b/tasks/example_threads/tbb/include/ops_tbb.hpp deleted file mode 100644 index dabe985b4f..0000000000 --- a/tasks/example_threads/tbb/include/ops_tbb.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "example_threads/common/include/common.hpp" -#include "task/include/task.hpp" - -namespace nesterov_a_test_task_threads { - -class NesterovATestTaskTBB : public BaseTask { - public: - static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { - return ppc::task::TypeOfTask::kTBB; - } - explicit NesterovATestTaskTBB(const InType &in); - - private: - bool ValidationImpl() override; - bool PreProcessingImpl() override; - bool RunImpl() override; - bool PostProcessingImpl() override; -}; - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/tbb/report.md b/tasks/example_threads/tbb/report.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tasks/example_threads/tbb/src/ops_tbb.cpp b/tasks/example_threads/tbb/src/ops_tbb.cpp deleted file mode 100644 index 1d606b8df5..0000000000 --- a/tasks/example_threads/tbb/src/ops_tbb.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "example_threads/tbb/include/ops_tbb.hpp" - -#include - -#include -#include -#include -#include - -#include "example_threads/common/include/common.hpp" -#include "oneapi/tbb/parallel_for.h" - -namespace nesterov_a_test_task_threads { - -NesterovATestTaskTBB::NesterovATestTaskTBB(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = 0; -} - -bool NesterovATestTaskTBB::ValidationImpl() { - return (GetInput() > 0) && (GetOutput() == 0); -} - -bool NesterovATestTaskTBB::PreProcessingImpl() { - GetOutput() = 2 * GetInput(); - return GetOutput() > 0; -} - -bool NesterovATestTaskTBB::RunImpl() { - 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; - - std::atomic counter(0); - tbb::parallel_for(0, ppc::util::GetNumThreads(), [&](int /*i*/) { counter++; }); - - GetOutput() /= counter; - return GetOutput() > 0; -} - -bool NesterovATestTaskTBB::PostProcessingImpl() { - GetOutput() -= GetInput(); - return GetOutput() > 0; -} - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/tests/.clang-tidy b/tasks/example_threads/tests/.clang-tidy deleted file mode 100644 index ef43b7aa8a..0000000000 --- a/tasks/example_threads/tests/.clang-tidy +++ /dev/null @@ -1,13 +0,0 @@ -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/example_threads/tests/functional/main.cpp b/tasks/example_threads/tests/functional/main.cpp deleted file mode 100644 index 2e99e7bf67..0000000000 --- a/tasks/example_threads/tests/functional/main.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "example_threads/all/include/ops_all.hpp" -#include "example_threads/common/include/common.hpp" -#include "example_threads/omp/include/ops_omp.hpp" -#include "example_threads/seq/include/ops_seq.hpp" -#include "example_threads/stl/include/ops_stl.hpp" -#include "example_threads/tbb/include/ops_tbb.hpp" -#include "util/include/func_test_util.hpp" -#include "util/include/util.hpp" - -namespace nesterov_a_test_task_threads { - -class NesterovARunFuncTestsThreads : public ppc::util::BaseRunFuncTests { - public: - static std::string PrintTestParam(const TestType &test_param) { - return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); - } - - protected: - void SetUp() override { - int width = -1; - int height = -1; - int channels = -1; - std::vector img; - // Read image in RGB to ensure consistent channel count - { - std::string abs_path = ppc::util::GetAbsoluteTaskPath(std::string(PPC_ID_example_threads), "pic.jpg"); - auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); - if (data == nullptr) { - throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); - } - channels = STBI_rgb; - img = std::vector(data, data + (static_cast(width * height * channels))); - stbi_image_free(data); - if (std::cmp_not_equal(width, height)) { - throw std::runtime_error("width != height: "); - } - } - - TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); - input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); - } - - bool CheckTestOutputData(OutType &output_data) final { - return (input_data_ == output_data); - } - - InType GetTestInputData() final { - return input_data_; - } - - private: - InType input_data_ = 0; -}; - -namespace { - -TEST_P(NesterovARunFuncTestsThreads, MatmulFromPic) { - ExecuteTest(GetParam()); -} - -const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; - -const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads)); - -const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); - -const auto kPerfTestName = NesterovARunFuncTestsThreads::PrintFuncTestName; - -INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsThreads, kGtestValues, kPerfTestName); - -} // namespace - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/tests/performance/main.cpp b/tasks/example_threads/tests/performance/main.cpp deleted file mode 100644 index c59e817421..0000000000 --- a/tasks/example_threads/tests/performance/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include - -#include "example_threads/all/include/ops_all.hpp" -#include "example_threads/common/include/common.hpp" -#include "example_threads/omp/include/ops_omp.hpp" -#include "example_threads/seq/include/ops_seq.hpp" -#include "example_threads/stl/include/ops_stl.hpp" -#include "example_threads/tbb/include/ops_tbb.hpp" -#include "util/include/perf_test_util.hpp" - -namespace nesterov_a_test_task_threads { - -class ExampleRunPerfTestThreads : public ppc::util::BaseRunPerfTests { - const int kCount_ = 200; - 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(ExampleRunPerfTestThreads, RunPerfModes) { - ExecuteTest(GetParam()); -} - -const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_threads); - -const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); - -const auto kPerfTestName = ExampleRunPerfTestThreads::CustomPerfTestName; - -INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestThreads, kGtestValues, kPerfTestName); - -} // namespace nesterov_a_test_task_threads diff --git a/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp b/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp index 84acea9c1c..090e415fe1 100644 --- a/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp +++ b/tasks/konovalov_s_seidel_iterative_method/mpi/include/ops_mpi.hpp @@ -23,7 +23,6 @@ class KonovalovSSeidelMethodMPI : public BaseTask { void InitMatrixB(int size, int fmax, std::vector &B); void DataDistr(int size, int diff, int mtr_size); void DataRecv(std::vector &A_local, std::vector &B_local, int matrix_size, int diff); - std::vector Coloring(int size, std::vector &_A); }; } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp index 666151a69f..97e5774328 100644 --- a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp @@ -54,7 +54,6 @@ void KonovalovSSeidelMethodMPI::InitMatrixA(int size, int fmax, std::vector } while (j < diff); A[i * size + i] = abs(sum + 1); } - std::cout << __FILE__ << ":" << __LINE__ << ": initial x: " << x << " " << std::endl; } void KonovalovSSeidelMethodMPI::InitMatrixB(int size, int fmax, std::vector &B) { @@ -63,28 +62,6 @@ void KonovalovSSeidelMethodMPI::InitMatrixB(int size, int fmax, std::vector } } -std::vector KonovalovSSeidelMethodMPI::Coloring(int size, std::vector &_A) { - std::vector A = _A; // coefficient matrix.int - std::vector color(size); // colors of rows. - for (int i = 0; i < size; ++i) { - color[i] = -1; - } - for (int i = 0; i < size; ++i) { - int m = 0; - for (int j = 0; j < i; j++) { - if (A[i * size + j] != 0 && color[j] == m) { - ++m; - } - } - color[i] = m; - } - std::cout << "colors "; - for (auto i : color) { - std::cout << i << " "; - } - std::cout << std::endl; - return color; -} std::vector KonovalovSSeidelMethodMPI::IterationStep(int mtr_size, int diff, int rank, std::vector &_A, std::vector &_B, std::vector &X_gl) { @@ -94,15 +71,9 @@ std::vector KonovalovSSeidelMethodMPI::IterationStep(int mtr_size, int d for (int i = 0; i < diff; i++) { int diag = (rank - 1) * (diff) + i; - - // std::cout << rank << " " << diag << std::endl; X_new[diag] = (double)_B[i] / (double)_A[diag + i * mtr_size]; for (int j = 0; j < mtr_size; j++) { - // std::cout << rank << " for " << i << std::endl; - if (i * mtr_size + j == diag) { - // std::cout << rank << " if " << j << std::endl; - continue; } @@ -111,17 +82,7 @@ std::vector KonovalovSSeidelMethodMPI::IterationStep(int mtr_size, int d X[diag] = round(X_new[diag] * 1000) / 1000; X_ret[i] = X[diag]; - // MPI_Barrier(MPI_COMM_WORLD); - // std::cout << __FILE__ << ":" << __LINE__ << ": r: " << rank << " daig:" << diag << " B[i]: " << _B[i] - // << " A: " << _A[diag + i * mtr_size]; - // std::cout << " old: " << X[diag] << " stored: " << X_new[diag] << std::endl; } - // iter--; - - // if (flag) { - // break; - // } - // } return X_ret; } @@ -151,18 +112,6 @@ void KonovalovSSeidelMethodMPI::DataRecv(std::vector &A_local, std::vector< MPI_Recv(&A_local[0], matrix_size * diff, MPI_INT, 0, 0, MPI_COMM_WORLD, &s); MPI_Recv(&B_local[0], diff, MPI_INT, 0, 0, MPI_COMM_WORLD, &s); - // std::cout << "size: " << A_local.size() << std::endl; - // std::cout << "mtr size: " << matrix_size << std::endl; - // std::cout << " local A: " << std::endl; - // int c = 0; - // for (int i = 0; i < matrix_size * diff; i++) { - // std::cout << A_local[i] << " "; - // if (i % matrix_size == matrix_size - 1) { - // std::cout << B_local[c] << std::endl; - // c++; - // } - // } - // std::cout << std::endl; } bool KonovalovSSeidelMethodMPI::RunImpl() { @@ -175,7 +124,6 @@ bool KonovalovSSeidelMethodMPI::RunImpl() { int matrix_size = GetInput(); int diff = matrix_size / (size - 1); - // std::cout << rank << " diff " << diff << std::endl; std::vector gl_x_vec(size * diff, 0.0); std::vector local_x_vec(diff, 0.0); @@ -203,61 +151,40 @@ bool KonovalovSSeidelMethodMPI::RunImpl() { for (int i = 0; i < diff; i++) { cover_tracker = cover_tracker && (std::fabs(local_x_vec[i] - gl_x_vec[(rank)*diff + i]) < epsi); } - // std::cout << "p" << rank << " local X: " << std::endl; - // for (int i = 0; i < diff; i++) { - // std::cout << local_x_vec[i] << " "; - // } - // std::cout << std::endl; } MPI_Barrier(MPI_COMM_WORLD); if (rank == 0) { std::vector counts(size, diff); - - // std::cout << "p" << rank << " counts: " << counts.data() << std::endl; - std::vector displacements(size); for (int i = 0; i < size; i++) { displacements[i] = diff * i; } - // std::cout << "p" << rank << " displ: "; //<< displacements.data() << std::endl; - // for (int i = 0; i < size; i++) { - // std::cout << displacements[i] << " "; - // } - // std::cout << std::endl; - - MPI_Gatherv(&local_x_vec[0], diff, MPI_DOUBLE, &gl_x_vec[0], counts.data(), displacements.data(), MPI_DOUBLE, - 0, + MPI_Gatherv(&local_x_vec[0], diff, MPI_DOUBLE, &gl_x_vec[0], counts.data(), displacements.data(), MPI_DOUBLE, 0, MPI_COMM_WORLD); - // std::cout << std::endl; - // std::cout << "p" << rank << " gl X: " << std::endl; - // for (int i = 0; i < size * diff; i++) { - // std::cout << gl_x_vec[i] << " "; - // } - // std::cout << std::endl; } else { MPI_Gatherv(&local_x_vec[0], diff, MPI_DOUBLE, NULL, NULL, NULL, MPI_DOUBLE, 0, MPI_COMM_WORLD); } MPI_Bcast(&gl_x_vec[0], size * diff, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Allreduce(&cover_tracker, &stop_calc, 1, MPI_C_BOOL, MPI_LAND, MPI_COMM_WORLD); + if (stop_calc) { - std::cout << "iter : " << iter << std::endl; break; } iter--; } for (int i = diff; i < size * diff; i++) { GetOutput()[i - diff] = gl_x_vec[i]; + } + return true; + } - return true; -} - -bool KonovalovSSeidelMethodMPI::PostProcessingImpl() { - return true; -} + bool KonovalovSSeidelMethodMPI::PostProcessingImpl() { + return true; + } } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp b/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp index afcdcdca3b..18290a00ea 100644 --- a/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp +++ b/tasks/konovalov_s_seidel_iterative_method/seq/include/ops_seq.hpp @@ -25,7 +25,6 @@ class KonovalovSSeidelMethodSEQ : public BaseTask { double _epsi); void InitMatrixA(int size, int fmax, std::vector &A, int diff); void InitMatrixB(int size, int fmax, std::vector &B); - std::vector Coloring(int size, std::vector _A); }; } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp index 5cc8459170..33994dd0d9 100644 --- a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp @@ -59,27 +59,6 @@ void KonovalovSSeidelMethodSEQ::InitMatrixB(int size, int fmax, std::vector KonovalovSSeidelMethodSEQ::Coloring(int size, std::vector _A){ - std::vector A = _A; //coefficient matrix.int - std::vector color(size); //colors of rows. - for (int i = 0; i < size; ++i) color[i] = -1; - for (int i = 0; i < size; ++i) { - int m = 0; - for (int j = 0; j < i; j++) { - if (A[i*size + j] != 0 && color[j] == m) { - ++m; - } - } - color[i] = m; - } - // std::cout << "colors "; - // for (auto i : color) { - // std::cout << i << " "; - // } - // std::cout << std::endl; - return color; -} - std::vector KonovalovSSeidelMethodSEQ::IterationProcess(std::vector &_A, std::vector &_B, int _iter, double _epsi) { double epsi = _epsi; @@ -121,22 +100,6 @@ bool KonovalovSSeidelMethodSEQ::RunImpl() { std::vector B(size, 0.0); InitMatrixA(size, 10, A, size/4); InitMatrixB(size, 10, B); - // int c = 0; - // std::cout << "x" << c << ": "; - - // for (int i = 0; i < size * size; i++) { - // std::cout << A[i] << " "; - // if (i % size == size - 1) { - // std::cout << std::endl; - // c++; - // std::cout << "x" << c << ": "; - // } - // } - // for (int i = 0; i < size; i++) { - // std::cout << B[i] << " "; - // } - // std::cout << std::endl; - Coloring(size, A); GetOutput() = IterationProcess(A, B, 10, 0.001); return true; diff --git a/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp b/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp index 43301a35cf..b40808f567 100644 --- a/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/tests/functional/main.cpp @@ -37,11 +37,6 @@ class KonovalovSRunFuncTestsProcesses2 : public ppc::util::BaseRunFuncTests { - const int kCount_ = 100; - InType input_data_{}; - std::vector s; +class KonovalovSRunPerfTestsProcesses2 : public ppc::util::BaseRunPerfTests { void SetUp() override { + input_data_ = 2048; + incorrect_output.resize(input_data_, 0.0); } bool CheckTestOutputData(OutType &output_data) final { - return output_data == s; + return output_data != incorrect_output; } InType GetTestInputData() final { return input_data_; } + + private: + InType input_data_; + OutType incorrect_output; }; -TEST_P(ExampleRunPerfTestProcesses2, RunPerfModes) { +TEST_P( KonovalovSRunPerfTestsProcesses2, SeidelPTests) { ExecuteTest(GetParam()); } -const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_konovalov_s_seidel_iterative_method); +const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks( + PPC_SETTINGS_konovalov_s_seidel_iterative_method); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); -const auto kPerfTestName = ExampleRunPerfTestProcesses2::CustomPerfTestName; +const auto kPerfTestName = KonovalovSRunPerfTestsProcesses2::CustomPerfTestName; -INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses2, kGtestValues, kPerfTestName); +INSTANTIATE_TEST_SUITE_P(SeidelPTestRun, KonovalovSRunPerfTestsProcesses2, kGtestValues, kPerfTestName); } // namespace konovalov_s_seidel_iterative_method diff --git a/tasks/test/a.out b/tasks/test/a.out deleted file mode 100644 index 6dcf1515f115cefd1da8ae6539cd6210c3ae2314..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16280 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 -#include -#include -#include - -#define SIZE 4 - -int main(int argc, char *argv[]) -{ - // Get number of processes and check that 3 processes are used - MPI_Init(&argc, &argv); - int size; - MPI_Comm_size(MPI_COMM_WORLD, &size); - if(size != 3) - { - printf("This application is meant to be run with 3 processes.\n"); - MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE); - } - - // Determine root's rank - int root_rank = 0; - - // Get my rank - int my_rank; - MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); - - switch(my_rank) - { - case 0: - { - // Define my value - int my_value; - - // Declare the buffer - int buffer[7] = {100, 0, 101, 102, 0, 0, 103}; - - // Declare the counts - int counts[3] = {1, 2, 1}; - - // Declare the displacements - int displacements[3] = {0, 2, 6}; - - printf("Values in the buffer of root process:"); - for(int i = 0; i < 7; i++) - { - printf(" %d", buffer[i]); - } - printf("\n"); - MPI_Scatterv(buffer, counts, displacements, MPI_INT, &my_value, 1, MPI_INT, root_rank, MPI_COMM_WORLD); - printf("Process %d received value %d.\n", my_rank, my_value); - break; - } - case 1: - { - // Declare my values - int my_values[2]; - - MPI_Scatterv(NULL, NULL, NULL, MPI_INT, my_values, 2, MPI_INT, root_rank, MPI_COMM_WORLD); - printf("Process %d received values %d and %d.\n", my_rank, my_values[0], my_values[1]); - break; - } - case 2: - { - // Declare my values - int my_value; - - MPI_Scatterv(NULL, NULL, NULL, MPI_INT, &my_value, 1, MPI_INT, root_rank, MPI_COMM_WORLD); - printf("Process %d received value %d.\n", my_rank, my_value); - break; - } - } - MPI_Finalize(); - return 0; -} \ No newline at end of file diff --git a/tasks/test/sys_1.txt b/tasks/test/sys_1.txt deleted file mode 100644 index ef2c91e5a3..0000000000 --- a/tasks/test/sys_1.txt +++ /dev/null @@ -1 +0,0 @@ -3 5 10 1 1 2 10 1 2 2 10 12 13 14 1 1 1 \ No newline at end of file diff --git a/tasks/test/sys_2.txt b/tasks/test/sys_2.txt deleted file mode 100644 index 98202614a1..0000000000 --- a/tasks/test/sys_2.txt +++ /dev/null @@ -1 +0,0 @@ -3 100 4 -1 1 1 6 2 -1 -2 5 4 9 2 1 1 1 \ No newline at end of file diff --git a/tasks/test/sys_3.txt b/tasks/test/sys_3.txt deleted file mode 100644 index f1b1f72a70..0000000000 --- a/tasks/test/sys_3.txt +++ /dev/null @@ -1 +0,0 @@ -4 10 20.9 1.2 2.1 0.9 1.2 21.2 1.5 2.5 2.1 1.5 19.8 1.3 0.9 2.5 1.3 32.1 21.7 27.46 28.76 49.72 0.8 1 1.2 1.4 \ No newline at end of file diff --git a/tasks/test2/a.out b/tasks/test2/a.out deleted file mode 100644 index daf75d7a52428c6e4d209b1321cb0fa8aff56665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66088 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

JlTuD(hk)i~1o=^N{d@ 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 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -std::vector _A; -std::vector _A_local; -std::vector _B; -std::vector _B_local; -int _size, _iter; - -void init_matrix(long unsigned int size, int fmax, std::vector &A) { - int diff = 2; - double x = 1 + rand() % fmax; - for (long unsigned int i = 0; i < size; i++) { - for(int j = 0; j < diff; j++) { - if (i * size + i - j > 0 && i * size + i - j >= i * size) { - A[i * size + i - j] = x * (diff - j); - } - if (i * size + i + j < size*size && i + j < size) { - A[i * size + i + j] = x * (diff - j); - } - } - A[i * size + i] = x * (diff*diff); - } -} - -void InitMatrixB(long unsigned int size, int fmax, std::vector &B) { - for (long unsigned int i = 0; i < size; i++) { - B[i] = 1 + rand() % fmax; - } -} - -void coloring(int N, std::vector _A){ - std::vector A = _A; //coefficient matrix.int - std::vector color(N); //colors of rows. - for (int i = 0; i < N; ++i) color[i] = -1; - for (int i = 0; i < N; ++i) { - int m = 0; - for (int j = 0; j < i; j++) { - if (A[i*N + j] != 0 && color[j] == m) { - ++m; - } - } - color[i] = m; - } - std::cout << "colors "; - for (auto i : color) { - std::cout << i << " "; - } - std::cout << std::endl; -} - -std::vector iterationprocess(std::vector &_A, std::vector &_B, double X0, int _iter, - double _epsi) { - double epsi = _epsi; - int iter = _iter; - std::vector X(_B.size(), X0); - - while (iter != 0) { - bool flag = true; - - std::vector X_new(_B.size(), 0.0); - for (int i = 0; i < _B.size(); i++) { - X_new[i] = _B[i] / _A[i * _B.size() + i]; - for (int j = 0; j < _B.size(); j++) { - if (j == i) { - continue; - } - X_new[i] -= (_A[i * _B.size() + j] / _A[i * _B.size() + i]) * X[j]; - } - - flag = flag && (std::fabs(X_new[i] - X[i]) < epsi); - - X[i] = round(X_new[i] * 1000) / 1000; - } - iter--; - - if (flag) { - break; - } - } - - std::cout << "iter " << iter << std::endl; - for (auto i : _B) { - std::cout << i << " "; - } - std::cout << std::endl; - return X; -} - -int main(int argc, const char *argv[]) { - - srand(time(NULL)); - int rank = 0; - int size = 0; - - std::vector _A; - std::vector _A_local; - std::vector _B; - std::vector _B_local; - - std::string segmlist; - std::ifstream in("sys_3.txt"); - std::vector raw_data; - - while (std::getline(in, segmlist, ' ')) { - raw_data.push_back(segmlist); - } - - int _size = 8; - int _iter = std::stoi(raw_data[1]); - std::cout << _size << std::endl; - - _A.resize(_size * _size, 0.00); - _A_local.resize(_size * _size, 0.00); - _B.resize(_size, 0.00); - _B_local.resize(_size, 0.00); - - _A.resize(_size * _size, 0.0); - init_matrix(_size, 10, _A); - InitMatrixB(_size, 10, _B); - for (unsigned long int i = 0; i < _size * _size; i++) { - std::cout << _A[i] << " "; - if (i % _size == _size - 1) { - std::cout << std::endl; - } - } - std::cout << std::endl; - - std::vector X(_size, 0.0); - X = iterationprocess(_A, _B, 0, 10, 0.001); - coloring(_size, _A); - for (unsigned long int i = 0; i < _size; i++) { - std::cout << X[i] << " "; - } - std::cout << std::endl; - return 0; -} diff --git a/tasks/test2/sys_1.txt b/tasks/test2/sys_1.txt deleted file mode 100644 index ef2c91e5a3..0000000000 --- a/tasks/test2/sys_1.txt +++ /dev/null @@ -1 +0,0 @@ -3 5 10 1 1 2 10 1 2 2 10 12 13 14 1 1 1 \ No newline at end of file diff --git a/tasks/test2/sys_2.txt b/tasks/test2/sys_2.txt deleted file mode 100644 index 98202614a1..0000000000 --- a/tasks/test2/sys_2.txt +++ /dev/null @@ -1 +0,0 @@ -3 100 4 -1 1 1 6 2 -1 -2 5 4 9 2 1 1 1 \ No newline at end of file diff --git a/tasks/test2/sys_3.txt b/tasks/test2/sys_3.txt deleted file mode 100644 index f1b1f72a70..0000000000 --- a/tasks/test2/sys_3.txt +++ /dev/null @@ -1 +0,0 @@ -4 10 20.9 1.2 2.1 0.9 1.2 21.2 1.5 2.5 2.1 1.5 19.8 1.3 0.9 2.5 1.3 32.1 21.7 27.46 28.76 49.72 0.8 1 1.2 1.4 \ No newline at end of file diff --git a/tasks/test3/a.out b/tasks/test3/a.out deleted file mode 100644 index 8489bd708d836c53961f3be9bae9b98d11d95b09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16352 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 QT=w(7scWpT7+6^LZ)AH&Pyhe` diff --git a/tasks/test3/main.cpp b/tasks/test3/main.cpp deleted file mode 100644 index 1578c54f52..0000000000 --- a/tasks/test3/main.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include -#include - -int main(int argc, char *argv[]) { - int rank, size; - MPI_Init(&argc, &argv); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - int rows = 3, cols = 4; - int full_array[3][4] = { - {1, 2, 3, 4}, - {5, 6, 7, 8}, - {9, 10, 11, 12} - }; - - // Создаем тип для строки - MPI_Datatype ROW_TYPE; - MPI_Type_vector(cols, 1, 1, MPI_INT, &ROW_TYPE); - MPI_Type_commit(&ROW_TYPE); - - // Процесс 0 рассылает строки всем процессам - if (rank == 0) { - for (int dest = 1; dest < size; dest++) { - if (dest - 1 < rows) { - MPI_Send(&full_array[dest - 1][0], 1, ROW_TYPE, - dest, 0, MPI_COMM_WORLD); - printf("Отправлена строка %d процессу %d\n", dest - 1, dest); - } - } - } else if (rank - 1 < rows) { - int my_row[cols]; - MPI_Recv(my_row, cols, MPI_INT, 0, 0, - MPI_COMM_WORLD, MPI_STATUS_IGNORE); - - printf("Процесс %d получил строку: ", rank); - for (int j = 0; j < cols; j++) { - printf("%d ", my_row[j]); - } - printf("\n"); - } - - MPI_Type_free(&ROW_TYPE); - MPI_Finalize(); - return 0; -} diff --git a/tasks/test4/a.out b/tasks/test4/a.out deleted file mode 100644 index 1397ff6ce976e366441e646033e2bc364a54a799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24744 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 MP|kBGII7~m0dMcrQ~&?~ diff --git a/tasks/test4/main.cpp b/tasks/test4/main.cpp deleted file mode 100644 index a73eb2dc7c..0000000000 --- a/tasks/test4/main.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include -#include - -int main(int argc, char** argv) { - MPI_Init(&argc, &argv); - - int world_size, world_rank; - MPI_Comm_size(MPI_COMM_WORLD, &world_size); - MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); - - const int ROWS = 4; - const int COLS = 3; - // Use a 1D vector to represent a 2D matrix (ROWS x COLS) in row-major order - std::vector matrix(ROWS * COLS); - - if (world_rank == 0) { - // Initialize the matrix with some values - for (int i = 0; i < ROWS * COLS; ++i) { - matrix[i] = i; - } - // Example: matrix looks like - // 0 1 2 - // 3 4 5 - // 6 7 8 - // 9 10 11 - } - - // --- Create a new MPI Datatype for a single column --- - MPI_Datatype column_type; - int count = ROWS; // Number of blocks (rows) - int blocklength = 1; // Number of elements in each block (one per row) - // Stride is the distance between the start of one block and the next - int stride = COLS; // Stride in terms of the number of 'oldtype' elements - - // The oldtype is the basic data type of elements in the vector - MPI_Type_vector(count, blocklength, stride, MPI_INT, &column_type); - MPI_Type_commit(&column_type); // Commit the new type before use - - // Example MPI communication (sending the first column from rank 0 to rank 1) - if (world_rank == 0) { - // Send the first column (starting at the beginning of the data array) - MPI_Send(matrix.data(), 1, column_type, 1, 0, MPI_COMM_WORLD); - } else { - std::vector received_column(ROWS); // Vector to store the received column - // Receive into a contiguous vector - MPI_Recv(received_column.data(), ROWS, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - - std::cout << "Rank 1 received column: "; - for (int val : received_column) { - std::cout << val << " "; // Expected: 0 3 6 9 - } - std::cout << std::endl; - } - - // Clean up the created datatype - MPI_Type_free(&column_type); - MPI_Finalize(); - return 0; -} From b7a7ccfa36216bf609ac65cfac5f5b091d9870bd Mon Sep 17 00:00:00 2001 From: sergkon314 <63008261+sergkon314@users.noreply.github.com> Date: Thu, 25 Dec 2025 00:01:27 +0300 Subject: [PATCH 7/7] report complete --- .../common/include/common.hpp | 15 ++ tasks/example_processes/data/pic.jpg | Bin 0 -> 23 bytes tasks/example_processes/info.json | 9 ++ .../example_processes/mpi/include/ops_mpi.hpp | 22 +++ tasks/example_processes/mpi/src/ops_mpi.cpp | 72 ++++++++++ tasks/example_processes/report.md | 0 .../example_processes/seq/include/ops_seq.hpp | 22 +++ tasks/example_processes/seq/src/ops_seq.cpp | 60 ++++++++ tasks/example_processes/settings.json | 7 + tasks/example_processes/tests/.clang-tidy | 13 ++ .../tests/functional/main.cpp | 86 +++++++++++ .../tests/performance/main.cpp | 40 ++++++ .../common/include/common.hpp | 15 ++ tasks/example_processes_2/data/pic.jpg | Bin 0 -> 23 bytes tasks/example_processes_2/info.json | 9 ++ .../mpi/include/ops_mpi.hpp | 22 +++ tasks/example_processes_2/mpi/src/ops_mpi.cpp | 72 ++++++++++ tasks/example_processes_2/report.md | 0 .../seq/include/ops_seq.hpp | 22 +++ tasks/example_processes_2/seq/src/ops_seq.cpp | 60 ++++++++ tasks/example_processes_2/settings.json | 7 + tasks/example_processes_2/tests/.clang-tidy | 13 ++ .../tests/functional/main.cpp | 86 +++++++++++ .../tests/performance/main.cpp | 40 ++++++ .../common/include/common.hpp | 15 ++ tasks/example_processes_3/data/pic.jpg | Bin 0 -> 23 bytes tasks/example_processes_3/info.json | 9 ++ .../mpi/include/ops_mpi.hpp | 22 +++ tasks/example_processes_3/mpi/src/ops_mpi.cpp | 72 ++++++++++ tasks/example_processes_3/report.md | 0 .../seq/include/ops_seq.hpp | 22 +++ tasks/example_processes_3/seq/src/ops_seq.cpp | 60 ++++++++ tasks/example_processes_3/settings.json | 7 + tasks/example_processes_3/tests/.clang-tidy | 13 ++ .../tests/functional/main.cpp | 86 +++++++++++ .../tests/performance/main.cpp | 40 ++++++ tasks/example_threads/all/include/ops_all.hpp | 22 +++ tasks/example_threads/all/report.md | 0 tasks/example_threads/all/src/ops_all.cpp | 85 +++++++++++ .../example_threads/common/include/common.hpp | 15 ++ tasks/example_threads/data/pic.jpg | Bin 0 -> 23 bytes tasks/example_threads/info.json | 9 ++ tasks/example_threads/omp/include/ops_omp.hpp | 22 +++ tasks/example_threads/omp/report.md | 0 tasks/example_threads/omp/src/ops_omp.cpp | 54 +++++++ tasks/example_threads/report.md | 0 tasks/example_threads/seq/include/ops_seq.hpp | 22 +++ tasks/example_threads/seq/report.md | 0 tasks/example_threads/seq/src/ops_seq.cpp | 60 ++++++++ tasks/example_threads/settings.json | 10 ++ tasks/example_threads/stl/include/ops_stl.hpp | 22 +++ tasks/example_threads/stl/report.md | 0 tasks/example_threads/stl/src/ops_stl.cpp | 58 ++++++++ tasks/example_threads/tbb/include/ops_tbb.hpp | 22 +++ tasks/example_threads/tbb/report.md | 0 tasks/example_threads/tbb/src/ops_tbb.cpp | 56 ++++++++ tasks/example_threads/tests/.clang-tidy | 13 ++ .../example_threads/tests/functional/main.cpp | 92 ++++++++++++ .../tests/performance/main.cpp | 44 ++++++ .../info.json | 8 +- .../mpi/src/ops_mpi.cpp | 6 - .../report.md | 134 ++++++++++++++++++ .../seq/src/ops_seq.cpp | 3 - 63 files changed, 1782 insertions(+), 13 deletions(-) create mode 100644 tasks/example_processes/common/include/common.hpp create mode 100644 tasks/example_processes/data/pic.jpg create mode 100644 tasks/example_processes/info.json create mode 100644 tasks/example_processes/mpi/include/ops_mpi.hpp create mode 100644 tasks/example_processes/mpi/src/ops_mpi.cpp create mode 100644 tasks/example_processes/report.md create mode 100644 tasks/example_processes/seq/include/ops_seq.hpp create mode 100644 tasks/example_processes/seq/src/ops_seq.cpp create mode 100644 tasks/example_processes/settings.json create mode 100644 tasks/example_processes/tests/.clang-tidy create mode 100644 tasks/example_processes/tests/functional/main.cpp create mode 100644 tasks/example_processes/tests/performance/main.cpp create mode 100644 tasks/example_processes_2/common/include/common.hpp create mode 100644 tasks/example_processes_2/data/pic.jpg create mode 100644 tasks/example_processes_2/info.json create mode 100644 tasks/example_processes_2/mpi/include/ops_mpi.hpp create mode 100644 tasks/example_processes_2/mpi/src/ops_mpi.cpp create mode 100644 tasks/example_processes_2/report.md create mode 100644 tasks/example_processes_2/seq/include/ops_seq.hpp create mode 100644 tasks/example_processes_2/seq/src/ops_seq.cpp create mode 100644 tasks/example_processes_2/settings.json create mode 100644 tasks/example_processes_2/tests/.clang-tidy create mode 100644 tasks/example_processes_2/tests/functional/main.cpp create mode 100644 tasks/example_processes_2/tests/performance/main.cpp create mode 100644 tasks/example_processes_3/common/include/common.hpp create mode 100644 tasks/example_processes_3/data/pic.jpg create mode 100644 tasks/example_processes_3/info.json create mode 100644 tasks/example_processes_3/mpi/include/ops_mpi.hpp create mode 100644 tasks/example_processes_3/mpi/src/ops_mpi.cpp create mode 100644 tasks/example_processes_3/report.md create mode 100644 tasks/example_processes_3/seq/include/ops_seq.hpp create mode 100644 tasks/example_processes_3/seq/src/ops_seq.cpp create mode 100644 tasks/example_processes_3/settings.json create mode 100644 tasks/example_processes_3/tests/.clang-tidy create mode 100644 tasks/example_processes_3/tests/functional/main.cpp create mode 100644 tasks/example_processes_3/tests/performance/main.cpp create mode 100644 tasks/example_threads/all/include/ops_all.hpp create mode 100644 tasks/example_threads/all/report.md create mode 100644 tasks/example_threads/all/src/ops_all.cpp create mode 100644 tasks/example_threads/common/include/common.hpp create mode 100644 tasks/example_threads/data/pic.jpg create mode 100644 tasks/example_threads/info.json create mode 100644 tasks/example_threads/omp/include/ops_omp.hpp create mode 100644 tasks/example_threads/omp/report.md create mode 100644 tasks/example_threads/omp/src/ops_omp.cpp create mode 100644 tasks/example_threads/report.md create mode 100644 tasks/example_threads/seq/include/ops_seq.hpp create mode 100644 tasks/example_threads/seq/report.md create mode 100644 tasks/example_threads/seq/src/ops_seq.cpp create mode 100644 tasks/example_threads/settings.json create mode 100644 tasks/example_threads/stl/include/ops_stl.hpp create mode 100644 tasks/example_threads/stl/report.md create mode 100644 tasks/example_threads/stl/src/ops_stl.cpp create mode 100644 tasks/example_threads/tbb/include/ops_tbb.hpp create mode 100644 tasks/example_threads/tbb/report.md create mode 100644 tasks/example_threads/tbb/src/ops_tbb.cpp create mode 100644 tasks/example_threads/tests/.clang-tidy create mode 100644 tasks/example_threads/tests/functional/main.cpp create mode 100644 tasks/example_threads/tests/performance/main.cpp diff --git a/tasks/example_processes/common/include/common.hpp b/tasks/example_processes/common/include/common.hpp new file mode 100644 index 0000000000..127d96c4c2 --- /dev/null +++ b/tasks/example_processes/common/include/common.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_processes { + +using InType = int; +using OutType = int; +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes/data/pic.jpg b/tasks/example_processes/data/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..637624238c89d914613ed301968bffbf462bc110 GIT binary patch literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY + +#include +#include + +#include "example_processes/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_processes { + +NesterovATestTaskMPI::NesterovATestTaskMPI(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskMPI::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskMPI::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskMPI::RunImpl() { + auto input = GetInput(); + if (input == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == 0) { + GetOutput() /= num_threads; + } else { + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + } + + MPI_Barrier(MPI_COMM_WORLD); + return GetOutput() > 0; +} + +bool NesterovATestTaskMPI::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes/report.md b/tasks/example_processes/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/example_processes/seq/include/ops_seq.hpp b/tasks/example_processes/seq/include/ops_seq.hpp new file mode 100644 index 0000000000..f264b4fd78 --- /dev/null +++ b/tasks/example_processes/seq/include/ops_seq.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "example_processes/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_processes { + +class NesterovATestTaskSEQ : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSEQ; + } + explicit NesterovATestTaskSEQ(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes/seq/src/ops_seq.cpp b/tasks/example_processes/seq/src/ops_seq.cpp new file mode 100644 index 0000000000..2599c518ea --- /dev/null +++ b/tasks/example_processes/seq/src/ops_seq.cpp @@ -0,0 +1,60 @@ +#include "example_processes/seq/include/ops_seq.hpp" + +#include +#include + +#include "example_processes/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_processes { + +NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskSEQ::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskSEQ::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::RunImpl() { + if (GetInput() == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes/settings.json b/tasks/example_processes/settings.json new file mode 100644 index 0000000000..b1a0d52574 --- /dev/null +++ b/tasks/example_processes/settings.json @@ -0,0 +1,7 @@ +{ + "tasks_type": "processes", + "tasks": { + "mpi": "enabled", + "seq": "enabled" + } +} diff --git a/tasks/example_processes/tests/.clang-tidy b/tasks/example_processes/tests/.clang-tidy new file mode 100644 index 0000000000..ef43b7aa8a --- /dev/null +++ b/tasks/example_processes/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/example_processes/tests/functional/main.cpp b/tasks/example_processes/tests/functional/main.cpp new file mode 100644 index 0000000000..23e91e3fdb --- /dev/null +++ b/tasks/example_processes/tests/functional/main.cpp @@ -0,0 +1,86 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "example_processes/common/include/common.hpp" +#include "example_processes/mpi/include/ops_mpi.hpp" +#include "example_processes/seq/include/ops_seq.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_processes { + +class NesterovARunFuncTestsProcesses : public ppc::util::BaseRunFuncTests { + public: + static std::string PrintTestParam(const TestType &test_param) { + return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); + } + + protected: + void SetUp() override { + int width = -1; + int height = -1; + int channels = -1; + std::vector img; + // Read image in RGB to ensure consistent channel count + { + std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_example_processes, "pic.jpg"); + auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); + if (data == nullptr) { + throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); + } + channels = STBI_rgb; + img = std::vector(data, data + (static_cast(width * height * channels))); + stbi_image_free(data); + if (std::cmp_not_equal(width, height)) { + throw std::runtime_error("width != height: "); + } + } + + TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); + } + + bool CheckTestOutputData(OutType &output_data) final { + return (input_data_ == output_data); + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_ = 0; +}; + +namespace { + +TEST_P(NesterovARunFuncTestsProcesses, MatmulFromPic) { + ExecuteTest(GetParam()); +} + +const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; + +const auto kTestTasksList = + std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes)); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kPerfTestName = NesterovARunFuncTestsProcesses::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes/tests/performance/main.cpp b/tasks/example_processes/tests/performance/main.cpp new file mode 100644 index 0000000000..5d9a4c7125 --- /dev/null +++ b/tasks/example_processes/tests/performance/main.cpp @@ -0,0 +1,40 @@ +#include + +#include "example_processes/common/include/common.hpp" +#include "example_processes/mpi/include/ops_mpi.hpp" +#include "example_processes/seq/include/ops_seq.hpp" +#include "util/include/perf_test_util.hpp" + +namespace nesterov_a_test_task_processes { + +class ExampleRunPerfTestProcesses : public ppc::util::BaseRunPerfTests { + const int kCount_ = 100; + InType input_data_{}; + + void SetUp() override { + input_data_ = kCount_; + } + + bool CheckTestOutputData(OutType &output_data) final { + return input_data_ == output_data; + } + + InType GetTestInputData() final { + return input_data_; + } +}; + +TEST_P(ExampleRunPerfTestProcesses, RunPerfModes) { + ExecuteTest(GetParam()); +} + +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_processes); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = ExampleRunPerfTestProcesses::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses, kGtestValues, kPerfTestName); + +} // namespace nesterov_a_test_task_processes diff --git a/tasks/example_processes_2/common/include/common.hpp b/tasks/example_processes_2/common/include/common.hpp new file mode 100644 index 0000000000..145054df0b --- /dev/null +++ b/tasks/example_processes_2/common/include/common.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_processes_2 { + +using InType = int; +using OutType = int; +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_2/data/pic.jpg b/tasks/example_processes_2/data/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..637624238c89d914613ed301968bffbf462bc110 GIT binary patch literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY + +#include +#include + +#include "example_processes_2/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_processes_2 { + +NesterovATestTaskMPI::NesterovATestTaskMPI(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskMPI::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskMPI::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskMPI::RunImpl() { + auto input = GetInput(); + if (input == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == 0) { + GetOutput() /= num_threads; + } else { + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + } + + MPI_Barrier(MPI_COMM_WORLD); + return GetOutput() > 0; +} + +bool NesterovATestTaskMPI::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_2/report.md b/tasks/example_processes_2/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/example_processes_2/seq/include/ops_seq.hpp b/tasks/example_processes_2/seq/include/ops_seq.hpp new file mode 100644 index 0000000000..ac1ad69449 --- /dev/null +++ b/tasks/example_processes_2/seq/include/ops_seq.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "example_processes_2/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_processes_2 { + +class NesterovATestTaskSEQ : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSEQ; + } + explicit NesterovATestTaskSEQ(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_2/seq/src/ops_seq.cpp b/tasks/example_processes_2/seq/src/ops_seq.cpp new file mode 100644 index 0000000000..ea4a0c6297 --- /dev/null +++ b/tasks/example_processes_2/seq/src/ops_seq.cpp @@ -0,0 +1,60 @@ +#include "example_processes_2/seq/include/ops_seq.hpp" + +#include +#include + +#include "example_processes_2/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_processes_2 { + +NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskSEQ::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskSEQ::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::RunImpl() { + if (GetInput() == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_2/settings.json b/tasks/example_processes_2/settings.json new file mode 100644 index 0000000000..b1a0d52574 --- /dev/null +++ b/tasks/example_processes_2/settings.json @@ -0,0 +1,7 @@ +{ + "tasks_type": "processes", + "tasks": { + "mpi": "enabled", + "seq": "enabled" + } +} diff --git a/tasks/example_processes_2/tests/.clang-tidy b/tasks/example_processes_2/tests/.clang-tidy new file mode 100644 index 0000000000..ef43b7aa8a --- /dev/null +++ b/tasks/example_processes_2/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/example_processes_2/tests/functional/main.cpp b/tasks/example_processes_2/tests/functional/main.cpp new file mode 100644 index 0000000000..dbe2b0c472 --- /dev/null +++ b/tasks/example_processes_2/tests/functional/main.cpp @@ -0,0 +1,86 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "example_processes_2/common/include/common.hpp" +#include "example_processes_2/mpi/include/ops_mpi.hpp" +#include "example_processes_2/seq/include/ops_seq.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_processes_2 { + +class NesterovARunFuncTestsProcesses2 : public ppc::util::BaseRunFuncTests { + public: + static std::string PrintTestParam(const TestType &test_param) { + return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); + } + + protected: + void SetUp() override { + int width = -1; + int height = -1; + int channels = -1; + std::vector img; + // Read image in RGB to ensure consistent channel count + { + std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_example_processes_2, "pic.jpg"); + auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); + if (data == nullptr) { + throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); + } + channels = STBI_rgb; + img = std::vector(data, data + (static_cast(width * height * channels))); + stbi_image_free(data); + if (std::cmp_not_equal(width, height)) { + throw std::runtime_error("width != height: "); + } + } + + TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); + } + + bool CheckTestOutputData(OutType &output_data) final { + return (input_data_ == output_data); + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_ = 0; +}; + +namespace { + +TEST_P(NesterovARunFuncTestsProcesses2, MatmulFromPic) { + ExecuteTest(GetParam()); +} + +const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; + +const auto kTestTasksList = + std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes_2), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes_2)); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kPerfTestName = NesterovARunFuncTestsProcesses2::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses2, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_2/tests/performance/main.cpp b/tasks/example_processes_2/tests/performance/main.cpp new file mode 100644 index 0000000000..23036173c2 --- /dev/null +++ b/tasks/example_processes_2/tests/performance/main.cpp @@ -0,0 +1,40 @@ +#include + +#include "example_processes_2/common/include/common.hpp" +#include "example_processes_2/mpi/include/ops_mpi.hpp" +#include "example_processes_2/seq/include/ops_seq.hpp" +#include "util/include/perf_test_util.hpp" + +namespace nesterov_a_test_task_processes_2 { + +class ExampleRunPerfTestProcesses2 : 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(ExampleRunPerfTestProcesses2, RunPerfModes) { + ExecuteTest(GetParam()); +} + +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_processes_2); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = ExampleRunPerfTestProcesses2::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses2, kGtestValues, kPerfTestName); + +} // namespace nesterov_a_test_task_processes_2 diff --git a/tasks/example_processes_3/common/include/common.hpp b/tasks/example_processes_3/common/include/common.hpp new file mode 100644 index 0000000000..ac343ab8f5 --- /dev/null +++ b/tasks/example_processes_3/common/include/common.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_processes_3 { + +using InType = int; +using OutType = int; +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_processes_3/data/pic.jpg b/tasks/example_processes_3/data/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..637624238c89d914613ed301968bffbf462bc110 GIT binary patch literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY + +#include +#include + +#include "example_processes_3/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_processes_3 { + +NesterovATestTaskMPI::NesterovATestTaskMPI(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskMPI::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskMPI::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskMPI::RunImpl() { + auto input = GetInput(); + if (input == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == 0) { + GetOutput() /= num_threads; + } else { + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + } + + MPI_Barrier(MPI_COMM_WORLD); + return GetOutput() > 0; +} + +bool NesterovATestTaskMPI::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_processes_3/report.md b/tasks/example_processes_3/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/example_processes_3/seq/include/ops_seq.hpp b/tasks/example_processes_3/seq/include/ops_seq.hpp new file mode 100644 index 0000000000..5a7b33677c --- /dev/null +++ b/tasks/example_processes_3/seq/include/ops_seq.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "example_processes_3/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_processes_3 { + +class NesterovATestTaskSEQ : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSEQ; + } + explicit NesterovATestTaskSEQ(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_processes_3/seq/src/ops_seq.cpp b/tasks/example_processes_3/seq/src/ops_seq.cpp new file mode 100644 index 0000000000..1db5c7340e --- /dev/null +++ b/tasks/example_processes_3/seq/src/ops_seq.cpp @@ -0,0 +1,60 @@ +#include "example_processes_3/seq/include/ops_seq.hpp" + +#include +#include + +#include "example_processes_3/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_processes_3 { + +NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskSEQ::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskSEQ::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::RunImpl() { + if (GetInput() == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_processes_3/settings.json b/tasks/example_processes_3/settings.json new file mode 100644 index 0000000000..b1a0d52574 --- /dev/null +++ b/tasks/example_processes_3/settings.json @@ -0,0 +1,7 @@ +{ + "tasks_type": "processes", + "tasks": { + "mpi": "enabled", + "seq": "enabled" + } +} diff --git a/tasks/example_processes_3/tests/.clang-tidy b/tasks/example_processes_3/tests/.clang-tidy new file mode 100644 index 0000000000..ef43b7aa8a --- /dev/null +++ b/tasks/example_processes_3/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/example_processes_3/tests/functional/main.cpp b/tasks/example_processes_3/tests/functional/main.cpp new file mode 100644 index 0000000000..20a89ea793 --- /dev/null +++ b/tasks/example_processes_3/tests/functional/main.cpp @@ -0,0 +1,86 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "example_processes_3/common/include/common.hpp" +#include "example_processes_3/mpi/include/ops_mpi.hpp" +#include "example_processes_3/seq/include/ops_seq.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_processes_3 { + +class NesterovARunFuncTestsProcesses3 : public ppc::util::BaseRunFuncTests { + public: + static std::string PrintTestParam(const TestType &test_param) { + return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); + } + + protected: + void SetUp() override { + int width = -1; + int height = -1; + int channels = -1; + std::vector img; + // Read image in RGB to ensure consistent channel count + { + std::string abs_path = ppc::util::GetAbsoluteTaskPath(PPC_ID_example_processes_3, "pic.jpg"); + auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); + if (data == nullptr) { + throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); + } + channels = STBI_rgb; + img = std::vector(data, data + (static_cast(width * height * channels))); + stbi_image_free(data); + if (std::cmp_not_equal(width, height)) { + throw std::runtime_error("width != height: "); + } + } + + TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); + } + + bool CheckTestOutputData(OutType &output_data) final { + return (input_data_ == output_data); + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_ = 0; +}; + +namespace { + +TEST_P(NesterovARunFuncTestsProcesses3, MatmulFromPic) { + ExecuteTest(GetParam()); +} + +const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; + +const auto kTestTasksList = + std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes_3), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_processes_3)); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kPerfTestName = NesterovARunFuncTestsProcesses3::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsProcesses3, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_processes_3/tests/performance/main.cpp b/tasks/example_processes_3/tests/performance/main.cpp new file mode 100644 index 0000000000..cae4b67d9b --- /dev/null +++ b/tasks/example_processes_3/tests/performance/main.cpp @@ -0,0 +1,40 @@ +#include + +#include "example_processes_3/common/include/common.hpp" +#include "example_processes_3/mpi/include/ops_mpi.hpp" +#include "example_processes_3/seq/include/ops_seq.hpp" +#include "util/include/perf_test_util.hpp" + +namespace nesterov_a_test_task_processes_3 { + +class ExampleRunPerfTestProcesses3 : 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(ExampleRunPerfTestProcesses3, RunPerfModes) { + ExecuteTest(GetParam()); +} + +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_processes_3); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = ExampleRunPerfTestProcesses3::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestProcesses3, kGtestValues, kPerfTestName); + +} // namespace nesterov_a_test_task_processes_3 diff --git a/tasks/example_threads/all/include/ops_all.hpp b/tasks/example_threads/all/include/ops_all.hpp new file mode 100644 index 0000000000..c2d44989da --- /dev/null +++ b/tasks/example_threads/all/include/ops_all.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "example_threads/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_threads { + +class NesterovATestTaskALL : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kALL; + } + explicit NesterovATestTaskALL(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/all/report.md b/tasks/example_threads/all/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/example_threads/all/src/ops_all.cpp b/tasks/example_threads/all/src/ops_all.cpp new file mode 100644 index 0000000000..92a438555e --- /dev/null +++ b/tasks/example_threads/all/src/ops_all.cpp @@ -0,0 +1,85 @@ +#include "example_threads/all/include/ops_all.hpp" + +#include + +#include +#include +#include +#include + +#include "example_threads/common/include/common.hpp" +#include "oneapi/tbb/parallel_for.h" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_threads { + +NesterovATestTaskALL::NesterovATestTaskALL(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskALL::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskALL::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskALL::RunImpl() { + 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 = -1; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + if (rank == 0) { + std::atomic counter(0); +#pragma omp parallel default(none) shared(counter) num_threads(ppc::util::GetNumThreads()) + counter++; + + GetOutput() /= counter; + } else { + GetOutput() /= num_threads; + } + } + + { + GetOutput() *= num_threads; + std::vector threads(num_threads); + std::atomic counter(0); + for (int i = 0; i < num_threads; i++) { + threads[i] = std::thread([&]() { counter++; }); + threads[i].join(); + } + GetOutput() /= counter; + } + + { + GetOutput() *= num_threads; + std::atomic counter(0); + tbb::parallel_for(0, ppc::util::GetNumThreads(), [&](int /*i*/) { counter++; }); + GetOutput() /= counter; + } + MPI_Barrier(MPI_COMM_WORLD); + return GetOutput() > 0; +} + +bool NesterovATestTaskALL::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/common/include/common.hpp b/tasks/example_threads/common/include/common.hpp new file mode 100644 index 0000000000..f75fe17799 --- /dev/null +++ b/tasks/example_threads/common/include/common.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_threads { + +using InType = int; +using OutType = int; +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/data/pic.jpg b/tasks/example_threads/data/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..637624238c89d914613ed301968bffbf462bc110 GIT binary patch literal 23 bcmWGA<1$h(;xaNd<@(RSzyQYo|NjR7KDY +#include +#include + +#include "example_threads/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_threads { + +NesterovATestTaskOMP::NesterovATestTaskOMP(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskOMP::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskOMP::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskOMP::RunImpl() { + 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; + + std::atomic counter(0); +#pragma omp parallel default(none) shared(counter) num_threads(ppc::util::GetNumThreads()) + counter++; + + GetOutput() /= counter; + return GetOutput() > 0; +} + +bool NesterovATestTaskOMP::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/report.md b/tasks/example_threads/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/example_threads/seq/include/ops_seq.hpp b/tasks/example_threads/seq/include/ops_seq.hpp new file mode 100644 index 0000000000..a16e3a390d --- /dev/null +++ b/tasks/example_threads/seq/include/ops_seq.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "example_threads/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_threads { + +class NesterovATestTaskSEQ : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSEQ; + } + explicit NesterovATestTaskSEQ(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/seq/report.md b/tasks/example_threads/seq/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/example_threads/seq/src/ops_seq.cpp b/tasks/example_threads/seq/src/ops_seq.cpp new file mode 100644 index 0000000000..8888b32587 --- /dev/null +++ b/tasks/example_threads/seq/src/ops_seq.cpp @@ -0,0 +1,60 @@ +#include "example_threads/seq/include/ops_seq.hpp" + +#include +#include + +#include "example_threads/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_threads { + +NesterovATestTaskSEQ::NesterovATestTaskSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskSEQ::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskSEQ::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::RunImpl() { + if (GetInput() == 0) { + return false; + } + + for (InType i = 0; i < GetInput(); i++) { + for (InType j = 0; j < GetInput(); j++) { + for (InType k = 0; k < GetInput(); k++) { + std::vector tmp(i + j + k, 1); + GetOutput() += std::accumulate(tmp.begin(), tmp.end(), 0); + GetOutput() -= i + j + k; + } + } + } + + const int num_threads = ppc::util::GetNumThreads(); + GetOutput() *= num_threads; + + int counter = 0; + for (int i = 0; i < num_threads; i++) { + counter++; + } + + if (counter != 0) { + GetOutput() /= counter; + } + return GetOutput() > 0; +} + +bool NesterovATestTaskSEQ::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/settings.json b/tasks/example_threads/settings.json new file mode 100644 index 0000000000..f8c285c85e --- /dev/null +++ b/tasks/example_threads/settings.json @@ -0,0 +1,10 @@ +{ + "tasks_type": "threads", + "tasks": { + "all": "enabled", + "omp": "enabled", + "seq": "enabled", + "stl": "enabled", + "tbb": "enabled" + } +} diff --git a/tasks/example_threads/stl/include/ops_stl.hpp b/tasks/example_threads/stl/include/ops_stl.hpp new file mode 100644 index 0000000000..f33b8b8beb --- /dev/null +++ b/tasks/example_threads/stl/include/ops_stl.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "example_threads/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_threads { + +class NesterovATestTaskSTL : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSTL; + } + explicit NesterovATestTaskSTL(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/stl/report.md b/tasks/example_threads/stl/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/example_threads/stl/src/ops_stl.cpp b/tasks/example_threads/stl/src/ops_stl.cpp new file mode 100644 index 0000000000..33fcaec2bb --- /dev/null +++ b/tasks/example_threads/stl/src/ops_stl.cpp @@ -0,0 +1,58 @@ +#include "example_threads/stl/include/ops_stl.hpp" + +#include +#include +#include +#include + +#include "example_threads/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_threads { + +NesterovATestTaskSTL::NesterovATestTaskSTL(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskSTL::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskSTL::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskSTL::RunImpl() { + 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(); + std::vector threads(num_threads); + GetOutput() *= num_threads; + + std::atomic counter(0); + for (int i = 0; i < num_threads; i++) { + threads[i] = std::thread([&]() { counter++; }); + threads[i].join(); + } + + GetOutput() /= counter; + return GetOutput() > 0; +} + +bool NesterovATestTaskSTL::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/tbb/include/ops_tbb.hpp b/tasks/example_threads/tbb/include/ops_tbb.hpp new file mode 100644 index 0000000000..dabe985b4f --- /dev/null +++ b/tasks/example_threads/tbb/include/ops_tbb.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "example_threads/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace nesterov_a_test_task_threads { + +class NesterovATestTaskTBB : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kTBB; + } + explicit NesterovATestTaskTBB(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/tbb/report.md b/tasks/example_threads/tbb/report.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tasks/example_threads/tbb/src/ops_tbb.cpp b/tasks/example_threads/tbb/src/ops_tbb.cpp new file mode 100644 index 0000000000..1d606b8df5 --- /dev/null +++ b/tasks/example_threads/tbb/src/ops_tbb.cpp @@ -0,0 +1,56 @@ +#include "example_threads/tbb/include/ops_tbb.hpp" + +#include + +#include +#include +#include +#include + +#include "example_threads/common/include/common.hpp" +#include "oneapi/tbb/parallel_for.h" + +namespace nesterov_a_test_task_threads { + +NesterovATestTaskTBB::NesterovATestTaskTBB(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool NesterovATestTaskTBB::ValidationImpl() { + return (GetInput() > 0) && (GetOutput() == 0); +} + +bool NesterovATestTaskTBB::PreProcessingImpl() { + GetOutput() = 2 * GetInput(); + return GetOutput() > 0; +} + +bool NesterovATestTaskTBB::RunImpl() { + 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; + + std::atomic counter(0); + tbb::parallel_for(0, ppc::util::GetNumThreads(), [&](int /*i*/) { counter++; }); + + GetOutput() /= counter; + return GetOutput() > 0; +} + +bool NesterovATestTaskTBB::PostProcessingImpl() { + GetOutput() -= GetInput(); + return GetOutput() > 0; +} + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/tests/.clang-tidy b/tasks/example_threads/tests/.clang-tidy new file mode 100644 index 0000000000..ef43b7aa8a --- /dev/null +++ b/tasks/example_threads/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/example_threads/tests/functional/main.cpp b/tasks/example_threads/tests/functional/main.cpp new file mode 100644 index 0000000000..2e99e7bf67 --- /dev/null +++ b/tasks/example_threads/tests/functional/main.cpp @@ -0,0 +1,92 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "example_threads/all/include/ops_all.hpp" +#include "example_threads/common/include/common.hpp" +#include "example_threads/omp/include/ops_omp.hpp" +#include "example_threads/seq/include/ops_seq.hpp" +#include "example_threads/stl/include/ops_stl.hpp" +#include "example_threads/tbb/include/ops_tbb.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace nesterov_a_test_task_threads { + +class NesterovARunFuncTestsThreads : public ppc::util::BaseRunFuncTests { + public: + static std::string PrintTestParam(const TestType &test_param) { + return std::to_string(std::get<0>(test_param)) + "_" + std::get<1>(test_param); + } + + protected: + void SetUp() override { + int width = -1; + int height = -1; + int channels = -1; + std::vector img; + // Read image in RGB to ensure consistent channel count + { + std::string abs_path = ppc::util::GetAbsoluteTaskPath(std::string(PPC_ID_example_threads), "pic.jpg"); + auto *data = stbi_load(abs_path.c_str(), &width, &height, &channels, STBI_rgb); + if (data == nullptr) { + throw std::runtime_error("Failed to load image: " + std::string(stbi_failure_reason())); + } + channels = STBI_rgb; + img = std::vector(data, data + (static_cast(width * height * channels))); + stbi_image_free(data); + if (std::cmp_not_equal(width, height)) { + throw std::runtime_error("width != height: "); + } + } + + TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + input_data_ = width - height + std::min(std::accumulate(img.begin(), img.end(), 0), channels); + } + + bool CheckTestOutputData(OutType &output_data) final { + return (input_data_ == output_data); + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_ = 0; +}; + +namespace { + +TEST_P(NesterovARunFuncTestsThreads, MatmulFromPic) { + ExecuteTest(GetParam()); +} + +const std::array kTestParam = {std::make_tuple(3, "3"), std::make_tuple(5, "5"), std::make_tuple(7, "7")}; + +const auto kTestTasksList = + std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads)); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kPerfTestName = NesterovARunFuncTestsThreads::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, NesterovARunFuncTestsThreads, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/example_threads/tests/performance/main.cpp b/tasks/example_threads/tests/performance/main.cpp new file mode 100644 index 0000000000..c59e817421 --- /dev/null +++ b/tasks/example_threads/tests/performance/main.cpp @@ -0,0 +1,44 @@ +#include + +#include "example_threads/all/include/ops_all.hpp" +#include "example_threads/common/include/common.hpp" +#include "example_threads/omp/include/ops_omp.hpp" +#include "example_threads/seq/include/ops_seq.hpp" +#include "example_threads/stl/include/ops_stl.hpp" +#include "example_threads/tbb/include/ops_tbb.hpp" +#include "util/include/perf_test_util.hpp" + +namespace nesterov_a_test_task_threads { + +class ExampleRunPerfTestThreads : public ppc::util::BaseRunPerfTests { + const int kCount_ = 200; + 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(ExampleRunPerfTestThreads, RunPerfModes) { + ExecuteTest(GetParam()); +} + +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_threads); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = ExampleRunPerfTestThreads::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, ExampleRunPerfTestThreads, kGtestValues, kPerfTestName); + +} // namespace nesterov_a_test_task_threads diff --git a/tasks/konovalov_s_seidel_iterative_method/info.json b/tasks/konovalov_s_seidel_iterative_method/info.json index 6109c2baff..b57d83e25d 100644 --- a/tasks/konovalov_s_seidel_iterative_method/info.json +++ b/tasks/konovalov_s_seidel_iterative_method/info.json @@ -1,9 +1,9 @@ { "student": { - "first_name": "first_name_p", - "last_name": "last_name_p", - "middle_name": "middle_name_p", - "group_number": "2222222_p", + "first_name": "Sergey", + "last_name": "Konovalov", + "middle_name": "Alexandrovich", + "group_number": "3823Б1Пр3", "task_number": "2" } } diff --git a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp index 97e5774328..e99fe3116d 100644 --- a/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/mpi/src/ops_mpi.cpp @@ -17,12 +17,6 @@ KonovalovSSeidelMethodMPI::KonovalovSSeidelMethodMPI(const InType &in) { } bool KonovalovSSeidelMethodMPI::ValidationImpl() { - // size = std::get<0>(GetInput()); - // A.resize(size, 0.0); - // A = std::get<1>(GetInput()); - // B.resize(size); - // B = std::get<2>(GetInput()); - // iter = std::get<3>(GetInput()); return GetInput() > 3; } diff --git a/tasks/konovalov_s_seidel_iterative_method/report.md b/tasks/konovalov_s_seidel_iterative_method/report.md index e69de29bb2..8559d1788f 100644 --- a/tasks/konovalov_s_seidel_iterative_method/report.md +++ b/tasks/konovalov_s_seidel_iterative_method/report.md @@ -0,0 +1,134 @@ +# <Подсчет буквенных символов в строке> + +- Student: <Коновалов Сергей Александрович>, group <3823Б1Пр3> +- Technology: +- Variant: <19> + +## 1. Introduction +Задача решения итеративным методом Зейделя систем линейных алгебраических уравнений вида Ax=b, где +- A - матрица коэффициентов при неизвестных +- b - вектор свободных членов +- x - вектор неизвестных + +Суть метода можно описать так: из каждого уравнения выражается неизвестное, соответствующее коэффициенту на диагонали матрицы A, выбираются начальные приближения неизвестных для нулевого цикла (как правило, каждая неизвестная = 0) и выполняется нулевой цикл. +На нулевом цикле используются начальные приближения для вычисления новых значений неизвестных, при этом новые значения, полученные на предыдущих итерациях каждого цикла, используются в последующих вычисления оставшихся неизвестных. +Новые значения неизвестных, полученные в результате работы алгоритма, сохраняются и используются как начальные приближения в следующем цикле. +Алгоритм заканчивает работу в двух случаях: +- Положительный - необходимой точности вычислений удалось достичь за количество итераций меньше максимального +- Негативный - достигнуто максимальное количество итераций, т.е. требуемая точность не достигнута + +Известно, что метод зейделя обладает наилучшей сходимостью (она обеспечивается диагонально-доминантными матрицами коэффициентов, так что отношение любых других коэффициентов к диагональному в одной строке меньше единицы), вплоть до точного результата. + +Метод зейделя широко используется для описания взаимодействия плотных объектов в 3D моделировании. + +## 2. Problem Statement +Одной из главных проблем стало представление тестовых данных. +Изначально предполагалось использование внешних источников, в которых некоторым образом были бы записаны матрицы A и b, размер матрицы и максимальное количество итераций, а так же верный ответ. Тем самым алгоритм можно было бы испытывать на реальных системах. +Однако, начав реализовывать параллельную версию, от этой идеи пришлось отказаться и перейти к генерации данных. + +К генерации данных, в свою очередь, вынудило перейти изучение вопроса о параллелизации метода Гаусса-Зейделя. +Из изученного материала я выяснил, что принцип его параллелизации лежит в нахождении независимых неизвестных - тех, что не учавствуют в уравнениях друг друга, т.е. чьи симметричные коэффициенты равны 0 (пр.: х1,3 = х3,1 = 0). +Подобных переменных в системе может быть как несколько (пр.: 2 блока попарно независимых неизвесных при размере вектора 4), так и не быть вовсе. За определение подобных неизвестных отвечает алгоритм закраски графа (забегая вперед, матрица коэффициентов представлена в виде одномерного вектора): + +``` +std::vector A = _A; // coefficient matrix.int + std::vector color(size); // colors of rows. + for (int i = 0; i < size; ++i) { + color[i] = -1; + } + for (int i = 0; i < size; ++i) { + int m = 0; + for (int j = 0; j < i; j++) { + if (A[i * size + j] != 0 && color[j] == m) { + ++m; + } + } + color[i] = m; + } +``` + +Его работу можно описать так: проходя по матрице коэффициентов, алгоритм считает ненулевые элементы в рядах матрицы, возвращая полученные значения для каждого ряда. Индексы с одинаковыми значениями принадлежат одному блоку независимых неизвестных, следовательно могут быть посчитаны в любом порядке, и как итог, их вычисление можно вынести на разные процессы для одновременного подсчета. Единственное, остается зависимость в подсчете блоков (первым должен быть посчитан блок содержащий уравнение х0, затем блок содержащий х1 и т.д.), однако достаточно легко решается нумерацией блоков. + +Сам алгоритм закраски графа в итоговой версии не используется, но он привел к итоговому решению. + + +## 3. Baseline Algorithm (Sequential) +Последовательный алгоритм: +- Считывает входные данные +- Генерирует матрицы методами InitMatrixA() и InitMatrixB() соотретственно, основываясь на количестве неизвестных (в GetInput()) +- Выполняет функцию Iterativeprocess() +- Полученный результат передает GetOutput() + +Алгоритм содержится в Iterativeprocess() в своей самой рапространенной реализации. + +Алгоритм генерации данных в большей степени заточен на MPI реализацию, поэтому параллельная версия генерирует несколько другие матрицы, что не критично для тестов функционала. + +srand(time(NULL)) используется для обновления счетчика рандомайзера для получения случайных результатов каждый раз при запуске генераций. + +## 4. Parallelization Scheme +Идея распараллеливания вычислений заключается в следующем: +Разделение обязанностей: +### 1. Процесс-дистрибьютор +- Один из процессов (ранг 0) выступает в роли дистрибьютора данных. +- Он считывает водные данные, генерирует матрицы на их основе, а также в зависимости от запущенных процессов таким образом, что каждый процесс будет высчитывать одинаковое количество блоков независимых неизвестных, поровну разделяя нагрузку. +- - Этот процесс единственный, кто имеет полную матрицы коэффициентов и свободных членов (только в функции DataDistr()). +- Процесс делит полученные матрицы между процессами-получателями и отправляет их. +- - Передача осуществляется логикой Send-Recv в том числе для синхронизации действий потоков. +- После того, как строки были отправлены, процесс попадает в общий цикл и встает в состояние ожидания пока другие процессы не закончат шаг итерации Зейделя. +- Затем процесс собирает новые значения локальных векторов неизвестных, объединяет их в глобальный вектор новых значений неизвестных gl_x_vec, передавая это новое значение остальным процессам через Bcast. +### 2. Процесс-получатель +- Каждый процесс находится в состоянии ожидания входящих сообщений и инициализирует массив локальной матрицы коэффициентов размером по размеру из GetInput(), а также по известному ему количеству процессов, равному количеству блоков независимых неизвестных, и следовательно, количеству высчитываемых процессом уравнений, аналогично с матрицей свободных членов. +- - Передача осуществляется логикой Send-Recv в том числе для синхронизации действий потоков. +- С полученными данными процесс начинает вычисление шагов метода Зейделя. +- - Функция, реализующая алгоритм была модифицирована под взаимодействие с процессом, добавлены переменные с адресами диагональных коэффициентов, изменен способ обращения к массиву и главное - была убрана цикличность до достижения точности. +- Вычислив новые значения своих неизвестных, процесс сравнивает новые значения со старыми, хранящимися в gl_x_vec. +- - Используется логическое И на предмет наличия неизвестного, всё ещё не достигшего необходимой точности на каждом процессе, результат сохраняется в переменной cover_tracker. +- В конце общего цикла процессы обмениваются локальными данными о неизвестных, получая взамен новые данные gl_x_vec +### 3. Общая часть +- Закончив обмен начальными данными все процессы попадают в общий цикл, имитирующий итерации метода Зейделя. +- - Каждый процесс имеет свой итератор цикла, а так же флаг выхода из общего цикла. +- - В конце каждой итерации итератор уменьшается на 1 и делается проверка флага: +- - - Используется функция Allreduce по переменной cover_tracker с использованием аргумента MPI_LAND: пока есть хоть один процесс, возвращающий при запросе false, то точность не достигнута, цикл продолжается (Нулевой процесс всегда возвращает true, поэтому он не влияет на результат умножения). +- При завершении общего цикла, процессы передают данные gl_x_vec в GetOutput() + +## 5. Implementation Details +Тестовые данные хранятся в папке /data с ключевым словом "text_line_[correct_ans]". Файл открывается и обрабатывается в классе теста. +Ввиду своей простоты, весь алгоритм реализован в методе RunImpl(). + +## 6. Experimental Setup +Проект запускался в WSL с помощью докера. +- CPU: Intel Xeon CPU E5-2678 v3 2.50GHz +- Cores: 12 +- RAM: 7.5 Gb +- OS: Ubuntu 24.04.3 LTS +- Compiler: GCC +- Build type: Release +- Environment: PPC_NUM_PROC +- Data: tasks/konovalov_s_symbol_count/data + +## 7. Results and Discussion + +### 7.1 Correctness +Функциональный тест сверяет выходные данные на предмет адекватности - вероятность того, что случайно сгенерированная система имеет решение в виде вектора нулей маловероятно. Для параллельной версии, проверяются результаты каждого процесса. +Алгоритм справился с фунциональными тестами, как на последовательной, так и на параллельной версии. + +### 7.2 Performance +Present time, speedup and efficiency. Example table: + +| Mode | Count | Time, s | Speedup | Efficiency | +|-------------|-------|---------|---------|------------| +| seq | 1 | 1.234 | 1.00 | N/A | +| mpi | 2 | 0.700 | 1.76 | 88.0% | +| omp | 4 | 0.390 | 3.16 | 79.0% | + + + +## 9. References +1. <(https://www.opennet.ru/)> +2. +3. + +## Appendix (Optional) +```cpp +// Short, readable code excerpts if needed +``` \ No newline at end of file diff --git a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp index 33994dd0d9..a8be87b969 100644 --- a/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp +++ b/tasks/konovalov_s_seidel_iterative_method/seq/src/ops_seq.cpp @@ -49,7 +49,6 @@ void KonovalovSSeidelMethodSEQ::InitMatrixA(int size, int fmax, std::vector &B) { @@ -85,8 +84,6 @@ std::vector KonovalovSSeidelMethodSEQ::IterationProcess(std::vector