diff options
author | David Svantesson <david.svantesson@arm.com> | 2023-08-02 14:23:00 +0000 |
---|---|---|
committer | David Svantesson <david.svantesson-yeung@arm.com> | 2023-11-24 15:03:05 +0000 |
commit | ded5b182675e3166e947a8eb637b5b1e925816ab (patch) | |
tree | c7bc082e7e8d80f0d33c69fc903be9dcb342e7f3 /src/runtime | |
parent | e30c8740d2da7af52ae1320f4d597ffc73d41c5e (diff) | |
download | ComputeLibrary-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.cpp | 32 |
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) |