39 template <
bool output_timestamps>
44 return "SchedulerTimestamps";
48 return "SchedulerTimer";
52 template <
bool output_timestamps>
58 std::map<std::string, SchedulerTimer::LayerData> &layers,
IScheduler &real_scheduler,
60 : _kernels(kernels), _layer_data_map(layers), _real_scheduler(real_scheduler), _timer(scale_factor), _prefix()
64 void set_num_threads(
unsigned int num_threads)
override
66 _real_scheduler.set_num_threads(num_threads);
69 void set_num_threads_with_affinity(
unsigned int num_threads, BindFunc func)
override
71 _real_scheduler.set_num_threads_with_affinity(num_threads, func);
74 unsigned int num_threads()
const override
76 return _real_scheduler.num_threads();
79 void set_prefix(
const std::string &
prefix)
84 void schedule(ICPPKernel *kernel,
const Hints &hints)
override
87 _real_scheduler.schedule(kernel, hints);
90 typename SchedulerClock<output_timestamps>::kernel_info
info;
91 info.name = kernel->name();
92 info.prefix = _prefix;
93 info.measurements = _timer.measurements();
94 _kernels.push_back(std::move(
info));
97 void schedule_op(ICPPKernel *kernel,
const Hints &hints,
const Window &window, ITensorPack &tensors)
override
100 _real_scheduler.schedule_op(kernel, hints, window, tensors);
103 typename SchedulerClock<output_timestamps>::kernel_info
info;
104 info.name = kernel->name();
105 info.prefix = _prefix;
106 info.measurements = _timer.measurements();
107 _kernels.push_back(std::move(
info));
110 void run_tagged_workloads(std::vector<Workload> &workloads,
const char *tag)
override
113 _real_scheduler.run_tagged_workloads(workloads, tag);
116 typename SchedulerClock<output_timestamps>::kernel_info
info;
117 info.name = tag !=
nullptr ? tag :
"Unknown";
118 info.prefix = _prefix;
119 info.measurements = _timer.measurements();
120 _kernels.push_back(std::move(
info));
124 void run_workloads(std::vector<Workload> &workloads)
override
131 std::list<struct SchedulerClock<output_timestamps>::kernel_info> &_kernels;
132 std::map<std::string, SchedulerTimer::LayerData> &_layer_data_map;
134 WallClock<output_timestamps> _timer;
138 template <
bool output_timestamps>
142 _real_scheduler(nullptr),
143 _real_scheduler_type(),
144 #ifdef ARM_COMPUTE_GRAPH_ENABLED
145 _real_graph_function(nullptr),
147 _scale_factor(scale_factor),
148 _interceptor(nullptr),
157 template <
bool output_timestamps>
160 #ifdef ARM_COMPUTE_GRAPH_ENABLED
166 Interceptor<output_timestamps> *scheduler =
nullptr;
167 if(
dynamic_cast<Interceptor<output_timestamps> *
>(this->_interceptor.get()) !=
nullptr)
169 scheduler = arm_compute::utils::cast::polymorphic_downcast<Interceptor<output_timestamps> *>(_interceptor.get());
170 if(task.node !=
nullptr && !task.node->name().empty())
172 scheduler->set_prefix(task.node->name() +
"/");
174 if(_layer_data_map.find(task.node->name()) == _layer_data_map.end())
177 task.node->accept(dlv);
178 _layer_data_map[task.node->name()] = dlv.
layer_data();
183 scheduler->set_prefix(
"");
187 this->_real_graph_function(task);
189 if(scheduler !=
nullptr)
191 scheduler->set_prefix(
"");
202 _interceptor = std::make_shared<Interceptor<output_timestamps>>(_kernels, _layer_data_map, *_real_scheduler, _scale_factor);
203 Scheduler::set(std::static_pointer_cast<IScheduler>(_interceptor));
204 #ifdef ARM_COMPUTE_GRAPH_ENABLED
213 if(user !=
nullptr && user->
scheduler() !=
nullptr)
215 user->intercept_scheduler(std::make_unique<Interceptor<output_timestamps>>(_kernels, _layer_data_map, *user->scheduler(), _scale_factor));
221 template <
bool output_timestamps>
227 template <
bool output_timestamps>
232 _real_scheduler =
nullptr;
233 _interceptor =
nullptr;
234 #ifdef ARM_COMPUTE_GRAPH_ENABLED
236 _real_graph_function =
nullptr;
250 template <
bool output_timestamps>
254 unsigned int kernel_number = 0;
255 for(
auto kernel : _kernels)
258 if(output_timestamps)
261 for(
auto const &m : kernel.measurements)
263 if(m.first.find(
"[start]") != std::string::npos)
265 measurements.emplace(
"[start]" +
name, m.second);
267 else if(m.first.find(
"[end]") != std::string::npos)
269 measurements.emplace(
"[end]" +
name, m.second);
279 measurements.emplace(
name, kernel.measurements.begin()->second);
286 template <
bool output_timestamps>
289 std::string output{
"" };
290 output += R
"("layer_data" : {)";
291 for(
auto i_it = _layer_data_map.cbegin(), i_end = _layer_data_map.cend(); i_it != i_end; ++i_it)
293 output +=
"\"" + i_it->first +
"\" : {";
294 if(i_it->second.size() != 0)
297 for(
auto entry_it = i_it->second.cbegin(), entry_end = i_it->second.cend(); entry_it != entry_end; ++entry_it)
299 output +=
"\"" + entry_it->first +
"\" : \"" + entry_it->second +
"\"";
300 if(std::next(entry_it) != entry_end)
307 if(std::next(i_it) != i_end)