38 template <
bool output_timestamps>
43 return "SchedulerTimestamps";
47 return "SchedulerTimer";
51 template <
bool output_timestamps>
57 : _kernels(kernels), _real_scheduler(real_scheduler), _timer(scale_factor), _prefix()
61 void set_num_threads(
unsigned int num_threads)
override 63 _real_scheduler.set_num_threads(num_threads);
66 void set_num_threads_with_affinity(
unsigned int num_threads, BindFunc
func)
override 68 _real_scheduler.set_num_threads_with_affinity(num_threads, func);
71 unsigned int num_threads()
const override 73 return _real_scheduler.num_threads();
76 void set_prefix(
const std::string &prefix)
81 void schedule(
ICPPKernel *kernel,
const Hints &hints)
override 84 _real_scheduler.schedule(kernel, hints);
91 _kernels.push_back(std::move(info));
97 _real_scheduler.schedule_op(kernel, hints, window, tensors);
104 _kernels.push_back(std::move(info));
107 void run_tagged_workloads(std::vector<Workload> &workloads,
const char *tag)
override 110 _real_scheduler.run_tagged_workloads(workloads, tag);
114 info.
name = tag !=
nullptr ? tag :
"Unknown";
117 _kernels.push_back(std::move(info));
121 void run_workloads(std::vector<Workload> &workloads)
override 128 std::list<struct SchedulerClock<output_timestamps>::kernel_info> &_kernels;
134 template <
bool output_timestamps>
136 : _kernels(), _real_scheduler(nullptr), _real_scheduler_type(), _real_graph_function(nullptr), _scale_factor(scale_factor), _interceptor(nullptr), _scheduler_users()
144 template <
bool output_timestamps>
152 Interceptor<output_timestamps> *scheduler =
nullptr;
153 if(
dynamic_cast<Interceptor<output_timestamps> *
>(this->_interceptor.get()) !=
nullptr)
155 scheduler = arm_compute::utils::cast::polymorphic_downcast<Interceptor<output_timestamps> *>(_interceptor.get());
156 if(task.node !=
nullptr && !task.node->name().empty())
158 scheduler->set_prefix(task.node->name() +
"/");
162 scheduler->set_prefix(
"");
166 this->_real_graph_function(task);
168 if(scheduler !=
nullptr)
170 scheduler->set_prefix(
"");
180 _interceptor = std::make_shared<Interceptor<output_timestamps>>(_kernels, *_real_scheduler, _scale_factor);
181 Scheduler::set(std::static_pointer_cast<IScheduler>(_interceptor));
189 if(user !=
nullptr && user->
scheduler() !=
nullptr)
197 template <
bool output_timestamps>
203 template <
bool output_timestamps>
208 _real_scheduler =
nullptr;
209 _interceptor =
nullptr;
211 _real_graph_function =
nullptr;
224 template <
bool output_timestamps>
228 unsigned int kernel_number = 0;
229 for(
auto kernel : _kernels)
232 if(output_timestamps)
235 for(
auto const &m : kernel.measurements)
237 if(m.first.find(
"[start]") != std::string::npos)
239 measurements.emplace(
"[start]" + name, m.second);
241 else if(m.first.find(
"[end]") != std::string::npos)
243 measurements.emplace(
"[end]" + name, m.second);
253 measurements.emplace(name, kernel.measurements.begin()->second);
virtual IScheduler * scheduler()=0
Real scheduler accessor.
#define ARM_COMPUTE_ERROR(msg)
Print the given message then throw an std::runtime_error.
Common interface for all kernels implemented in C++.
std::string to_string(T &&value)
Convert integer and float values to string.
Scheduler interface to run kernels.
Instrument::MeasurementsMap measurements
Time it took the kernel to run.
std::unique_ptr< InstrumentsInfo > instruments_info
static void set(std::shared_ptr< IScheduler > scheduler)
Sets the user defined scheduler and makes it the active scheduler.
#define ARM_COMPUTE_ERROR_ON(cond)
If the condition is true then an error message is printed and an exception thrown.
Instrument::MeasurementsMap measurements() const override
Return the latest measurements.
Implementation of an instrument to measure elapsed wall-clock time in milliseconds.
Copyright (c) 2017-2021 Arm Limited.
SchedulerClock(ScaleFactor scale_factor)
Construct a Scheduler timer.
#define ARM_COMPUTE_UNUSED(...)
To avoid unused variables warnings.
void start() override
Start measuring.
std::string id() const override
Identifier for the instrument.
virtual void restore_scheduler()=0
Restore the original scheduler.
void end(TokenStream &in, bool &valid)
static TaskExecutor & get()
Task executor accessor.
std::string name
Kernel name.
Scheduler user interface.
void for_each(F &&)
Base case of for_each.
void test_stop() override
End of the test.
ScaleKernelInfo info(interpolation_policy, default_border_mode, PixelValue(), sampling_policy, false)
std::string prefix
Kernel prefix.
static Type get_type()
Returns the type of the active scheduler.
std::map< std::string, Measurement > MeasurementsMap
Map of measurements.
void test_start() override
Start of the test.
virtual void intercept_scheduler(std::unique_ptr< IScheduler > interceptor)=0
Intercept the scheduler used by.
Describe a multidimensional execution window.
virtual const char * name() const =0
Name of the kernel.
std::function< decltype(execute_task)> execute_function
Function that is responsible for executing tasks.
Instrument creating measurements based on the information returned by clGetEventProfilingInfo for eac...
static IScheduler & get()
Access the scheduler singleton.