diff --git a/tasks/pylaeva_s_inc_contrast_img_by_lsh/tbb/include/ops_tbb.hpp b/tasks/pylaeva_s_inc_contrast_img_by_lsh/tbb/include/ops_tbb.hpp new file mode 100644 index 000000000..793721f0c --- /dev/null +++ b/tasks/pylaeva_s_inc_contrast_img_by_lsh/tbb/include/ops_tbb.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "pylaeva_s_inc_contrast_img_by_lsh/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace pylaeva_s_inc_contrast_img_by_lsh { + +class PylaevaSIncContrastImgByLshTBB : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kTBB; + } + explicit PylaevaSIncContrastImgByLshTBB(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace pylaeva_s_inc_contrast_img_by_lsh diff --git a/tasks/pylaeva_s_inc_contrast_img_by_lsh/tbb/src/ops_tbb.cpp b/tasks/pylaeva_s_inc_contrast_img_by_lsh/tbb/src/ops_tbb.cpp new file mode 100644 index 000000000..d21a83be4 --- /dev/null +++ b/tasks/pylaeva_s_inc_contrast_img_by_lsh/tbb/src/ops_tbb.cpp @@ -0,0 +1,79 @@ +#include "pylaeva_s_inc_contrast_img_by_lsh/tbb/include/ops_tbb.hpp" + +#include + +#include +#include +#include +#include +#include +#include + +#include "oneapi/tbb/parallel_for.h" +#include "pylaeva_s_inc_contrast_img_by_lsh/common/include/common.hpp" + +namespace pylaeva_s_inc_contrast_img_by_lsh { + +PylaevaSIncContrastImgByLshTBB::PylaevaSIncContrastImgByLshTBB(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = {}; +} + +bool PylaevaSIncContrastImgByLshTBB::ValidationImpl() { + return !(GetInput().empty()); +} + +bool PylaevaSIncContrastImgByLshTBB::PreProcessingImpl() { + GetOutput().resize(GetInput().size()); + return true; +} + +bool PylaevaSIncContrastImgByLshTBB::RunImpl() { + const auto &input = GetInput(); + auto &output = GetOutput(); + + size_t size = input.size(); + + if (size == 0) { + return false; + } + + using MinMax = std::pair; + + auto [min_pixel, max_pixel] = tbb::parallel_reduce(tbb::blocked_range(1, size), MinMax{input[0], input[0]}, + [&](const auto &range, MinMax init) -> MinMax { + for (size_t i = range.begin(); i != range.end(); ++i) { + init.first = std::min(init.first, input[i]); + init.second = std::max(init.second, input[i]); + } + return init; + }, [](const MinMax &a, const MinMax &b) -> MinMax { + return {std::min(a.first, b.first), std::max(a.second, b.second)}; + }); + + if (min_pixel == max_pixel) { + tbb::parallel_for(tbb::blocked_range(0, size), [&](const auto &r) { + const uint8_t *src = input.data() + r.begin(); + uint8_t *dst = output.data() + r.begin(); + std::copy(src, src + r.size(), dst); + }, tbb::simple_partitioner()); + return true; + } + + const float scale = 255.0F / static_cast(max_pixel - min_pixel); + + tbb::parallel_for(tbb::blocked_range(0, size), [&](const auto &r) { + for (auto i = r.begin(); i != r.end(); ++i) { + output[i] = static_cast(std::round((input[i] - min_pixel) * scale)); + } + }, tbb::static_partitioner()); + + return true; +} + +bool PylaevaSIncContrastImgByLshTBB::PostProcessingImpl() { + return true; +} + +} // namespace pylaeva_s_inc_contrast_img_by_lsh diff --git a/tasks/pylaeva_s_inc_contrast_img_by_lsh/tests/functional/main.cpp b/tasks/pylaeva_s_inc_contrast_img_by_lsh/tests/functional/main.cpp index 0c8b1819b..321aed854 100644 --- a/tasks/pylaeva_s_inc_contrast_img_by_lsh/tests/functional/main.cpp +++ b/tasks/pylaeva_s_inc_contrast_img_by_lsh/tests/functional/main.cpp @@ -11,6 +11,7 @@ #include "pylaeva_s_inc_contrast_img_by_lsh/common/include/common.hpp" #include "pylaeva_s_inc_contrast_img_by_lsh/omp/include/ops_omp.hpp" #include "pylaeva_s_inc_contrast_img_by_lsh/seq/include/ops_seq.hpp" +#include "pylaeva_s_inc_contrast_img_by_lsh/tbb/include/ops_tbb.hpp" #include "util/include/func_test_util.hpp" #include "util/include/util.hpp" @@ -139,6 +140,8 @@ const std::array kTestParam = {std::make_tuple(kImage1, kExpected1 const auto kTestTasksList = std::tuple_cat(ppc::util::AddFuncTask( kTestParam, PPC_SETTINGS_pylaeva_s_inc_contrast_img_by_lsh), ppc::util::AddFuncTask( + kTestParam, PPC_SETTINGS_pylaeva_s_inc_contrast_img_by_lsh), + ppc::util::AddFuncTask( kTestParam, PPC_SETTINGS_pylaeva_s_inc_contrast_img_by_lsh)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); diff --git a/tasks/pylaeva_s_inc_contrast_img_by_lsh/tests/performance/main.cpp b/tasks/pylaeva_s_inc_contrast_img_by_lsh/tests/performance/main.cpp index 941084c46..545c3dd89 100644 --- a/tasks/pylaeva_s_inc_contrast_img_by_lsh/tests/performance/main.cpp +++ b/tasks/pylaeva_s_inc_contrast_img_by_lsh/tests/performance/main.cpp @@ -7,6 +7,7 @@ #include "pylaeva_s_inc_contrast_img_by_lsh/common/include/common.hpp" #include "pylaeva_s_inc_contrast_img_by_lsh/omp/include/ops_omp.hpp" #include "pylaeva_s_inc_contrast_img_by_lsh/seq/include/ops_seq.hpp" +#include "pylaeva_s_inc_contrast_img_by_lsh/tbb/include/ops_tbb.hpp" #include "util/include/perf_test_util.hpp" namespace pylaeva_s_inc_contrast_img_by_lsh { @@ -46,8 +47,8 @@ TEST_P(PylaevaSRunPerfTestThreads, RunPerfModes) { namespace { const auto kAllPerfTasks = - ppc::util::MakeAllPerfTasks( - PPC_SETTINGS_pylaeva_s_inc_contrast_img_by_lsh); + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_pylaeva_s_inc_contrast_img_by_lsh); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks);