From 21ca48b9c2f51f37e892538f443544de9f580204 Mon Sep 17 00:00:00 2001 From: Michael Mandl Date: Wed, 20 Mar 2024 16:35:57 +0100 Subject: [PATCH] feat: automatically detect thread count in parallel finder --- QVectorSearch/mainwindow.cpp | 4 +--- lib_vector_search/include/parallel_finder.h | 3 +-- lib_vector_search/src/parallel_finder.cpp | 19 +++++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/QVectorSearch/mainwindow.cpp b/QVectorSearch/mainwindow.cpp index c44a8d0..8f7cdfa 100644 --- a/QVectorSearch/mainwindow.cpp +++ b/QVectorSearch/mainwindow.cpp @@ -10,7 +10,6 @@ #include "word_list_generator.h" #include -#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { @@ -70,8 +69,7 @@ void MainWindow::createSelectedFinder() { finder_ = std::make_unique(word_list_); break; case 1: - finder_ = std::make_unique( - word_list_, std::thread::hardware_concurrency()); + finder_ = std::make_unique(word_list_); break; case 2: finder_ = std::make_unique(word_list_); diff --git a/lib_vector_search/include/parallel_finder.h b/lib_vector_search/include/parallel_finder.h index 7226e0c..ad2d7e0 100644 --- a/lib_vector_search/include/parallel_finder.h +++ b/lib_vector_search/include/parallel_finder.h @@ -6,11 +6,10 @@ class ParallelFinder : public Finder { private: - const size_t thread_count_; const std::vector &word_list_; public: - ParallelFinder(const std::vector &word_list, size_t thread_count); + ParallelFinder(const std::vector &word_list); std::forward_list find_prefix(std::string_view search_term) const override; diff --git a/lib_vector_search/src/parallel_finder.cpp b/lib_vector_search/src/parallel_finder.cpp index 1ea4676..e4d5459 100644 --- a/lib_vector_search/src/parallel_finder.cpp +++ b/lib_vector_search/src/parallel_finder.cpp @@ -5,23 +5,26 @@ using std::mutex, std::thread, std::lock_guard, std::vector, std::forward_list; -ParallelFinder::ParallelFinder(const vector &word_list, - size_t thread_count) - : word_list_(word_list), thread_count_(thread_count) {} +ParallelFinder::ParallelFinder(const vector &word_list) + : word_list_(word_list) {} forward_list ParallelFinder::find_prefix(string_view search_term) const { forward_list result; mutex result_mutex; + const auto word_list_size = word_list_.size(); + + const size_t thread_count = thread::hardware_concurrency(); + vector threads; - for (size_t thread_index = 0; thread_index < thread_count_; ++thread_index) { + for (size_t thread_index = 0; thread_index < thread_count; ++thread_index) { const size_t first_word_index = - thread_index * (word_list_.size() / thread_count_); + thread_index * (word_list_size / thread_count); const size_t last_word_index = - (thread_index == thread_count_ - 1) - ? word_list_.size() - : (thread_index + 1) * (word_list_.size() / thread_count_); + (thread_index == thread_count - 1) + ? word_list_size + : (thread_index + 1) * (word_list_size / thread_count); threads.emplace_back( [](const vector &word_list, const string_view &search_term,