From 68358081585b160c38443425935457235a4b9d1a Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Wed, 23 Sep 2020 19:37:50 +0300 Subject: [PATCH] Add optimal thread strategy Add an optimal thread strategy to execute specified amount of tasks. This strategy should prevent us from creating too many threads if we occasionaly have an unexpectedly small amount of tasks. Differential Revision: https://reviews.llvm.org/D87765 --- lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp | 2 +- llvm/include/llvm/Support/Threading.h | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp b/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp index 7bf4b52..0642e8a 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp @@ -73,7 +73,7 @@ void ManualDWARFIndex::Index() { // Share one thread pool across operations to avoid the overhead of // recreating the threads. - llvm::ThreadPool pool; + llvm::ThreadPool pool(llvm::optimal_concurrency(units_to_index.size())); // Create a task runner that extracts dies for each DWARF unit in a // separate thread. diff --git a/llvm/include/llvm/Support/Threading.h b/llvm/include/llvm/Support/Threading.h index 1300057..46cf8252 100644 --- a/llvm/include/llvm/Support/Threading.h +++ b/llvm/include/llvm/Support/Threading.h @@ -210,7 +210,7 @@ void llvm_execute_on_thread_async( return heavyweight_hardware_concurrency(); } - /// Returns a default thread strategy where all available hardware ressources + /// Returns a default thread strategy where all available hardware resources /// are to be used, except for those initially excluded by an affinity mask. /// This function takes affinity into consideration. Returns 1 when LLVM is /// configured with LLVM_ENABLE_THREADS=OFF. @@ -220,6 +220,16 @@ void llvm_execute_on_thread_async( return S; } + /// Returns an optimal thread strategy to execute specified amount of tasks. + /// This strategy should prevent us from creating too many threads if we + /// occasionaly have an unexpectedly small amount of tasks. + inline ThreadPoolStrategy optimal_concurrency(unsigned TaskCount = 0) { + ThreadPoolStrategy S; + S.Limit = true; + S.ThreadsRequested = TaskCount; + return S; + } + /// Return the current thread id, as used in various OS system calls. /// Note that not all platforms guarantee that the value returned will be /// unique across the entire system, so portable code should not assume -- 2.7.4