From cdffebed2b632d008235887972ea9cdb7d9b3018 Mon Sep 17 00:00:00 2001 From: NikitaOrehov Date: Fri, 17 Apr 2026 03:01:04 +0300 Subject: [PATCH 1/6] init --- .../omp/include/ops_omp.hpp | 32 +++++ .../omp/src/ops_omp.cpp | 119 ++++++++++++++++ .../tbb/include/ops_tbb.hpp | 32 +++++ .../tbb/src/ops_tbb.cpp | 130 ++++++++++++++++++ .../tests/functional/main.cpp | 8 +- .../tests/performance/main.cpp | 5 +- 6 files changed, 323 insertions(+), 3 deletions(-) create mode 100644 tasks/orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp create mode 100644 tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp create mode 100644 tasks/orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp create mode 100644 tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp diff --git a/tasks/orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp b/tasks/orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp new file mode 100644 index 000000000..d15efedb7 --- /dev/null +++ b/tasks/orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace orehov_n_jarvis_pass_seq { + +class OrehovNJarvisPassOMP : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kOMP; + } + explicit OrehovNJarvisPassOMP(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; + + [[nodiscard]] static double CheckLeft(Point a, Point b, Point c); + [[nodiscard]] Point FindFirstElem() const; + [[nodiscard]] static double Distance(Point a, Point b); + [[nodiscard]] Point FindNext(Point current) const; + + std::vector res_; + std::vector input_; +}; + +} // namespace orehov_n_jarvis_pass_seq diff --git a/tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp b/tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp new file mode 100644 index 000000000..eda7137d8 --- /dev/null +++ b/tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp @@ -0,0 +1,119 @@ +#include "orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp" + +#include +#include +#include +#include + +#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" + +namespace orehov_n_jarvis_pass_seq { + +OrehovNJarvisPassOMP::OrehovNJarvisPassOMP(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = std::vector(); +} + +bool OrehovNJarvisPassOMP::ValidationImpl() { + return (!GetInput().empty()); +} + +bool OrehovNJarvisPassOMP::PreProcessingImpl() { + std::set tmp(GetInput().begin(), GetInput().end()); + input_.assign(tmp.begin(), tmp.end()); + return true; +} + +bool OrehovNJarvisPassOMP::RunImpl() { + if (input_.size() == 1 || input_.size() == 2) { + res_ = input_; + return true; + } + + Point current = FindFirstElem(); + res_.push_back(current); + + while (true) { + Point next = FindNext(current); + if (next == res_[0]) { + break; + } + + current = next; + res_.push_back(next); + } + + return true; +} + +Point OrehovNJarvisPassOMP::FindNext(Point current) const { + Point next = (current == input_[0]) ? input_[1] : input_[0]; + Point global_next = next; + + const size_t n = input_.size(); + const auto &input = input_; + +#pragma omp parallel num_threads(2) default(none) shared(input, n, current, global_next, next) + { + Point local_next = next; + + const int n_int = static_cast(n); +#pragma omp for + for (int i = 0; i < n_int; ++i) { + const Point &point = input[i]; + if (current == point) { + continue; + } + + double orient = CheckLeft(current, local_next, point); + + if (orient > 0) { + local_next = point; + } else if (orient == 0) { + if (Distance(current, point) > Distance(current, local_next)) { + local_next = point; + } + } + } + +#pragma omp critical + { + double global_orient = CheckLeft(current, global_next, local_next); + if (global_orient > 0) { + global_next = local_next; + } else if (global_orient == 0) { + if (Distance(current, local_next) > Distance(current, global_next)) { + global_next = local_next; + } + } + } + } + + return global_next; +} + +double OrehovNJarvisPassOMP::CheckLeft(Point a, Point b, Point c) { + return ((b.x - a.x) * (c.y - a.y)) - ((b.y - a.y) * (c.x - a.x)); +} + +Point OrehovNJarvisPassOMP::FindFirstElem() const { + Point current = input_[0]; + for (auto f : input_) { + if (f.x < current.x || (f.y < current.y && f.x == current.x)) { + current = f; + } + } + return current; +} + +double OrehovNJarvisPassOMP::Distance(Point a, Point b) { + return std::sqrt(pow(a.y - b.y, 2) + pow(a.x - b.x, 2)); +} + +bool OrehovNJarvisPassOMP::PostProcessingImpl() { + GetOutput() = res_; + return true; +} + +} // namespace orehov_n_jarvis_pass_seq diff --git a/tasks/orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp b/tasks/orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp new file mode 100644 index 000000000..51e535704 --- /dev/null +++ b/tasks/orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace orehov_n_jarvis_pass_seq { + +class OrehovNJarvisPassTBB : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kTBB; + } + explicit OrehovNJarvisPassTBB(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; + + [[nodiscard]] static double CheckLeft(Point a, Point b, Point c); + [[nodiscard]] Point FindFirstElem() const; + [[nodiscard]] static double Distance(Point a, Point b); + [[nodiscard]] Point FindNext(Point current) const; + + std::vector res_; + std::vector input_; +}; + +} // namespace orehov_n_jarvis_pass_seq diff --git a/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp b/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp new file mode 100644 index 000000000..f80abdd35 --- /dev/null +++ b/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp @@ -0,0 +1,130 @@ +#include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" + +#include +#include +#include +#include + +#include "oneapi/tbb.h" +#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" + +namespace orehov_n_jarvis_pass_seq { + +OrehovNJarvisPassTBB::OrehovNJarvisPassTBB(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = std::vector(); +} + +bool OrehovNJarvisPassTBB::ValidationImpl() { + return (!GetInput().empty()); +} + +bool OrehovNJarvisPassTBB::PreProcessingImpl() { + std::set tmp(GetInput().begin(), GetInput().end()); + input_.assign(tmp.begin(), tmp.end()); + return true; +} + +bool OrehovNJarvisPassTBB::RunImpl() { + if (input_.size() == 1 || input_.size() == 2) { + res_ = input_; + return true; + } + + Point current = FindFirstElem(); + res_.push_back(current); + + while (true) { + Point next = FindNext(current); + if (next == res_[0]) { + break; + } + + current = next; + res_.push_back(next); + } + + return true; +} + +Point OrehovNJarvisPassTBB::FindNext(Point current) const { + Point next = (current == input_[0]) ? input_[1] : input_[0]; + + const size_t n = input_.size(); + const auto &input = input_; + + struct Body { + const Point ¤t; + const std::vector &input; + Point best_point; + + Body(const Point &c, const std::vector &in) + : current(c), input(in), best_point((current == in[0]) ? in[1] : in[0]) {} + + Body(Body &other, tbb::split) + : current(other.current), input(other.input), best_point(other.best_point) {} + + void operator()(const tbb::blocked_range &range) { + for (size_t i = range.begin(); i != range.end(); ++i) { + const Point &point = input[i]; + if (current == point) { + continue; + } + + double orient = OrehovNJarvisPassTBB::CheckLeft(current, best_point, point); + + if (orient > 0) { + best_point = point; + } else if (orient == 0) { + if (OrehovNJarvisPassTBB::Distance(current, point) > + OrehovNJarvisPassTBB::Distance(current, best_point)) { + best_point = point; + } + } + } + } + + void join(const Body &other) { + double global_orient = OrehovNJarvisPassTBB::CheckLeft(current, best_point, other.best_point); + if (global_orient > 0) { + best_point = other.best_point; + } else if (global_orient == 0) { + if (OrehovNJarvisPassTBB::Distance(current, other.best_point) > + OrehovNJarvisPassTBB::Distance(current, best_point)) { + best_point = other.best_point; + } + } + } + }; + + Body body(current, input); + tbb::parallel_reduce(tbb::blocked_range(0, n), body); + + return body.best_point; +} + +double OrehovNJarvisPassTBB::CheckLeft(Point a, Point b, Point c) { + return ((b.x - a.x) * (c.y - a.y)) - ((b.y - a.y) * (c.x - a.x)); +} + +Point OrehovNJarvisPassTBB::FindFirstElem() const { + Point current = input_[0]; + for (auto f : input_) { + if (f.x < current.x || (f.y < current.y && f.x == current.x)) { + current = f; + } + } + return current; +} + +double OrehovNJarvisPassTBB::Distance(Point a, Point b) { + return std::sqrt(std::pow(a.y - b.y, 2) + std::pow(a.x - b.x, 2)); +} + +bool OrehovNJarvisPassTBB::PostProcessingImpl() { + GetOutput() = res_; + return true; +} + +} // namespace orehov_n_jarvis_pass_seq \ No newline at end of file diff --git a/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp b/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp index f235bb105..45605ac47 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp +++ b/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp @@ -7,6 +7,8 @@ #include #include "orehov_n_jarvis_pass_seq/common/include/common.hpp" +#include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" +#include "orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp" #include "orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp" #include "util/include/func_test_util.hpp" #include "util/include/util.hpp" @@ -69,8 +71,10 @@ TEST_P(OrehovNJarvisPassSEQFuncTests, MatmulFromPic) { const std::array kTestParam = {1, 2, 3}; -const auto kTestTasksList = - std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_example_threads)); +const auto kTestTasksList = std::tuple_cat( + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass_seq), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass_seq), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass_seq)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); diff --git a/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp b/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp index dae7b7b63..d4bae122c 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp +++ b/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp @@ -3,6 +3,8 @@ #include #include "orehov_n_jarvis_pass_seq/common/include/common.hpp" +#include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" +#include "orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp" #include "orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp" #include "util/include/perf_test_util.hpp" @@ -39,7 +41,8 @@ TEST_P(OrehovNJarvisPassSEQPerfTests, RunPerfModes) { namespace { -const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks(PPC_SETTINGS_example_threads); +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_orehov_n_jarvis_pass_seq); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); From 099a62cfa1da9a767b80222fbdd08cab1b92bf43 Mon Sep 17 00:00:00 2001 From: NikitaOrehov Date: Fri, 17 Apr 2026 03:01:24 +0300 Subject: [PATCH 2/6] init --- .../orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp | 16 +++++++--------- .../tests/functional/main.cpp | 2 +- .../tests/performance/main.cpp | 5 +++-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp b/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp index f80abdd35..aceb38896 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp +++ b/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp @@ -50,7 +50,7 @@ bool OrehovNJarvisPassTBB::RunImpl() { Point OrehovNJarvisPassTBB::FindNext(Point current) const { Point next = (current == input_[0]) ? input_[1] : input_[0]; - + const size_t n = input_.size(); const auto &input = input_; @@ -59,11 +59,10 @@ Point OrehovNJarvisPassTBB::FindNext(Point current) const { const std::vector &input; Point best_point; - Body(const Point &c, const std::vector &in) + Body(const Point &c, const std::vector &in) : current(c), input(in), best_point((current == in[0]) ? in[1] : in[0]) {} - Body(Body &other, tbb::split) - : current(other.current), input(other.input), best_point(other.best_point) {} + Body(Body &other, tbb::split) : current(other.current), input(other.input), best_point(other.best_point) {} void operator()(const tbb::blocked_range &range) { for (size_t i = range.begin(); i != range.end(); ++i) { @@ -77,8 +76,7 @@ Point OrehovNJarvisPassTBB::FindNext(Point current) const { if (orient > 0) { best_point = point; } else if (orient == 0) { - if (OrehovNJarvisPassTBB::Distance(current, point) > - OrehovNJarvisPassTBB::Distance(current, best_point)) { + if (OrehovNJarvisPassTBB::Distance(current, point) > OrehovNJarvisPassTBB::Distance(current, best_point)) { best_point = point; } } @@ -90,7 +88,7 @@ Point OrehovNJarvisPassTBB::FindNext(Point current) const { if (global_orient > 0) { best_point = other.best_point; } else if (global_orient == 0) { - if (OrehovNJarvisPassTBB::Distance(current, other.best_point) > + if (OrehovNJarvisPassTBB::Distance(current, other.best_point) > OrehovNJarvisPassTBB::Distance(current, best_point)) { best_point = other.best_point; } @@ -100,7 +98,7 @@ Point OrehovNJarvisPassTBB::FindNext(Point current) const { Body body(current, input); tbb::parallel_reduce(tbb::blocked_range(0, n), body); - + return body.best_point; } @@ -127,4 +125,4 @@ bool OrehovNJarvisPassTBB::PostProcessingImpl() { return true; } -} // namespace orehov_n_jarvis_pass_seq \ No newline at end of file +} // namespace orehov_n_jarvis_pass_seq diff --git a/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp b/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp index 45605ac47..4c9a871a1 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp +++ b/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp @@ -7,9 +7,9 @@ #include #include "orehov_n_jarvis_pass_seq/common/include/common.hpp" -#include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" #include "orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp" #include "orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp" +#include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" #include "util/include/func_test_util.hpp" #include "util/include/util.hpp" diff --git a/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp b/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp index d4bae122c..77fdd95d4 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp +++ b/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp @@ -3,9 +3,9 @@ #include #include "orehov_n_jarvis_pass_seq/common/include/common.hpp" -#include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" #include "orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp" #include "orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp" +#include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" #include "util/include/perf_test_util.hpp" namespace orehov_n_jarvis_pass_seq { @@ -42,7 +42,8 @@ TEST_P(OrehovNJarvisPassSEQPerfTests, RunPerfModes) { namespace { const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks(PPC_SETTINGS_orehov_n_jarvis_pass_seq); + ppc::util::MakeAllPerfTasks( + PPC_SETTINGS_orehov_n_jarvis_pass_seq); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); From 661235706034509c321bda09904e027ffe64aa2c Mon Sep 17 00:00:00 2001 From: NikitaOrehov Date: Fri, 17 Apr 2026 04:21:51 +0300 Subject: [PATCH 3/6] tyt --- tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp | 2 +- tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp b/tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp index eda7137d8..4fa5490be 100644 --- a/tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp +++ b/tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp @@ -54,7 +54,7 @@ Point OrehovNJarvisPassOMP::FindNext(Point current) const { const size_t n = input_.size(); const auto &input = input_; -#pragma omp parallel num_threads(2) default(none) shared(input, n, current, global_next, next) +#pragma omp parallel default(none) shared(input, n, current, global_next, next) { Point local_next = next; diff --git a/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp b/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp index aceb38896..357ce5f79 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp +++ b/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp @@ -49,8 +49,6 @@ bool OrehovNJarvisPassTBB::RunImpl() { } Point OrehovNJarvisPassTBB::FindNext(Point current) const { - Point next = (current == input_[0]) ? input_[1] : input_[0]; - const size_t n = input_.size(); const auto &input = input_; From 7955c599bb4be5321febf2eb080a09b21d9368b8 Mon Sep 17 00:00:00 2001 From: NikitaOrehov Date: Fri, 17 Apr 2026 05:11:48 +0300 Subject: [PATCH 4/6] delete omp --- .../omp/include/ops_omp.hpp | 32 ----- .../omp/src/ops_omp.cpp | 119 ------------------ .../tests/functional/main.cpp | 2 - .../tests/performance/main.cpp | 6 +- 4 files changed, 2 insertions(+), 157 deletions(-) delete mode 100644 tasks/orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp delete mode 100644 tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp diff --git a/tasks/orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp b/tasks/orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp deleted file mode 100644 index d15efedb7..000000000 --- a/tasks/orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include - -#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" -#include "task/include/task.hpp" - -namespace orehov_n_jarvis_pass_seq { - -class OrehovNJarvisPassOMP : public BaseTask { - public: - static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { - return ppc::task::TypeOfTask::kOMP; - } - explicit OrehovNJarvisPassOMP(const InType &in); - - private: - bool ValidationImpl() override; - bool PreProcessingImpl() override; - bool RunImpl() override; - bool PostProcessingImpl() override; - - [[nodiscard]] static double CheckLeft(Point a, Point b, Point c); - [[nodiscard]] Point FindFirstElem() const; - [[nodiscard]] static double Distance(Point a, Point b); - [[nodiscard]] Point FindNext(Point current) const; - - std::vector res_; - std::vector input_; -}; - -} // namespace orehov_n_jarvis_pass_seq diff --git a/tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp b/tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp deleted file mode 100644 index 4fa5490be..000000000 --- a/tasks/orehov_n_jarvis_pass_seq/omp/src/ops_omp.cpp +++ /dev/null @@ -1,119 +0,0 @@ -#include "orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp" - -#include -#include -#include -#include - -#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" - -namespace orehov_n_jarvis_pass_seq { - -OrehovNJarvisPassOMP::OrehovNJarvisPassOMP(const InType &in) { - SetTypeOfTask(GetStaticTypeOfTask()); - GetInput() = in; - GetOutput() = std::vector(); -} - -bool OrehovNJarvisPassOMP::ValidationImpl() { - return (!GetInput().empty()); -} - -bool OrehovNJarvisPassOMP::PreProcessingImpl() { - std::set tmp(GetInput().begin(), GetInput().end()); - input_.assign(tmp.begin(), tmp.end()); - return true; -} - -bool OrehovNJarvisPassOMP::RunImpl() { - if (input_.size() == 1 || input_.size() == 2) { - res_ = input_; - return true; - } - - Point current = FindFirstElem(); - res_.push_back(current); - - while (true) { - Point next = FindNext(current); - if (next == res_[0]) { - break; - } - - current = next; - res_.push_back(next); - } - - return true; -} - -Point OrehovNJarvisPassOMP::FindNext(Point current) const { - Point next = (current == input_[0]) ? input_[1] : input_[0]; - Point global_next = next; - - const size_t n = input_.size(); - const auto &input = input_; - -#pragma omp parallel default(none) shared(input, n, current, global_next, next) - { - Point local_next = next; - - const int n_int = static_cast(n); -#pragma omp for - for (int i = 0; i < n_int; ++i) { - const Point &point = input[i]; - if (current == point) { - continue; - } - - double orient = CheckLeft(current, local_next, point); - - if (orient > 0) { - local_next = point; - } else if (orient == 0) { - if (Distance(current, point) > Distance(current, local_next)) { - local_next = point; - } - } - } - -#pragma omp critical - { - double global_orient = CheckLeft(current, global_next, local_next); - if (global_orient > 0) { - global_next = local_next; - } else if (global_orient == 0) { - if (Distance(current, local_next) > Distance(current, global_next)) { - global_next = local_next; - } - } - } - } - - return global_next; -} - -double OrehovNJarvisPassOMP::CheckLeft(Point a, Point b, Point c) { - return ((b.x - a.x) * (c.y - a.y)) - ((b.y - a.y) * (c.x - a.x)); -} - -Point OrehovNJarvisPassOMP::FindFirstElem() const { - Point current = input_[0]; - for (auto f : input_) { - if (f.x < current.x || (f.y < current.y && f.x == current.x)) { - current = f; - } - } - return current; -} - -double OrehovNJarvisPassOMP::Distance(Point a, Point b) { - return std::sqrt(pow(a.y - b.y, 2) + pow(a.x - b.x, 2)); -} - -bool OrehovNJarvisPassOMP::PostProcessingImpl() { - GetOutput() = res_; - return true; -} - -} // namespace orehov_n_jarvis_pass_seq diff --git a/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp b/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp index 4c9a871a1..fcd8aa57c 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp +++ b/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp @@ -7,7 +7,6 @@ #include #include "orehov_n_jarvis_pass_seq/common/include/common.hpp" -#include "orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp" #include "orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp" #include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" #include "util/include/func_test_util.hpp" @@ -73,7 +72,6 @@ const std::array kTestParam = {1, 2, 3}; const auto kTestTasksList = std::tuple_cat( ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass_seq), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass_seq), ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass_seq)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); diff --git a/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp b/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp index 77fdd95d4..52e4abdd5 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp +++ b/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp @@ -3,7 +3,6 @@ #include #include "orehov_n_jarvis_pass_seq/common/include/common.hpp" -#include "orehov_n_jarvis_pass_seq/omp/include/ops_omp.hpp" #include "orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp" #include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" #include "util/include/perf_test_util.hpp" @@ -41,9 +40,8 @@ TEST_P(OrehovNJarvisPassSEQPerfTests, RunPerfModes) { namespace { -const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks( - PPC_SETTINGS_orehov_n_jarvis_pass_seq); +const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks( + PPC_SETTINGS_orehov_n_jarvis_pass_seq); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); From 86af97e0221f301d409f4bafd6ce750dc826f5a6 Mon Sep 17 00:00:00 2001 From: NikitaOrehov Date: Sat, 18 Apr 2026 05:13:47 +0300 Subject: [PATCH 5/6] fix tbb --- .../common/include/common.hpp | 4 +- .../info.json | 0 .../omp/include/ops_omp.hpp | 31 +++++ .../orehov_n_jarvis_pass/omp/src/ops_omp.cpp | 122 ++++++++++++++++++ .../seq/include/ops_seq.hpp | 6 +- .../seq/src/ops_seq.cpp | 8 +- .../settings.json | 0 .../tbb/include/ops_tbb.hpp | 6 +- .../tbb/src/ops_tbb.cpp | 8 +- .../tests/functional/main.cpp | 26 ++-- .../tests/performance/main.cpp | 22 ++-- 11 files changed, 194 insertions(+), 39 deletions(-) rename tasks/{orehov_n_jarvis_pass_seq => orehov_n_jarvis_pass}/common/include/common.hpp (88%) rename tasks/{orehov_n_jarvis_pass_seq => orehov_n_jarvis_pass}/info.json (100%) create mode 100644 tasks/orehov_n_jarvis_pass/omp/include/ops_omp.hpp create mode 100644 tasks/orehov_n_jarvis_pass/omp/src/ops_omp.cpp rename tasks/{orehov_n_jarvis_pass_seq => orehov_n_jarvis_pass}/seq/include/ops_seq.hpp (83%) rename tasks/{orehov_n_jarvis_pass_seq => orehov_n_jarvis_pass}/seq/src/ops_seq.cpp (90%) rename tasks/{orehov_n_jarvis_pass_seq => orehov_n_jarvis_pass}/settings.json (100%) rename tasks/{orehov_n_jarvis_pass_seq => orehov_n_jarvis_pass}/tbb/include/ops_tbb.hpp (83%) rename tasks/{orehov_n_jarvis_pass_seq => orehov_n_jarvis_pass}/tbb/src/ops_tbb.cpp (93%) rename tasks/{orehov_n_jarvis_pass_seq => orehov_n_jarvis_pass}/tests/functional/main.cpp (61%) rename tasks/{orehov_n_jarvis_pass_seq => orehov_n_jarvis_pass}/tests/performance/main.cpp (52%) diff --git a/tasks/orehov_n_jarvis_pass_seq/common/include/common.hpp b/tasks/orehov_n_jarvis_pass/common/include/common.hpp similarity index 88% rename from tasks/orehov_n_jarvis_pass_seq/common/include/common.hpp rename to tasks/orehov_n_jarvis_pass/common/include/common.hpp index 65693023b..988e447ca 100644 --- a/tasks/orehov_n_jarvis_pass_seq/common/include/common.hpp +++ b/tasks/orehov_n_jarvis_pass/common/include/common.hpp @@ -5,7 +5,7 @@ #include "task/include/task.hpp" -namespace orehov_n_jarvis_pass_seq { +namespace orehov_n_jarvis_pass { struct Point { double x; @@ -27,4 +27,4 @@ using OutType = std::vector; using TestType = int; using BaseTask = ppc::task::Task; -} // namespace orehov_n_jarvis_pass_seq +} // namespace orehov_n_jarvis_pass diff --git a/tasks/orehov_n_jarvis_pass_seq/info.json b/tasks/orehov_n_jarvis_pass/info.json similarity index 100% rename from tasks/orehov_n_jarvis_pass_seq/info.json rename to tasks/orehov_n_jarvis_pass/info.json diff --git a/tasks/orehov_n_jarvis_pass/omp/include/ops_omp.hpp b/tasks/orehov_n_jarvis_pass/omp/include/ops_omp.hpp new file mode 100644 index 000000000..b91feca98 --- /dev/null +++ b/tasks/orehov_n_jarvis_pass/omp/include/ops_omp.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +#include "orehov_n_jarvis_pass/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace orehov_n_jarvis_pass { + +class OrehovNJarvisPassOMP : public ppc::task::Task, std::vector> { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kOMP; + } + explicit OrehovNJarvisPassOMP(const std::vector &in); + + private: + static double CheckLeft(Point a, Point b, Point c); + static double DistanceSquared(Point a, Point b); + + Point FindFirstElem(const std::vector& input) const; + Point FindNext(Point current, const std::vector& input) const; + + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace orehov_n_jarvis_pass diff --git a/tasks/orehov_n_jarvis_pass/omp/src/ops_omp.cpp b/tasks/orehov_n_jarvis_pass/omp/src/ops_omp.cpp new file mode 100644 index 000000000..3341193df --- /dev/null +++ b/tasks/orehov_n_jarvis_pass/omp/src/ops_omp.cpp @@ -0,0 +1,122 @@ +#include "orehov_n_jarvis_pass/omp/include/ops_omp.hpp" + +#include +#include +#include +#include + +#include "orehov_n_jarvis_pass/common/include/common.hpp" + +namespace orehov_n_jarvis_pass { + +OrehovNJarvisPassOMP::OrehovNJarvisPassOMP(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = std::vector(); +} + +bool OrehovNJarvisPassOMP::ValidationImpl() { + return !GetInput().empty(); +} + +bool OrehovNJarvisPassOMP::PreProcessingImpl() { + return true; +} + +bool OrehovNJarvisPassOMP::RunImpl() { + const auto& input = GetInput(); + + if (input.size() == 1 || input.size() == 2) { + GetOutput() = input; + return true; + } + + Point current = FindFirstElem(input); + GetOutput().push_back(current); + + while (true) { + Point next = FindNext(current, input); + if (next == GetOutput()[0]) { + break; + } + + current = next; + GetOutput().push_back(next); + } + + return true; +} + +Point OrehovNJarvisPassOMP::FindNext(Point current, const std::vector& input) const { + const size_t n = input.size(); + Point initial_candidate = (current == input[0]) ? input[1] : input[0]; + + int max_threads = omp_get_max_threads(); + std::vector local_bests(max_threads, initial_candidate); + const int n_int = static_cast(n); + +#pragma omp parallel default(none) shared(input, n_int, current, local_bests) + { + int tid = omp_get_thread_num(); + Point thread_local_best = local_bests[tid]; + +#pragma omp for nowait + for (int i = 0; i < n_int; ++i) { + const Point &point = input[i]; + if (current == point) { + continue; + } + + double orient = CheckLeft(current, thread_local_best, point); + + if (orient > 0) { + thread_local_best = point; + } else if (std::abs(orient) < 1e-9) { + if (DistanceSquared(current, point) > DistanceSquared(current, thread_local_best)) { + thread_local_best = point; + } + } + } + local_bests[tid] = thread_local_best; + } + + Point global_next = local_bests[0]; + for (int i = 1; i < max_threads; ++i) { + double orient = CheckLeft(current, global_next, local_bests[i]); + if (orient > 0) { + global_next = local_bests[i]; + } else if (std::abs(orient) < 1e-9) { + if (DistanceSquared(current, local_bests[i]) > DistanceSquared(current, global_next)) { + global_next = local_bests[i]; + } + } + } + + return global_next; +} + +double OrehovNJarvisPassOMP::CheckLeft(Point a, Point b, Point c) { + return ((b.x - a.x) * (c.y - a.y)) - ((b.y - a.y) * (c.x - a.x)); +} + +Point OrehovNJarvisPassOMP::FindFirstElem(const std::vector& input) const { + Point current = input[0]; + for (const auto& f : input) { + if (f.x < current.x || (f.y < current.y && f.x == current.x)) { + current = f; + } + } + return current; +} + +double OrehovNJarvisPassOMP::DistanceSquared(Point a, Point b) { + double dx = a.x - b.x; + double dy = a.y - b.y; + return dx * dx + dy * dy; +} + +bool OrehovNJarvisPassOMP::PostProcessingImpl() { + return true; +} + +} // namespace orehov_n_jarvis_pass \ No newline at end of file diff --git a/tasks/orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp b/tasks/orehov_n_jarvis_pass/seq/include/ops_seq.hpp similarity index 83% rename from tasks/orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp rename to tasks/orehov_n_jarvis_pass/seq/include/ops_seq.hpp index f643c08e6..15c58e1ec 100644 --- a/tasks/orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp +++ b/tasks/orehov_n_jarvis_pass/seq/include/ops_seq.hpp @@ -2,10 +2,10 @@ #include -#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" +#include "orehov_n_jarvis_pass/common/include/common.hpp" #include "task/include/task.hpp" -namespace orehov_n_jarvis_pass_seq { +namespace orehov_n_jarvis_pass { class OrehovNJarvisPassSEQ : public BaseTask { public: @@ -29,4 +29,4 @@ class OrehovNJarvisPassSEQ : public BaseTask { std::vector input_; }; -} // namespace orehov_n_jarvis_pass_seq +} // namespace orehov_n_jarvis_pass diff --git a/tasks/orehov_n_jarvis_pass_seq/seq/src/ops_seq.cpp b/tasks/orehov_n_jarvis_pass/seq/src/ops_seq.cpp similarity index 90% rename from tasks/orehov_n_jarvis_pass_seq/seq/src/ops_seq.cpp rename to tasks/orehov_n_jarvis_pass/seq/src/ops_seq.cpp index 91037dcc9..b1309b6e4 100644 --- a/tasks/orehov_n_jarvis_pass_seq/seq/src/ops_seq.cpp +++ b/tasks/orehov_n_jarvis_pass/seq/src/ops_seq.cpp @@ -1,12 +1,12 @@ -#include "orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp" +#include "orehov_n_jarvis_pass/seq/include/ops_seq.hpp" #include #include #include -#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" +#include "orehov_n_jarvis_pass/common/include/common.hpp" -namespace orehov_n_jarvis_pass_seq { +namespace orehov_n_jarvis_pass { OrehovNJarvisPassSEQ::OrehovNJarvisPassSEQ(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); @@ -88,4 +88,4 @@ bool OrehovNJarvisPassSEQ::PostProcessingImpl() { return true; } -} // namespace orehov_n_jarvis_pass_seq +} // namespace orehov_n_jarvis_pass diff --git a/tasks/orehov_n_jarvis_pass_seq/settings.json b/tasks/orehov_n_jarvis_pass/settings.json similarity index 100% rename from tasks/orehov_n_jarvis_pass_seq/settings.json rename to tasks/orehov_n_jarvis_pass/settings.json diff --git a/tasks/orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp b/tasks/orehov_n_jarvis_pass/tbb/include/ops_tbb.hpp similarity index 83% rename from tasks/orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp rename to tasks/orehov_n_jarvis_pass/tbb/include/ops_tbb.hpp index 51e535704..c626e5150 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp +++ b/tasks/orehov_n_jarvis_pass/tbb/include/ops_tbb.hpp @@ -2,10 +2,10 @@ #include -#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" +#include "orehov_n_jarvis_pass/common/include/common.hpp" #include "task/include/task.hpp" -namespace orehov_n_jarvis_pass_seq { +namespace orehov_n_jarvis_pass { class OrehovNJarvisPassTBB : public BaseTask { public: @@ -29,4 +29,4 @@ class OrehovNJarvisPassTBB : public BaseTask { std::vector input_; }; -} // namespace orehov_n_jarvis_pass_seq +} // namespace orehov_n_jarvis_pass diff --git a/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp b/tasks/orehov_n_jarvis_pass/tbb/src/ops_tbb.cpp similarity index 93% rename from tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp rename to tasks/orehov_n_jarvis_pass/tbb/src/ops_tbb.cpp index 357ce5f79..b68e33043 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tbb/src/ops_tbb.cpp +++ b/tasks/orehov_n_jarvis_pass/tbb/src/ops_tbb.cpp @@ -1,4 +1,4 @@ -#include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" +#include "orehov_n_jarvis_pass/tbb/include/ops_tbb.hpp" #include #include @@ -6,9 +6,9 @@ #include #include "oneapi/tbb.h" -#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" +#include "orehov_n_jarvis_pass/common/include/common.hpp" -namespace orehov_n_jarvis_pass_seq { +namespace orehov_n_jarvis_pass { OrehovNJarvisPassTBB::OrehovNJarvisPassTBB(const InType &in) { SetTypeOfTask(GetStaticTypeOfTask()); @@ -123,4 +123,4 @@ bool OrehovNJarvisPassTBB::PostProcessingImpl() { return true; } -} // namespace orehov_n_jarvis_pass_seq +} // namespace orehov_n_jarvis_pass diff --git a/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp b/tasks/orehov_n_jarvis_pass/tests/functional/main.cpp similarity index 61% rename from tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp rename to tasks/orehov_n_jarvis_pass/tests/functional/main.cpp index fcd8aa57c..5408a0821 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tests/functional/main.cpp +++ b/tasks/orehov_n_jarvis_pass/tests/functional/main.cpp @@ -6,15 +6,16 @@ #include #include -#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" -#include "orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp" -#include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" +#include "orehov_n_jarvis_pass/common/include/common.hpp" +#include "orehov_n_jarvis_pass/seq/include/ops_seq.hpp" +#include "orehov_n_jarvis_pass/omp/include/ops_omp.hpp" +#include "orehov_n_jarvis_pass/tbb/include/ops_tbb.hpp" #include "util/include/func_test_util.hpp" #include "util/include/util.hpp" -namespace orehov_n_jarvis_pass_seq { +namespace orehov_n_jarvis_pass { -class OrehovNJarvisPassSEQFuncTests : public ppc::util::BaseRunFuncTests { +class OrehovNJarvisPassFuncTests : public ppc::util::BaseRunFuncTests { public: static std::string PrintTestParam(const TestType &test_param) { return std::to_string(test_param); @@ -64,22 +65,23 @@ class OrehovNJarvisPassSEQFuncTests : public ppc::util::BaseRunFuncTests kTestParam = {1, 2, 3}; -const auto kTestTasksList = std::tuple_cat( - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass_seq), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass_seq)); +const auto kTestTasksList = + std::tuple_cat(ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_orehov_n_jarvis_pass)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); -const auto kPerfTestName = OrehovNJarvisPassSEQFuncTests::PrintFuncTestName; +const auto kPerfTestName = OrehovNJarvisPassFuncTests::PrintFuncTestName; -INSTANTIATE_TEST_SUITE_P(PicMatrixTests, OrehovNJarvisPassSEQFuncTests, kGtestValues, kPerfTestName); +INSTANTIATE_TEST_SUITE_P(PicMatrixTests, OrehovNJarvisPassFuncTests, kGtestValues, kPerfTestName); } // namespace -} // namespace orehov_n_jarvis_pass_seq +} // namespace orehov_n_jarvis_pass diff --git a/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp b/tasks/orehov_n_jarvis_pass/tests/performance/main.cpp similarity index 52% rename from tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp rename to tasks/orehov_n_jarvis_pass/tests/performance/main.cpp index 52e4abdd5..b2398757b 100644 --- a/tasks/orehov_n_jarvis_pass_seq/tests/performance/main.cpp +++ b/tasks/orehov_n_jarvis_pass/tests/performance/main.cpp @@ -2,14 +2,15 @@ #include -#include "orehov_n_jarvis_pass_seq/common/include/common.hpp" -#include "orehov_n_jarvis_pass_seq/seq/include/ops_seq.hpp" -#include "orehov_n_jarvis_pass_seq/tbb/include/ops_tbb.hpp" +#include "orehov_n_jarvis_pass/common/include/common.hpp" +#include "orehov_n_jarvis_pass/seq/include/ops_seq.hpp" +#include "orehov_n_jarvis_pass/omp/include/ops_omp.hpp" +#include "orehov_n_jarvis_pass/tbb/include/ops_tbb.hpp" #include "util/include/perf_test_util.hpp" -namespace orehov_n_jarvis_pass_seq { +namespace orehov_n_jarvis_pass { -class OrehovNJarvisPassSEQPerfTests : public ppc::util::BaseRunPerfTests { +class OrehovNJarvisPassPerfTests : public ppc::util::BaseRunPerfTests { const int kCount_ = 2000; InType input_data_; @@ -34,21 +35,20 @@ class OrehovNJarvisPassSEQPerfTests : public ppc::util::BaseRunPerfTests( - PPC_SETTINGS_orehov_n_jarvis_pass_seq); +const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks(PPC_SETTINGS_orehov_n_jarvis_pass); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); -const auto kPerfTestName = OrehovNJarvisPassSEQPerfTests::CustomPerfTestName; +const auto kPerfTestName = OrehovNJarvisPassPerfTests::CustomPerfTestName; -INSTANTIATE_TEST_SUITE_P(RunModeTests, OrehovNJarvisPassSEQPerfTests, kGtestValues, kPerfTestName); +INSTANTIATE_TEST_SUITE_P(RunModeTests, OrehovNJarvisPassPerfTests, kGtestValues, kPerfTestName); } // namespace -} // namespace orehov_n_jarvis_pass_seq +} // namespace orehov_n_jarvis_pass From c872f4c02e78c770c770eaa703c165b00b04d13f Mon Sep 17 00:00:00 2001 From: NikitaOrehov Date: Sat, 18 Apr 2026 05:24:29 +0300 Subject: [PATCH 6/6] fix pre-commit --- .../orehov_n_jarvis_pass/omp/include/ops_omp.hpp | 6 +++--- tasks/orehov_n_jarvis_pass/omp/src/ops_omp.cpp | 15 ++++++++------- .../tests/functional/main.cpp | 2 +- .../tests/performance/main.cpp | 6 ++++-- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/tasks/orehov_n_jarvis_pass/omp/include/ops_omp.hpp b/tasks/orehov_n_jarvis_pass/omp/include/ops_omp.hpp index b91feca98..76d2e7745 100644 --- a/tasks/orehov_n_jarvis_pass/omp/include/ops_omp.hpp +++ b/tasks/orehov_n_jarvis_pass/omp/include/ops_omp.hpp @@ -18,9 +18,9 @@ class OrehovNJarvisPassOMP : public ppc::task::Task, std::vec private: static double CheckLeft(Point a, Point b, Point c); static double DistanceSquared(Point a, Point b); - - Point FindFirstElem(const std::vector& input) const; - Point FindNext(Point current, const std::vector& input) const; + + Point FindFirstElem(const std::vector &input) const; + Point FindNext(Point current, const std::vector &input) const; bool ValidationImpl() override; bool PreProcessingImpl() override; diff --git a/tasks/orehov_n_jarvis_pass/omp/src/ops_omp.cpp b/tasks/orehov_n_jarvis_pass/omp/src/ops_omp.cpp index 3341193df..68fa1bdee 100644 --- a/tasks/orehov_n_jarvis_pass/omp/src/ops_omp.cpp +++ b/tasks/orehov_n_jarvis_pass/omp/src/ops_omp.cpp @@ -1,6 +1,7 @@ #include "orehov_n_jarvis_pass/omp/include/ops_omp.hpp" #include + #include #include #include @@ -24,8 +25,8 @@ bool OrehovNJarvisPassOMP::PreProcessingImpl() { } bool OrehovNJarvisPassOMP::RunImpl() { - const auto& input = GetInput(); - + const auto &input = GetInput(); + if (input.size() == 1 || input.size() == 2) { GetOutput() = input; return true; @@ -47,10 +48,10 @@ bool OrehovNJarvisPassOMP::RunImpl() { return true; } -Point OrehovNJarvisPassOMP::FindNext(Point current, const std::vector& input) const { +Point OrehovNJarvisPassOMP::FindNext(Point current, const std::vector &input) const { const size_t n = input.size(); Point initial_candidate = (current == input[0]) ? input[1] : input[0]; - + int max_threads = omp_get_max_threads(); std::vector local_bests(max_threads, initial_candidate); const int n_int = static_cast(n); @@ -99,9 +100,9 @@ double OrehovNJarvisPassOMP::CheckLeft(Point a, Point b, Point c) { return ((b.x - a.x) * (c.y - a.y)) - ((b.y - a.y) * (c.x - a.x)); } -Point OrehovNJarvisPassOMP::FindFirstElem(const std::vector& input) const { +Point OrehovNJarvisPassOMP::FindFirstElem(const std::vector &input) const { Point current = input[0]; - for (const auto& f : input) { + for (const auto &f : input) { if (f.x < current.x || (f.y < current.y && f.x == current.x)) { current = f; } @@ -119,4 +120,4 @@ bool OrehovNJarvisPassOMP::PostProcessingImpl() { return true; } -} // namespace orehov_n_jarvis_pass \ No newline at end of file +} // namespace orehov_n_jarvis_pass diff --git a/tasks/orehov_n_jarvis_pass/tests/functional/main.cpp b/tasks/orehov_n_jarvis_pass/tests/functional/main.cpp index 5408a0821..a659b603b 100644 --- a/tasks/orehov_n_jarvis_pass/tests/functional/main.cpp +++ b/tasks/orehov_n_jarvis_pass/tests/functional/main.cpp @@ -7,8 +7,8 @@ #include #include "orehov_n_jarvis_pass/common/include/common.hpp" -#include "orehov_n_jarvis_pass/seq/include/ops_seq.hpp" #include "orehov_n_jarvis_pass/omp/include/ops_omp.hpp" +#include "orehov_n_jarvis_pass/seq/include/ops_seq.hpp" #include "orehov_n_jarvis_pass/tbb/include/ops_tbb.hpp" #include "util/include/func_test_util.hpp" #include "util/include/util.hpp" diff --git a/tasks/orehov_n_jarvis_pass/tests/performance/main.cpp b/tasks/orehov_n_jarvis_pass/tests/performance/main.cpp index b2398757b..288b5e22d 100644 --- a/tasks/orehov_n_jarvis_pass/tests/performance/main.cpp +++ b/tasks/orehov_n_jarvis_pass/tests/performance/main.cpp @@ -3,8 +3,8 @@ #include #include "orehov_n_jarvis_pass/common/include/common.hpp" -#include "orehov_n_jarvis_pass/seq/include/ops_seq.hpp" #include "orehov_n_jarvis_pass/omp/include/ops_omp.hpp" +#include "orehov_n_jarvis_pass/seq/include/ops_seq.hpp" #include "orehov_n_jarvis_pass/tbb/include/ops_tbb.hpp" #include "util/include/perf_test_util.hpp" @@ -41,7 +41,9 @@ TEST_P(OrehovNJarvisPassPerfTests, RunPerfModes) { namespace { -const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks(PPC_SETTINGS_orehov_n_jarvis_pass); +const auto kAllPerfTasks = + ppc::util::MakeAllPerfTasks( + PPC_SETTINGS_orehov_n_jarvis_pass); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks);