diff --git a/tasks/telnov_a_integral_rectangle/tbb/include/ops_tbb.hpp b/tasks/telnov_a_integral_rectangle/tbb/include/ops_tbb.hpp new file mode 100644 index 000000000..72894278f --- /dev/null +++ b/tasks/telnov_a_integral_rectangle/tbb/include/ops_tbb.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "../../modules/task/include/task.hpp" +#include "telnov_a_integral_rectangle/common/include/common.hpp" + +namespace telnov_a_integral_rectangle { + +class TelnovAIntegralRectangleTBB : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kTBB; + } + explicit TelnovAIntegralRectangleTBB(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace telnov_a_integral_rectangle diff --git a/tasks/telnov_a_integral_rectangle/tbb/src/ops_tbb.cpp b/tasks/telnov_a_integral_rectangle/tbb/src/ops_tbb.cpp new file mode 100644 index 000000000..62724c756 --- /dev/null +++ b/tasks/telnov_a_integral_rectangle/tbb/src/ops_tbb.cpp @@ -0,0 +1,65 @@ +#include "telnov_a_integral_rectangle/tbb/include/ops_tbb.hpp" + +#include +#include + +#include "oneapi/tbb/blocked_range.h" +#include "oneapi/tbb/parallel_reduce.h" +#include "telnov_a_integral_rectangle/common/include/common.hpp" + +namespace telnov_a_integral_rectangle { + +TelnovAIntegralRectangleTBB::TelnovAIntegralRectangleTBB(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; + GetOutput() = 0; +} + +bool TelnovAIntegralRectangleTBB::ValidationImpl() { + return GetInput().first > 0 && GetInput().second > 0; +} + +bool TelnovAIntegralRectangleTBB::PreProcessingImpl() { + GetOutput() = 0.0; + return true; +} + +bool TelnovAIntegralRectangleTBB::RunImpl() { + const int n = GetInput().first; + const int d = GetInput().second; + + const double a = 0.0; + const double b = 1.0; + const double h = (b - a) / static_cast(n); + + const auto total_points = static_cast(std::pow(n, d)); + + const double result = + oneapi::tbb::parallel_reduce(oneapi::tbb::blocked_range(0, total_points), 0.0, + [n, d, a, h](const oneapi::tbb::blocked_range &range, double local_sum) { + for (int64_t idx = range.begin(); idx != range.end(); ++idx) { + int64_t tmp = idx; + double f_value = 0.0; + + for (int dim = 0; dim < d; ++dim) { + const int coord_index = static_cast(tmp % n); + tmp /= n; + + const double x = a + ((static_cast(coord_index) + 0.5) * h); + f_value += x; + } + + local_sum += f_value; + } + return local_sum; + }, [](double lhs, double rhs) { return lhs + rhs; }); + + GetOutput() = result * std::pow(h, d); + return true; +} + +bool TelnovAIntegralRectangleTBB::PostProcessingImpl() { + return true; +} + +} // namespace telnov_a_integral_rectangle diff --git a/tasks/telnov_a_integral_rectangle/tests/functional/main.cpp b/tasks/telnov_a_integral_rectangle/tests/functional/main.cpp index 07e5e4412..f72ab550d 100644 --- a/tasks/telnov_a_integral_rectangle/tests/functional/main.cpp +++ b/tasks/telnov_a_integral_rectangle/tests/functional/main.cpp @@ -11,6 +11,7 @@ #include "telnov_a_integral_rectangle/common/include/common.hpp" #include "telnov_a_integral_rectangle/omp/include/ops_omp.hpp" #include "telnov_a_integral_rectangle/seq/include/ops_seq.hpp" +#include "telnov_a_integral_rectangle/tbb/include/ops_tbb.hpp" #include "util/include/func_test_util.hpp" #include "util/include/util.hpp" @@ -62,7 +63,8 @@ const std::array kTestParam = { const auto kTestTasksList = std::tuple_cat( ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_telnov_a_integral_rectangle), - ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_telnov_a_integral_rectangle)); + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_telnov_a_integral_rectangle), + ppc::util::AddFuncTask(kTestParam, PPC_SETTINGS_telnov_a_integral_rectangle)); const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); diff --git a/tasks/telnov_a_integral_rectangle/tests/performance/main.cpp b/tasks/telnov_a_integral_rectangle/tests/performance/main.cpp index 6dfe78837..40dc9c1a0 100644 --- a/tasks/telnov_a_integral_rectangle/tests/performance/main.cpp +++ b/tasks/telnov_a_integral_rectangle/tests/performance/main.cpp @@ -6,6 +6,7 @@ #include "telnov_a_integral_rectangle/common/include/common.hpp" #include "telnov_a_integral_rectangle/omp/include/ops_omp.hpp" #include "telnov_a_integral_rectangle/seq/include/ops_seq.hpp" +#include "telnov_a_integral_rectangle/tbb/include/ops_tbb.hpp" #include "util/include/perf_test_util.hpp" namespace telnov_a_integral_rectangle { @@ -41,7 +42,10 @@ const auto kSeqPerfTasks = const auto kOmpPerfTasks = ppc::util::MakeAllPerfTasks(PPC_SETTINGS_telnov_a_integral_rectangle); -const auto kAllPerfTasks = std::tuple_cat(kSeqPerfTasks, kOmpPerfTasks); +const auto kTbbPerfTasks = + ppc::util::MakeAllPerfTasks(PPC_SETTINGS_telnov_a_integral_rectangle); + +const auto kAllPerfTasks = std::tuple_cat(kSeqPerfTasks, kOmpPerfTasks, kTbbPerfTasks); const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks);