Compute Library
 21.05
SchedulerTimer.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-2019 Arm Limited.
3  *
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 #ifndef ARM_COMPUTE_TEST_SCHEDULER_TIMER
25 #define ARM_COMPUTE_TEST_SCHEDULER_TIMER
26 
27 #include "Instrument.h"
30 
31 #include <list>
32 #include <memory>
33 #include <vector>
34 
35 namespace arm_compute
36 {
37 namespace test
38 {
39 namespace framework
40 {
41 /** Scheduler user interface */
43 {
44 public:
45  /** Default Destructor */
46  virtual ~ISchedulerUser() = default;
47  /** Intercept the scheduler used by
48  *
49  * @param interceptor Intercept the scheduler used by the scheduler user.
50  */
51  virtual void intercept_scheduler(std::unique_ptr<IScheduler> interceptor) = 0;
52  /** Restore the original scheduler */
53  virtual void restore_scheduler() = 0;
54  /** Real scheduler accessor
55  *
56  * @return The real scheduler
57  */
58  virtual IScheduler *scheduler() = 0;
59 };
60 
61 /** Instrument creating measurements based on the information returned by clGetEventProfilingInfo for each OpenCL kernel executed*/
62 template <bool output_timestamps>
63 class SchedulerClock : public Instrument
64 {
65 public:
66  /** Construct a Scheduler timer.
67  *
68  * @param[in] scale_factor Measurement scale factor.
69  */
70  SchedulerClock(ScaleFactor scale_factor);
71  /** Prevent instances of this class from being copy constructed */
72  SchedulerClock(const SchedulerClock &) = delete;
73  /** Prevent instances of this class from being copied */
74  SchedulerClock &operator=(const SchedulerClock &) = delete;
75  /** Use the default move assignment operator */
77  /** Use the default move constructor */
78  SchedulerClock(SchedulerClock &&) = default;
79  /** Use the default destructor */
80  ~SchedulerClock() = default;
81 
82  // Inherited overridden methods
83  std::string id() const override;
84  void test_start() override;
85  void start() override;
86  void test_stop() override;
88 
89  /** Kernel information */
90  struct kernel_info
91  {
92  Instrument::MeasurementsMap measurements{}; /**< Time it took the kernel to run */
93  std::string name{}; /**< Kernel name */
94  std::string prefix{}; /**< Kernel prefix */
95  };
96 
97 private:
98  std::list<kernel_info> _kernels;
99  IScheduler *_real_scheduler;
100  Scheduler::Type _real_scheduler_type;
101  std::function<decltype(graph::execute_task)> _real_graph_function;
102  ScaleFactor _scale_factor;
103  std::shared_ptr<IScheduler> _interceptor;
104  std::vector<ISchedulerUser *> _scheduler_users;
105 };
106 
109 
110 } // namespace framework
111 } // namespace test
112 } // namespace arm_compute
113 #endif /* ARM_COMPUTE_TEST_SCHEDULER_TIMER */
SchedulerClock & operator=(const SchedulerClock &)=delete
Prevent instances of this class from being copied.
virtual IScheduler * scheduler()=0
Real scheduler accessor.
Type
Scheduler type.
Definition: Scheduler.h:39
Scheduler interface to run kernels.
Definition: IScheduler.h:41
Instrument::MeasurementsMap measurements
Time it took the kernel to run.
Instrument::MeasurementsMap measurements() const override
Return the latest measurements.
Copyright (c) 2017-2021 Arm Limited.
SchedulerClock(ScaleFactor scale_factor)
Construct a Scheduler timer.
void start() override
Start measuring.
std::string id() const override
Identifier for the instrument.
void execute_task(ExecutionTask &task)
Definition: Workload.cpp:41
virtual void restore_scheduler()=0
Restore the original scheduler.
~SchedulerClock()=default
Use the default destructor.
void test_stop() override
End of the test.
Interface for classes that can be used to measure performance.
Definition: Instrument.h:50
std::map< std::string, Measurement > MeasurementsMap
Map of measurements.
Definition: Instrument.h:109
virtual ~ISchedulerUser()=default
Default Destructor.
void test_start() override
Start of the test.
virtual void intercept_scheduler(std::unique_ptr< IScheduler > interceptor)=0
Intercept the scheduler used by.
Instrument creating measurements based on the information returned by clGetEventProfilingInfo for eac...