diff options
author | Georgios Pinitas <georgios.pinitas@arm.com> | 2019-07-25 13:31:10 +0100 |
---|---|---|
committer | Georgios Pinitas <georgios.pinitas@arm.com> | 2019-09-09 11:22:01 +0000 |
commit | 12833d063259cb7809a97a4262f821efdc40554f (patch) | |
tree | 455333091c9eeba97079a385e0186f56076f5169 /src/runtime/Scheduler.cpp | |
parent | ed0e35bfe15bad01387504afc15b8553e585bdb9 (diff) | |
download | ComputeLibrary-12833d063259cb7809a97a4262f821efdc40554f.tar.gz |
COMPMID-2204: RuntimeContext interface for NEON functions.
This patch creates the interfaces for the runtime context for NEON.
Only the Neon backend implements the context which currently only holds
an instance of the scheduler.
The NEActivationLayer function has been updated to use the new context
interface and the corresponding validation tests ported.
Change-Id: I32e7e6aa888796dcbbfc5039b1e7f784a24f47da
Signed-off-by: Pablo Tello <pablo.tello@arm.com>
Reviewed-on: https://review.mlplatform.org/c/1851
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Michele Di Giorgio <michele.digiorgio@arm.com>
Diffstat (limited to 'src/runtime/Scheduler.cpp')
-rw-r--r-- | src/runtime/Scheduler.cpp | 107 |
1 files changed, 42 insertions, 65 deletions
diff --git a/src/runtime/Scheduler.cpp b/src/runtime/Scheduler.cpp index 8925acfa47..1af39d8122 100644 --- a/src/runtime/Scheduler.cpp +++ b/src/runtime/Scheduler.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 ARM Limited. + * Copyright (c) 2017-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -24,6 +24,8 @@ #include "arm_compute/runtime/Scheduler.h" #include "arm_compute/core/Error.h" +#include "support/ToolchainSupport.h" + #if ARM_COMPUTE_CPP_SCHEDULER #include "arm_compute/runtime/CPP/CPPScheduler.h" #endif /* ARM_COMPUTE_CPP_SCHEDULER */ @@ -46,6 +48,27 @@ Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::CPP; Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::ST; #endif /* ARM_COMPUTE_*_SCHEDULER */ +std::shared_ptr<IScheduler> Scheduler::_custom_scheduler = nullptr; + +namespace +{ +std::map<Scheduler::Type, std::unique_ptr<IScheduler>> init() +{ + std::map<Scheduler::Type, std::unique_ptr<IScheduler>> m; + m[Scheduler::Type::ST] = support::cpp14::make_unique<SingleThreadScheduler>(); +#if defined(ARM_COMPUTE_CPP_SCHEDULER) + m[Scheduler::Type::CPP] = support::cpp14::make_unique<CPPScheduler>(); +#endif // defined(ARM_COMPUTE_CPP_SCHEDULER) +#if defined(ARM_COMPUTE_OPENMP_SCHEDULER) + m[Scheduler::Type::OMP] = support::cpp14::make_unique<OMPScheduler>(); +#endif // defined(ARM_COMPUTE_OPENMP_SCHEDULER) + + return m; +} +} // namespace + +std::map<Scheduler::Type, std::unique_ptr<IScheduler>> Scheduler::_schedulers = init(); + void Scheduler::set(Type t) { ARM_COMPUTE_ERROR_ON(!Scheduler::is_available(t)); @@ -54,37 +77,13 @@ void Scheduler::set(Type t) bool Scheduler::is_available(Type t) { - switch(t) + if(t == Type::CUSTOM) { - case Type::ST: - { - return true; - } - case Type::CPP: - { -#if ARM_COMPUTE_CPP_SCHEDULER - return true; -#else /* ARM_COMPUTE_CPP_SCHEDULER */ - return false; -#endif /* ARM_COMPUTE_CPP_SCHEDULER */ - } - case Type::OMP: - { -#if ARM_COMPUTE_OPENMP_SCHEDULER - return true; -#else /* ARM_COMPUTE_OPENMP_SCHEDULER */ - return false; -#endif /* ARM_COMPUTE_OPENMP_SCHEDULER */ - } - case Type::CUSTOM: - { - return _custom_scheduler != nullptr; - } - default: - { - ARM_COMPUTE_ERROR("Invalid Scheduler type"); - return false; - } + return _custom_scheduler != nullptr; + } + else + { + return _schedulers.find(t) != _schedulers.end(); } } @@ -95,53 +94,31 @@ Scheduler::Type Scheduler::get_type() IScheduler &Scheduler::get() { - switch(_scheduler_type) + if(_scheduler_type == Type::CUSTOM) { - case Type::ST: - { - return SingleThreadScheduler::get(); - } - case Type::CPP: + if(_custom_scheduler == nullptr) { -#if ARM_COMPUTE_CPP_SCHEDULER - return CPPScheduler::get(); -#else /* ARM_COMPUTE_CPP_SCHEDULER */ - ARM_COMPUTE_ERROR("Recompile with cppthreads=1 to use C++11 scheduler."); -#endif /* ARM_COMPUTE_CPP_SCHEDULER */ - break; + ARM_COMPUTE_ERROR("No custom scheduler has been setup. Call set(std::shared_ptr<IScheduler> &scheduler) before Scheduler::get()"); } - case Type::OMP: + else { -#if ARM_COMPUTE_OPENMP_SCHEDULER - return OMPScheduler::get(); -#else /* ARM_COMPUTE_OPENMP_SCHEDULER */ - ARM_COMPUTE_ERROR("Recompile with openmp=1 to use openmp scheduler."); -#endif /* ARM_COMPUTE_OPENMP_SCHEDULER */ - break; + return *_custom_scheduler; } - case Type::CUSTOM: + } + else + { + auto it = _schedulers.find(_scheduler_type); + if(it != _schedulers.end()) { - if(_custom_scheduler == nullptr) - { - ARM_COMPUTE_ERROR("No custom scheduler has been setup. Call set(std::shared_ptr<IScheduler> &scheduler) before Scheduler::get()"); - } - else - { - return *_custom_scheduler; - } - break; + return *it->second; } - default: + else { ARM_COMPUTE_ERROR("Invalid Scheduler type"); - break; } } - return SingleThreadScheduler::get(); } -std::shared_ptr<IScheduler> Scheduler::_custom_scheduler = nullptr; - void Scheduler::set(std::shared_ptr<IScheduler> scheduler) { _custom_scheduler = std::move(scheduler); |