From ded5b182675e3166e947a8eb637b5b1e925816ab Mon Sep 17 00:00:00 2001 From: David Svantesson Date: Wed, 2 Aug 2023 14:23:00 +0000 Subject: 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 Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/10748 Comments-Addressed: Arm Jenkins Reviewed-by: SiCong Li Tested-by: Arm Jenkins Benchmark: Arm Jenkins --- src/runtime/Scheduler.cpp | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) (limited to 'src/runtime') 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 Scheduler::_custom_scheduler = nullptr; +#else // ARM_COMPUTE_THREAD_LOCAL_SCHEDULER +std::shared_ptr 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) -- cgit v1.2.1