diff options
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); |