From 5101ad5618e05c512b074d30d5adf42321bd1a4d Mon Sep 17 00:00:00 2001 From: Vladislav Klimenko Date: Tue, 24 Feb 2026 19:08:05 +0300 Subject: [PATCH 1/4] upload the first version of the program --- .pre-commit-config.yaml | 2 +- .../common/include/common.hpp | 14 ++++ .../info.json | 9 +++ .../omp/include/ops_omp.hpp | 22 +++++ .../omp/src/ops_omp.cpp | 68 ++++++++++++++++ .../settings.json | 10 +++ .../tests/functional/main.cpp | 81 +++++++++++++++++++ .../tests/performance/main.cpp | 55 +++++++++++++ 8 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 tasks/klimenko_v_lsh_contrast_incr_omp/common/include/common.hpp create mode 100644 tasks/klimenko_v_lsh_contrast_incr_omp/info.json create mode 100644 tasks/klimenko_v_lsh_contrast_incr_omp/omp/include/ops_omp.hpp create mode 100644 tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp create mode 100644 tasks/klimenko_v_lsh_contrast_incr_omp/settings.json create mode 100644 tasks/klimenko_v_lsh_contrast_incr_omp/tests/functional/main.cpp create mode 100644 tasks/klimenko_v_lsh_contrast_incr_omp/tests/performance/main.cpp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 55044d40..6292f137 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,7 +56,7 @@ repos: - id: pretty-format-json files: \.json$ exclude: ^(3rdparty/|build.*/|install/) - args: [--autofix, --indent=2] + args: [--autofix, --indent=2, --no-ensure-ascii] # Shell script linting with shellcheck (no docker dependency) - repo: https://github.com/shellcheck-py/shellcheck-py diff --git a/tasks/klimenko_v_lsh_contrast_incr_omp/common/include/common.hpp b/tasks/klimenko_v_lsh_contrast_incr_omp/common/include/common.hpp new file mode 100644 index 00000000..974034ce --- /dev/null +++ b/tasks/klimenko_v_lsh_contrast_incr_omp/common/include/common.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include + +#include "task/include/task.hpp" + +namespace klimenko_v_lsh_contrast_incr_omp { + +using InType = std::vector; +using OutType = std::vector; +using TestType = int; +using BaseTask = ppc::task::Task; + +} // namespace klimenko_v_lsh_contrast_incr_omp diff --git a/tasks/klimenko_v_lsh_contrast_incr_omp/info.json b/tasks/klimenko_v_lsh_contrast_incr_omp/info.json new file mode 100644 index 00000000..69bbbddb --- /dev/null +++ b/tasks/klimenko_v_lsh_contrast_incr_omp/info.json @@ -0,0 +1,9 @@ +{ + "student": { + "first_name": "Владислав", + "group_number": "3823Б1ПР2", + "last_name": "Клименко", + "middle_name": "Сергеевич", + "task_number": "2" + } +} diff --git a/tasks/klimenko_v_lsh_contrast_incr_omp/omp/include/ops_omp.hpp b/tasks/klimenko_v_lsh_contrast_incr_omp/omp/include/ops_omp.hpp new file mode 100644 index 00000000..5a119823 --- /dev/null +++ b/tasks/klimenko_v_lsh_contrast_incr_omp/omp/include/ops_omp.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "klimenko_v_lsh_contrast_incr_omp/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace klimenko_v_lsh_contrast_incr_omp { + +class KlimenkoVLSHContrastIncrOMP : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kOMP; + } + explicit KlimenkoVLSHContrastIncrOMP(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace klimenko_v_lsh_contrast_incr_omp diff --git a/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp b/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp new file mode 100644 index 00000000..e1d5b195 --- /dev/null +++ b/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp @@ -0,0 +1,68 @@ +#include "klimenko_v_lsh_contrast_incr_omp/omp/include/ops_omp.hpp" + +#include +#include +#include + +#include "klimenko_v_lsh_contrast_incr_omp/common/include/common.hpp" +#include "util/include/util.hpp" + +namespace klimenko_v_lsh_contrast_incr_omp { + +KlimenkoVLSHContrastIncrOMP::KlimenkoVLSHContrastIncrOMP(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; +} + +bool KlimenkoVLSHContrastIncrOMP::ValidationImpl() { + return !GetInput().empty(); +} + +bool KlimenkoVLSHContrastIncrOMP::PreProcessingImpl() { + GetOutput().resize(GetInput().size()); + return true; +} + +bool KlimenkoVLSHContrastIncrOMP::RunImpl() { + const auto &input = GetInput(); + auto &output = GetOutput(); + + if (input.empty()) { + return false; + } + + const int size = static_cast(input.size()); + + int min_val = input[0]; + int max_val = input[0]; + +#pragma omp parallel for reduction(min : min_val) reduction(max : max_val) + for (int i = 0; i < size; ++i) { + if (input[i] < min_val) { + min_val = input[i]; + } + if (input[i] > max_val) { + max_val = input[i]; + } + } + + if (max_val == min_val) { +#pragma omp parallel for + for (int i = 0; i < size; ++i) { + output[i] = input[i]; + } + return true; + } + +#pragma omp parallel for + for (int i = 0; i < static_cast(input.size()); ++i) { + output[i] = ((input[i] - min_val) * 255) / (max_val - min_val); + } + return true; +} + +bool KlimenkoVLSHContrastIncrOMP::PostProcessingImpl() { + return GetOutput().size() == GetInput().size(); +} + +} // namespace klimenko_v_lsh_contrast_incr_omp diff --git a/tasks/klimenko_v_lsh_contrast_incr_omp/settings.json b/tasks/klimenko_v_lsh_contrast_incr_omp/settings.json new file mode 100644 index 00000000..0be0208f --- /dev/null +++ b/tasks/klimenko_v_lsh_contrast_incr_omp/settings.json @@ -0,0 +1,10 @@ +{ + "tasks": { + "all": "enabled", + "omp": "enabled", + "seq": "enabled", + "stl": "enabled", + "tbb": "enabled" + }, + "tasks_type": "threads" +} diff --git a/tasks/klimenko_v_lsh_contrast_incr_omp/tests/functional/main.cpp b/tasks/klimenko_v_lsh_contrast_incr_omp/tests/functional/main.cpp new file mode 100644 index 00000000..f36f395e --- /dev/null +++ b/tasks/klimenko_v_lsh_contrast_incr_omp/tests/functional/main.cpp @@ -0,0 +1,81 @@ +#include + +#include +#include +#include +#include + +#include "klimenko_v_lsh_contrast_incr_omp/common/include/common.hpp" +#include "klimenko_v_lsh_contrast_incr_omp/omp/include/ops_omp.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace klimenko_v_lsh_contrast_incr_omp { + +class KlimenkoVRunFuncTestsLSH : public ppc::util::BaseRunFuncTests { + public: + static std::string PrintTestParam(const TestType &test_param) { + return std::to_string(test_param); + } + + protected: + void SetUp() override { + TestType size = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + + input_data_.resize(size); + for (int i = 0; i < size; ++i) { + input_data_[i] = 50 + (i % 101); + } + } + + bool CheckTestOutputData(OutType &output_data) final { + if (output_data.size() != input_data_.size()) { + return false; + } + + auto minmax = std::ranges::minmax_element(input_data_); + int min_val = *minmax.min; + int max_val = *minmax.max; + + if (max_val == min_val) { + return output_data == input_data_; + } + + for (size_t i = 0; i < input_data_.size(); ++i) { + int expected = ((input_data_[i] - min_val) * 255) / (max_val - min_val); + + if (expected != output_data[i]) { + return false; + } + } + return true; + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_; +}; + +namespace { + +TEST_P(KlimenkoVRunFuncTestsLSH, ContrastStretching) { + ExecuteTest(GetParam()); +} + +const std::array kTestParam = {16, 256, 1024}; + +const auto kTestTasksList = ppc::util::AddFuncTask( + kTestParam, PPC_SETTINGS_klimenko_v_lsh_contrast_incr_omp); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kTestName = KlimenkoVRunFuncTestsLSH::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(ContrastIncrTests, KlimenkoVRunFuncTestsLSH, kGtestValues, kTestName); + +} // namespace + +} // namespace klimenko_v_lsh_contrast_incr_omp diff --git a/tasks/klimenko_v_lsh_contrast_incr_omp/tests/performance/main.cpp b/tasks/klimenko_v_lsh_contrast_incr_omp/tests/performance/main.cpp new file mode 100644 index 00000000..c64ad572 --- /dev/null +++ b/tasks/klimenko_v_lsh_contrast_incr_omp/tests/performance/main.cpp @@ -0,0 +1,55 @@ +#include + +#include +#include + +#include "klimenko_v_lsh_contrast_incr_omp/common/include/common.hpp" +#include "klimenko_v_lsh_contrast_incr_omp/omp/include/ops_omp.hpp" +#include "util/include/perf_test_util.hpp" + +namespace klimenko_v_lsh_contrast_incr_omp { + +class KlimenkoVLSHContrastIncrOMPPerfTests : public ppc::util::BaseRunPerfTests { + public: + void SetUp() override { + const size_t size = 10000000; + input_data_.resize(size); + + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dist(0, 255); + for (auto &pixel : input_data_) { + pixel = dist(gen); + } + } + + bool CheckTestOutputData(OutType &output_data) final { + return output_data.size() == input_data_.size(); + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_; +}; + +TEST_P(KlimenkoVLSHContrastIncrOMPPerfTests, RunPerfModes) { + ExecuteTest(GetParam()); +} + +namespace { + +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_klimenko_v_lsh_contrast_incr_omp); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = KlimenkoVLSHContrastIncrOMPPerfTests::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, KlimenkoVLSHContrastIncrOMPPerfTests, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace klimenko_v_lsh_contrast_incr_omp From ba5a28eec75ae1751a389559e47bc13e30daa618 Mon Sep 17 00:00:00 2001 From: Vladislav Klimenko Date: Wed, 25 Feb 2026 09:57:38 +0300 Subject: [PATCH 2/4] fix clang-tidy errors --- .../omp/src/ops_omp.cpp | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp b/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp index e1d5b195..2f31e0d5 100644 --- a/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp +++ b/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp @@ -1,11 +1,9 @@ #include "klimenko_v_lsh_contrast_incr_omp/omp/include/ops_omp.hpp" -#include -#include +#include #include #include "klimenko_v_lsh_contrast_incr_omp/common/include/common.hpp" -#include "util/include/util.hpp" namespace klimenko_v_lsh_contrast_incr_omp { @@ -31,32 +29,28 @@ bool KlimenkoVLSHContrastIncrOMP::RunImpl() { return false; } - const int size = static_cast(input.size()); + const size_t size = input.size(); int min_val = input[0]; int max_val = input[0]; -#pragma omp parallel for reduction(min : min_val) reduction(max : max_val) - for (int i = 0; i < size; ++i) { - if (input[i] < min_val) { - min_val = input[i]; - } - if (input[i] > max_val) { - max_val = input[i]; - } +#pragma omp parallel for default(none) shared(input, size) reduction(min : min_val) reduction(max : max_val) + for (size_t i = 0; i < size; ++i) { + min_val = std::min(input[i], min_val); + max_val = std::max(input[i], max_val); } if (max_val == min_val) { -#pragma omp parallel for - for (int i = 0; i < size; ++i) { +#pragma omp parallel for default(none) shared(input, output, size) + for (size_t i = 0; i < size; ++i) { output[i] = input[i]; } return true; } - -#pragma omp parallel for - for (int i = 0; i < static_cast(input.size()); ++i) { - output[i] = ((input[i] - min_val) * 255) / (max_val - min_val); + const int range = max_val - min_val; +#pragma omp parallel for default(none) shared(input, output, size, min_val, range) + for (size_t i = 0; i < size; ++i) { + output[i] = ((input[i] - min_val) * 255) / range; } return true; } From 186d60613b7c1090b8d15e6bc238d52bd9388123 Mon Sep 17 00:00:00 2001 From: Vladislav Klimenko Date: Wed, 25 Feb 2026 10:03:11 +0300 Subject: [PATCH 3/4] fix clang-tidy errors 2 --- tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp b/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp index 2f31e0d5..182c9acb 100644 --- a/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp +++ b/tasks/klimenko_v_lsh_contrast_incr_omp/omp/src/ops_omp.cpp @@ -1,6 +1,7 @@ #include "klimenko_v_lsh_contrast_incr_omp/omp/include/ops_omp.hpp" #include +#include #include #include "klimenko_v_lsh_contrast_incr_omp/common/include/common.hpp" From c0ff4e8fd65b0da5c2a4fb7c9830a6f5b0e8b133 Mon Sep 17 00:00:00 2001 From: Vladislav Klimenko Date: Wed, 25 Feb 2026 10:53:12 +0300 Subject: [PATCH 4/4] rename test suite to prevent redefinition errors --- .../tests/functional/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasks/klimenko_v_lsh_contrast_incr_omp/tests/functional/main.cpp b/tasks/klimenko_v_lsh_contrast_incr_omp/tests/functional/main.cpp index f36f395e..d6f347c7 100644 --- a/tasks/klimenko_v_lsh_contrast_incr_omp/tests/functional/main.cpp +++ b/tasks/klimenko_v_lsh_contrast_incr_omp/tests/functional/main.cpp @@ -12,7 +12,7 @@ namespace klimenko_v_lsh_contrast_incr_omp { -class KlimenkoVRunFuncTestsLSH : public ppc::util::BaseRunFuncTests { +class KlimenkoVRunOMPFuncTestsLSH : public ppc::util::BaseRunFuncTests { public: static std::string PrintTestParam(const TestType &test_param) { return std::to_string(test_param); @@ -61,7 +61,7 @@ class KlimenkoVRunFuncTestsLSH : public ppc::util::BaseRunFuncTests; +const auto kTestName = KlimenkoVRunOMPFuncTestsLSH::PrintFuncTestName; -INSTANTIATE_TEST_SUITE_P(ContrastIncrTests, KlimenkoVRunFuncTestsLSH, kGtestValues, kTestName); +INSTANTIATE_TEST_SUITE_P(ContrastIncrTests, KlimenkoVRunOMPFuncTestsLSH, kGtestValues, kTestName); } // namespace