diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/all/include/ops_all.hpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/all/include/ops_all.hpp new file mode 100644 index 00000000..78afb65a --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/all/include/ops_all.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +class DorofeevIBitwiseSortDoubleEOBatcherMergeALL : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kALL; + } + explicit DorofeevIBitwiseSortDoubleEOBatcherMergeALL(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/all/report.md b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/all/report.md new file mode 100644 index 00000000..e69de29b diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/all/src/ops_all.cpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/all/src/ops_all.cpp new file mode 100644 index 00000000..cbdfa934 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/all/src/ops_all.cpp @@ -0,0 +1,25 @@ +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/all/include/ops_all.hpp" + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +DorofeevIBitwiseSortDoubleEOBatcherMergeALL::DorofeevIBitwiseSortDoubleEOBatcherMergeALL(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; +} + +bool DorofeevIBitwiseSortDoubleEOBatcherMergeALL::ValidationImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeALL::PreProcessingImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeALL::RunImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeALL::PostProcessingImpl() { + return true; +} + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp new file mode 100644 index 00000000..1af70c7e --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include +#include +#include + +#include "task/include/task.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +// Изменили int на std::vector +using InType = std::vector; +using OutType = std::vector; + +using TestType = std::tuple; +using BaseTask = ppc::task::Task; + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/data/pic.ppm b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/data/pic.ppm new file mode 100644 index 00000000..63762423 Binary files /dev/null and b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/data/pic.ppm differ diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/info.json b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/info.json new file mode 100644 index 00000000..ed1c2a00 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/info.json @@ -0,0 +1,9 @@ +{ + "student": { + "first_name": "Иван", + "group_number": "3823Б1ФИ1", + "last_name": "Дорофеев", + "middle_name": "Денисович", + "task_number": "1" + } +} diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/omp/include/ops_omp.hpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/omp/include/ops_omp.hpp new file mode 100644 index 00000000..840a4be0 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/omp/include/ops_omp.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +class DorofeevIBitwiseSortDoubleEOBatcherMergeOMP : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kOMP; + } + explicit DorofeevIBitwiseSortDoubleEOBatcherMergeOMP(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/omp/report.md b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/omp/report.md new file mode 100644 index 00000000..e69de29b diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/omp/src/ops_omp.cpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/omp/src/ops_omp.cpp new file mode 100644 index 00000000..ac473750 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/omp/src/ops_omp.cpp @@ -0,0 +1,25 @@ +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/omp/include/ops_omp.hpp" + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +DorofeevIBitwiseSortDoubleEOBatcherMergeOMP::DorofeevIBitwiseSortDoubleEOBatcherMergeOMP(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; +} + +bool DorofeevIBitwiseSortDoubleEOBatcherMergeOMP::ValidationImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeOMP::PreProcessingImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeOMP::RunImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeOMP::PostProcessingImpl() { + return true; +} + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/report.md b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/report.md new file mode 100644 index 00000000..e69de29b diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/include/ops_seq.hpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/include/ops_seq.hpp new file mode 100644 index 00000000..e2983fb1 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/include/ops_seq.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +class DorofeevIBitwiseSortDoubleEOBatcherMergeSEQ : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSEQ; + } + explicit DorofeevIBitwiseSortDoubleEOBatcherMergeSEQ(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; + + // Локальный вектор для сортировки + std::vector local_data_; +}; + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/report.md b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/report.md new file mode 100644 index 00000000..9c558e35 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/report.md @@ -0,0 +1 @@ +. diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/src/ops_seq.cpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/src/ops_seq.cpp new file mode 100644 index 00000000..c5611b63 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/src/ops_seq.cpp @@ -0,0 +1,152 @@ +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/include/ops_seq.hpp" + +#include +#include +#include +#include +#include +#include + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +namespace { + +uint64_t DoubleToUint(double d) { + uint64_t u = 0; + std::memcpy(&u, &d, sizeof(double)); + if ((u & 0x8000000000000000ULL) != 0) { + u = ~u; + } else { + u |= 0x8000000000000000ULL; + } + return u; +} + +double UintToDouble(uint64_t u) { + if ((u & 0x8000000000000000ULL) != 0) { + u &= ~0x8000000000000000ULL; + } else { + u = ~u; + } + double d = 0.0; + std::memcpy(&d, &u, sizeof(double)); + return d; +} + +void RadixSortDouble(std::vector &arr) { + if (arr.empty()) { + return; + } + + std::vector uarr(arr.size()); + for (size_t i = 0; i < arr.size(); ++i) { + uarr[i] = DoubleToUint(arr[i]); + } + + std::vector temp(uarr.size()); + for (size_t byte = 0; byte < 8; ++byte) { + std::vector count(256, 0); + for (uint64_t val : uarr) { + count[(val >> (byte * 8)) & 0xFF]++; + } + for (size_t i = 1; i < 256; ++i) { + count[i] += count[i - 1]; + } + for (int i = static_cast(uarr.size()) - 1; i >= 0; --i) { + temp[--count[(uarr[i] >> (byte * 8)) & 0xFF]] = uarr[i]; + } + uarr = temp; + } + + for (size_t i = 0; i < arr.size(); ++i) { + arr[i] = UintToDouble(uarr[i]); + } +} + +// Вынесли операцию сравнения и перестановки блоков в отдельную функцию +void CompareExchangeBlocks(std::vector &arr, size_t i, size_t step) { + for (size_t k = 0; k < step; ++k) { + if (arr[i + k] > arr[i + k + step]) { + std::swap(arr[i + k], arr[i + k + step]); + } + } +} + +// Теперь функция выглядит максимально просто и элегантно +void OddEvenMergeIterative(std::vector &arr, size_t n) { + if (n <= 1) { + return; + } + + // Первая фаза слияния + size_t step = n / 2; + CompareExchangeBlocks(arr, 0, step); + + // Последующие фазы + step /= 2; + for (; step > 0; step /= 2) { + for (size_t i = step; i < n - step; i += step * 2) { + CompareExchangeBlocks(arr, i, step); + } + } +} + +} // namespace + +DorofeevIBitwiseSortDoubleEOBatcherMergeSEQ::DorofeevIBitwiseSortDoubleEOBatcherMergeSEQ(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; +} + +bool DorofeevIBitwiseSortDoubleEOBatcherMergeSEQ::ValidationImpl() { + return true; +} + +bool DorofeevIBitwiseSortDoubleEOBatcherMergeSEQ::PreProcessingImpl() { + local_data_ = GetInput(); + return true; +} + +bool DorofeevIBitwiseSortDoubleEOBatcherMergeSEQ::RunImpl() { + if (local_data_.empty()) { + return true; + } + + size_t original_size = local_data_.size(); + + size_t pow2 = 1; + while (pow2 < original_size) { + pow2 *= 2; + } + + if (pow2 > original_size) { + local_data_.resize(pow2, std::numeric_limits::max()); + } + + size_t mid = pow2 / 2; + std::vector left(local_data_.begin(), local_data_.begin() + static_cast(mid)); + std::vector right(local_data_.begin() + static_cast(mid), local_data_.end()); + + RadixSortDouble(left); + RadixSortDouble(right); + + std::ranges::copy(left, local_data_.begin()); + std::ranges::copy(right, local_data_.begin() + static_cast(mid)); + + OddEvenMergeIterative(local_data_, pow2); + + if (pow2 > original_size) { + local_data_.resize(original_size); + } + + return true; +} + +bool DorofeevIBitwiseSortDoubleEOBatcherMergeSEQ::PostProcessingImpl() { + GetOutput() = local_data_; + return true; +} + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/settings.json b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/settings.json new file mode 100644 index 00000000..0be0208f --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/settings.json @@ -0,0 +1,10 @@ +{ + "tasks": { + "all": "enabled", + "omp": "enabled", + "seq": "enabled", + "stl": "enabled", + "tbb": "enabled" + }, + "tasks_type": "threads" +} diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/stl/include/ops_stl.hpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/stl/include/ops_stl.hpp new file mode 100644 index 00000000..0782ac84 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/stl/include/ops_stl.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +class DorofeevIBitwiseSortDoubleEOBatcherMergeSTL : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kSTL; + } + explicit DorofeevIBitwiseSortDoubleEOBatcherMergeSTL(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/stl/report.md b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/stl/report.md new file mode 100644 index 00000000..e69de29b diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/stl/src/ops_stl.cpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/stl/src/ops_stl.cpp new file mode 100644 index 00000000..834b0f00 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/stl/src/ops_stl.cpp @@ -0,0 +1,25 @@ +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/stl/include/ops_stl.hpp" + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +DorofeevIBitwiseSortDoubleEOBatcherMergeSTL::DorofeevIBitwiseSortDoubleEOBatcherMergeSTL(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; +} + +bool DorofeevIBitwiseSortDoubleEOBatcherMergeSTL::ValidationImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeSTL::PreProcessingImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeSTL::RunImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeSTL::PostProcessingImpl() { + return true; +} + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tbb/include/ops_tbb.hpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tbb/include/ops_tbb.hpp new file mode 100644 index 00000000..9e95dbdc --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tbb/include/ops_tbb.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" +#include "task/include/task.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +class DorofeevIBitwiseSortDoubleEOBatcherMergeTBB : public BaseTask { + public: + static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() { + return ppc::task::TypeOfTask::kTBB; + } + explicit DorofeevIBitwiseSortDoubleEOBatcherMergeTBB(const InType &in); + + private: + bool ValidationImpl() override; + bool PreProcessingImpl() override; + bool RunImpl() override; + bool PostProcessingImpl() override; +}; + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tbb/report.md b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tbb/report.md new file mode 100644 index 00000000..e69de29b diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tbb/src/ops_tbb.cpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tbb/src/ops_tbb.cpp new file mode 100644 index 00000000..05e7d187 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tbb/src/ops_tbb.cpp @@ -0,0 +1,25 @@ +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/tbb/include/ops_tbb.hpp" + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +DorofeevIBitwiseSortDoubleEOBatcherMergeTBB::DorofeevIBitwiseSortDoubleEOBatcherMergeTBB(const InType &in) { + SetTypeOfTask(GetStaticTypeOfTask()); + GetInput() = in; +} + +bool DorofeevIBitwiseSortDoubleEOBatcherMergeTBB::ValidationImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeTBB::PreProcessingImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeTBB::RunImpl() { + return true; +} +bool DorofeevIBitwiseSortDoubleEOBatcherMergeTBB::PostProcessingImpl() { + return true; +} + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tests/functional/main.cpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tests/functional/main.cpp new file mode 100644 index 00000000..a5efd78e --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tests/functional/main.cpp @@ -0,0 +1,83 @@ +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/include/ops_seq.hpp" +#include "util/include/func_test_util.hpp" +#include "util/include/util.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +class DorofeevIRunFuncTestsThreads : 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 { + TestType params = std::get(ppc::util::GTestParamIndex::kTestParams)>(GetParam()); + int size = std::get<0>(params); + + std::mt19937 gen(static_cast(size)); + std::uniform_real_distribution dist(-1000.0, 1000.0); + + input_data_.resize(size); + for (int i = 0; i < size; ++i) { + input_data_[i] = dist(gen); + } + } + + bool CheckTestOutputData(OutType &output_data) final { + // Создаем эталонный вектор и сортируем его стандартным методом + std::vector expected = input_data_; + std::ranges::sort(expected); + + // Сравниваем результат твоей таски с эталоном + return output_data == expected; + } + + InType GetTestInputData() final { + return input_data_; + } + + private: + InType input_data_; +}; + +namespace { + +TEST_P(DorofeevIRunFuncTestsThreads, TestSort) { + ExecuteTest(GetParam()); +} + +// Задаем параметры: размер массива и строковое описание для логов +const std::array kTestParam = {std::make_tuple(10, "Small_Array"), std::make_tuple(128, "Power_Of_Two"), + std::make_tuple(137, "Odd_Size"), std::make_tuple(1000, "Large_Array")}; + +const auto kTaskName = PPC_SETTINGS_dorofeev_i_bitwise_sort_double_eo_batcher_merge; + +// Собираем все реализации (ALL, OMP, SEQ, STL, TBB) в один тестовый набор +const auto kTestTasksList = + std::tuple_cat(/*ppc::util::AddFuncTask(kTestParam, kTaskName), + ppc::util::AddFuncTask(kTestParam, kTaskName),*/ + ppc::util::AddFuncTask(kTestParam, kTaskName) + /*ppc::util::AddFuncTask(kTestParam, kTaskName), + ppc::util::AddFuncTask(kTestParam, kTaskName)*/); + +const auto kGtestValues = ppc::util::ExpandToValues(kTestTasksList); + +const auto kPerfTestName = DorofeevIRunFuncTestsThreads::PrintFuncTestName; + +INSTANTIATE_TEST_SUITE_P(SortTests, DorofeevIRunFuncTestsThreads, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge diff --git a/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tests/performance/main.cpp b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tests/performance/main.cpp new file mode 100644 index 00000000..42016d00 --- /dev/null +++ b/tasks/dorofeev_i_bitwise_sort_double_eo_batcher_merge/tests/performance/main.cpp @@ -0,0 +1,62 @@ +#include + +#include +#include + +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/common/include/common.hpp" +#include "dorofeev_i_bitwise_sort_double_eo_batcher_merge/seq/include/ops_seq.hpp" +#include "util/include/perf_test_util.hpp" + +namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge { + +class DorofeevIPerfTestThreads : public ppc::util::BaseRunPerfTests { + protected: + // Вот эти две переменные, которые "потерял" редактор: + const int k_count = 100000; + InType input_data; + + void SetUp() override { + // Честный случайный сид по стандарту безопасности + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution dist(-5000.0, 5000.0); + + input_data.resize(k_count); + for (auto &val : input_data) { + val = dist(gen); + } + } + + bool CheckTestOutputData(OutType &output_data) final { + // В перф тестах достаточно проверить, что массив просто отсортирован + return std::ranges::is_sorted(output_data); + } + + InType GetTestInputData() final { + return input_data; + } +}; + +namespace { + +TEST_P(DorofeevIPerfTestThreads, RunPerfModes) { + ExecuteTest(GetParam()); +} + +const auto kAllPerfTasks = ppc::util::MakeAllPerfTasks( + PPC_SETTINGS_dorofeev_i_bitwise_sort_double_eo_batcher_merge); + +const auto kGtestValues = ppc::util::TupleToGTestValues(kAllPerfTasks); + +const auto kPerfTestName = DorofeevIPerfTestThreads::CustomPerfTestName; + +INSTANTIATE_TEST_SUITE_P(RunModeTests, DorofeevIPerfTestThreads, kGtestValues, kPerfTestName); + +} // namespace + +} // namespace dorofeev_i_bitwise_sort_double_eo_batcher_merge