From cd742751ed9d1d004d45a5307d60e49aee68ad0a Mon Sep 17 00:00:00 2001 From: robtor Date: Fri, 3 Nov 2023 09:03:36 +0100 Subject: [PATCH] mobile optimization --- task1/main.cpp | 11 ++++++----- task1/mergesort.h | 16 ++++++++-------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/task1/main.cpp b/task1/main.cpp index 0a01ede..72c0ee3 100644 --- a/task1/main.cpp +++ b/task1/main.cpp @@ -54,24 +54,25 @@ auto main(int argc, char *argv[]) -> int { auto dataset_seq = dataset; auto t1 = std::chrono::high_resolution_clock::now(); - algo::MergeSort_v1::sort(dataset_seq.begin(), dataset_seq.end(), [](int32_t a, int32_t b) { + algo::MergeSort_mt::sort(dataset_seq, [](int32_t a, int32_t b) { return (a > b); - }); + }, 0); auto t2 = std::chrono::high_resolution_clock::now(); auto delay_ms = std::chrono::duration_cast(t2 - t1); fmt::print("Sorted {} entries within {} ms in sequential\n", dataset_seq.size(), delay_ms.count()); - const int nthreads = std::thread::hardware_concurrency(); + //const int max_depth = std::thread::hardware_concurrency(); + const int max_depth = 4; t1 = std::chrono::high_resolution_clock::now(); algo::MergeSort_mt::sort(dataset_par, [](int32_t a, int32_t b) { return (a > b); - }, nthreads); + }, max_depth); t2 = std::chrono::high_resolution_clock::now(); delay_ms = std::chrono::duration_cast(t2 - t1); - fmt::print("Sorted {} entries within {} ms in parallel using {} threads\n", dataset_seq.size(), delay_ms.count(), nthreads); + fmt::print("Sorted {} entries within {} ms in parallel using {} threads\n", dataset_seq.size(), delay_ms.count(), max_depth); auto eq = (dataset_seq == dataset_par); fmt::print("Equality: {}\n", eq); diff --git a/task1/mergesort.h b/task1/mergesort.h index c2aa7af..b5ad3eb 100644 --- a/task1/mergesort.h +++ b/task1/mergesort.h @@ -327,7 +327,7 @@ namespace algo { } template - static auto split(std::vector data, Comparator cmp, int depth, int &num_threads, + static auto split(std::vector data, Comparator cmp, int depth, int &max_depth, std::mutex &mut) -> std::vector{ if (data.size() <= 1) { @@ -350,15 +350,15 @@ namespace algo { std::vector left(data.begin(), mid); std::vector right(mid, data.end()); - if (depth < num_threads) { - std::thread left_thread([&]() { left = split(left, cmp, depth + 1, num_threads, mut); }); - std::thread right_thread([&]() { right = split(right, cmp, depth + 1, num_threads, mut); }); + if (depth < max_depth) { + std::thread left_thread([&]() { left = split(left, cmp, depth + 1, max_depth, mut); }); + std::thread right_thread([&]() { right = split(right, cmp, depth + 1, max_depth, mut); }); left_thread.join(); right_thread.join(); } else { - left = split(left, cmp, depth + 1, num_threads, mut); - right = split(right, cmp, depth + 1, num_threads, mut); + left = split(left, cmp, depth + 1, max_depth, mut); + right = split(right, cmp, depth + 1, max_depth, mut); } return merge(left, right, cmp, mut); @@ -367,12 +367,12 @@ namespace algo { public: template static auto - sort(std::vector &data, Comparator cmp, int num_threads = std::thread::hardware_concurrency()) -> void { + sort(std::vector &data, Comparator cmp, int max_depth = 0) -> void { std::mutex local_result_lock; std::vector output; output.reserve(data.size()); - output = split(data, cmp, 0, num_threads, local_result_lock); + output = split(data, cmp, 0, max_depth, local_result_lock); data.assign(output.begin(), output.end()); } };