aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorDavid Svantesson <david.svantesson@arm.com>2023-08-02 14:23:00 +0000
committerDavid Svantesson <david.svantesson-yeung@arm.com>2023-11-24 15:03:05 +0000
commitded5b182675e3166e947a8eb637b5b1e925816ab (patch)
treec7bc082e7e8d80f0d33c69fc903be9dcb342e7f3 /src/runtime
parente30c8740d2da7af52ae1320f4d597ffc73d41c5e (diff)
downloadComputeLibrary-ded5b182675e3166e947a8eb637b5b1e925816ab.tar.gz
thread_local _custom_scheduler
Resolves ONCPUML-1331 This patch adds an option to make _custom_scheduler thread_local to support usage of multiple schedulers handled outside of ACL. It also adds num_threads() function to Scheduler which reverts to querying CPUInfo if no scheduler has been set. Change-Id: Iff706165d8d091895331a5bb3a76f6cabe048912 Signed-off-by: David Svantesson-Yeung <david.svantesson-yeung@arm.com> Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/10748 Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: SiCong Li <sicong.li@arm.com> Tested-by: Arm Jenkins <bsgcomp@arm.com> Benchmark: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/Scheduler.cpp32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/runtime/Scheduler.cpp b/src/runtime/Scheduler.cpp
index e52fb59940..6d961f29a5 100644
--- a/src/runtime/Scheduler.cpp
+++ b/src/runtime/Scheduler.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2020 Arm Limited.
+* Copyright (c) 2017-2020, 2023 Arm Limited.
*
* SPDX-License-Identifier: MIT
*
@@ -40,14 +40,18 @@ using namespace arm_compute;
#if !ARM_COMPUTE_CPP_SCHEDULER && ARM_COMPUTE_OPENMP_SCHEDULER
Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::OMP;
#elif ARM_COMPUTE_CPP_SCHEDULER && !ARM_COMPUTE_OPENMP_SCHEDULER
-Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::CPP;
+Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::CPP;
#elif ARM_COMPUTE_CPP_SCHEDULER && ARM_COMPUTE_OPENMP_SCHEDULER
Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::CPP;
#else /* ARM_COMPUTE_*_SCHEDULER */
Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::ST;
#endif /* ARM_COMPUTE_*_SCHEDULER */
+#ifndef ARM_COMPUTE_THREAD_LOCAL_SCHEDULER
std::shared_ptr<IScheduler> Scheduler::_custom_scheduler = nullptr;
+#else // ARM_COMPUTE_THREAD_LOCAL_SCHEDULER
+std::shared_ptr<IScheduler> thread_local Scheduler::_custom_scheduler = nullptr;
+#endif // ARM_COMPUTE_THREAD_LOCAL_SCHEDULER
namespace
{
@@ -74,6 +78,30 @@ void Scheduler::set(Type t)
_scheduler_type = t;
}
+bool Scheduler::is_set()
+{
+ if (_scheduler_type == Type::CUSTOM)
+ {
+ return _custom_scheduler != nullptr;
+ }
+ else
+ {
+ return !_schedulers.empty();
+ }
+}
+
+unsigned int Scheduler::num_threads()
+{
+ if (Scheduler::is_set())
+ {
+ return Scheduler::get().num_threads();
+ }
+ else
+ {
+ return CPUInfo::get().get_cpu_num();
+ }
+}
+
bool Scheduler::is_available(Type t)
{
if (t == Type::CUSTOM)