aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/Scheduler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/Scheduler.cpp')
-rw-r--r--src/runtime/Scheduler.cpp107
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);