blob: 8925acfa47b3454e91b4b0b8fad34d54fe9c475b [file] [log] [blame]
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001/*
Anthony Barbiere8a49832018-01-18 10:04:05 +00002 * Copyright (c) 2017-2018 ARM Limited.
Anthony Barbier6ff3b192017-09-04 18:44:23 +01003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "arm_compute/runtime/Scheduler.h"
25
26#include "arm_compute/core/Error.h"
27#if ARM_COMPUTE_CPP_SCHEDULER
28#include "arm_compute/runtime/CPP/CPPScheduler.h"
Anthony Barbierac69aa12017-07-03 17:39:37 +010029#endif /* ARM_COMPUTE_CPP_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010030
31#include "arm_compute/runtime/SingleThreadScheduler.h"
32
33#if ARM_COMPUTE_OPENMP_SCHEDULER
34#include "arm_compute/runtime/OMP/OMPScheduler.h"
Anthony Barbierac69aa12017-07-03 17:39:37 +010035#endif /* ARM_COMPUTE_OPENMP_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010036
37using namespace arm_compute;
38
39#if !ARM_COMPUTE_CPP_SCHEDULER && ARM_COMPUTE_OPENMP_SCHEDULER
40Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::OMP;
41#elif ARM_COMPUTE_CPP_SCHEDULER && !ARM_COMPUTE_OPENMP_SCHEDULER
42Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::CPP;
43#elif ARM_COMPUTE_CPP_SCHEDULER && ARM_COMPUTE_OPENMP_SCHEDULER
44Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::CPP;
Anthony Barbierac69aa12017-07-03 17:39:37 +010045#else /* ARM_COMPUTE_*_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010046Scheduler::Type Scheduler::_scheduler_type = Scheduler::Type::ST;
Anthony Barbierac69aa12017-07-03 17:39:37 +010047#endif /* ARM_COMPUTE_*_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010048
49void Scheduler::set(Type t)
50{
51 ARM_COMPUTE_ERROR_ON(!Scheduler::is_available(t));
52 _scheduler_type = t;
53}
54
55bool Scheduler::is_available(Type t)
56{
57 switch(t)
58 {
59 case Type::ST:
60 {
61 return true;
62 }
63 case Type::CPP:
64 {
65#if ARM_COMPUTE_CPP_SCHEDULER
66 return true;
Anthony Barbierac69aa12017-07-03 17:39:37 +010067#else /* ARM_COMPUTE_CPP_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010068 return false;
Anthony Barbierac69aa12017-07-03 17:39:37 +010069#endif /* ARM_COMPUTE_CPP_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010070 }
71 case Type::OMP:
72 {
73#if ARM_COMPUTE_OPENMP_SCHEDULER
74 return true;
Anthony Barbierac69aa12017-07-03 17:39:37 +010075#else /* ARM_COMPUTE_OPENMP_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010076 return false;
Anthony Barbierac69aa12017-07-03 17:39:37 +010077#endif /* ARM_COMPUTE_OPENMP_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +010078 }
79 case Type::CUSTOM:
80 {
81 return _custom_scheduler != nullptr;
82 }
83 default:
84 {
85 ARM_COMPUTE_ERROR("Invalid Scheduler type");
86 return false;
87 }
88 }
89}
90
91Scheduler::Type Scheduler::get_type()
92{
93 return _scheduler_type;
94}
95
96IScheduler &Scheduler::get()
97{
98 switch(_scheduler_type)
99 {
100 case Type::ST:
101 {
102 return SingleThreadScheduler::get();
103 }
104 case Type::CPP:
105 {
106#if ARM_COMPUTE_CPP_SCHEDULER
107 return CPPScheduler::get();
Anthony Barbierac69aa12017-07-03 17:39:37 +0100108#else /* ARM_COMPUTE_CPP_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100109 ARM_COMPUTE_ERROR("Recompile with cppthreads=1 to use C++11 scheduler.");
Anthony Barbierac69aa12017-07-03 17:39:37 +0100110#endif /* ARM_COMPUTE_CPP_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100111 break;
112 }
113 case Type::OMP:
114 {
115#if ARM_COMPUTE_OPENMP_SCHEDULER
116 return OMPScheduler::get();
Anthony Barbierac69aa12017-07-03 17:39:37 +0100117#else /* ARM_COMPUTE_OPENMP_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100118 ARM_COMPUTE_ERROR("Recompile with openmp=1 to use openmp scheduler.");
Anthony Barbierac69aa12017-07-03 17:39:37 +0100119#endif /* ARM_COMPUTE_OPENMP_SCHEDULER */
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100120 break;
121 }
122 case Type::CUSTOM:
123 {
124 if(_custom_scheduler == nullptr)
125 {
126 ARM_COMPUTE_ERROR("No custom scheduler has been setup. Call set(std::shared_ptr<IScheduler> &scheduler) before Scheduler::get()");
127 }
128 else
129 {
130 return *_custom_scheduler;
131 }
132 break;
133 }
134 default:
135 {
136 ARM_COMPUTE_ERROR("Invalid Scheduler type");
137 break;
138 }
139 }
140 return SingleThreadScheduler::get();
141}
142
143std::shared_ptr<IScheduler> Scheduler::_custom_scheduler = nullptr;
144
Anthony Barbiere8a49832018-01-18 10:04:05 +0000145void Scheduler::set(std::shared_ptr<IScheduler> scheduler)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100146{
Anthony Barbiere8a49832018-01-18 10:04:05 +0000147 _custom_scheduler = std::move(scheduler);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100148 set(Type::CUSTOM);
149}