• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017-2021 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_INSTRUMENTS
25 #define ARM_COMPUTE_TEST_INSTRUMENTS
26 
27 #if !defined(_WIN64) && !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__)
28 #include "MaliCounter.h"
29 #include "OpenCLMemoryUsage.h"
30 #include "OpenCLTimer.h"
31 #include "PMUCounter.h"
32 #endif /* !defined(_WIN64) && !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) */
33 #include "SchedulerTimer.h"
34 #include "WallClockTimer.h"
35 
36 #include <memory>
37 #include <sstream>
38 #include <string>
39 
40 namespace arm_compute
41 {
42 namespace test
43 {
44 namespace framework
45 {
46 enum class InstrumentType : unsigned int
47 {
48     ALL                     = ~0U,
49     NONE                    = 0,
50     WALL_CLOCK_TIMER        = 0x0100,
51     PMU                     = 0x0200,
52     PMU_CYCLE_COUNTER       = 0x0201,
53     PMU_INSTRUCTION_COUNTER = 0x0202,
54     MALI                    = 0x0300,
55     OPENCL_TIMER            = 0x0400,
56     SCHEDULER_TIMER         = 0x0500,
57     OPENCL_MEMORY_USAGE     = 0x0600,
58     WALL_CLOCK_TIMESTAMPS   = 0x0700,
59     OPENCL_TIMESTAMPS       = 0x0800,
60     SCHEDULER_TIMESTAMPS    = 0x0900,
61 };
62 
63 struct InstrumentsInfo
64 {
65     std::vector<ISchedulerUser *> _scheduler_users{};
66 };
67 extern std::unique_ptr<InstrumentsInfo> instruments_info;
68 
69 using InstrumentsDescription = std::pair<InstrumentType, ScaleFactor>;
70 
71 InstrumentsDescription instrument_type_from_name(const std::string &name);
72 
73 inline ::std::stringstream &operator>>(::std::stringstream &stream, InstrumentsDescription &instrument)
74 {
75     std::string value;
76     stream >> value;
77     instrument = instrument_type_from_name(value);
78     return stream;
79 }
80 
81 inline ::std::stringstream &operator<<(::std::stringstream &stream, InstrumentsDescription instrument)
82 {
83     switch(instrument.first)
84     {
85         case InstrumentType::WALL_CLOCK_TIMESTAMPS:
86             switch(instrument.second)
87             {
88                 case ScaleFactor::NONE:
89                     stream << "WALL_CLOCK_TIMESTAMPS";
90                     break;
91                 case ScaleFactor::TIME_MS:
92                     stream << "WALL_CLOCK_TIMESTAMPS_MS";
93                     break;
94                 case ScaleFactor::TIME_S:
95                     stream << "WALL_CLOCK_TIMESTAMPS_S";
96                     break;
97                 default:
98                     throw std::invalid_argument("Unsupported instrument scale");
99             }
100             break;
101         case InstrumentType::WALL_CLOCK_TIMER:
102             switch(instrument.second)
103             {
104                 case ScaleFactor::NONE:
105                     stream << "WALL_CLOCK_TIMER";
106                     break;
107                 case ScaleFactor::TIME_MS:
108                     stream << "WALL_CLOCK_TIMER_MS";
109                     break;
110                 case ScaleFactor::TIME_S:
111                     stream << "WALL_CLOCK_TIMER_S";
112                     break;
113                 default:
114                     throw std::invalid_argument("Unsupported instrument scale");
115             }
116             break;
117         case InstrumentType::SCHEDULER_TIMESTAMPS:
118             switch(instrument.second)
119             {
120                 case ScaleFactor::NONE:
121                     stream << "SCHEDULER_TIMESTAMPS";
122                     break;
123                 case ScaleFactor::TIME_MS:
124                     stream << "SCHEDULER_TIMESTAMPS_MS";
125                     break;
126                 case ScaleFactor::TIME_S:
127                     stream << "SCHEDULER_TIMESTAMPS_S";
128                     break;
129                 default:
130                     throw std::invalid_argument("Unsupported instrument scale");
131             }
132             break;
133         case InstrumentType::SCHEDULER_TIMER:
134             switch(instrument.second)
135             {
136                 case ScaleFactor::NONE:
137                     stream << "SCHEDULER_TIMER";
138                     break;
139                 case ScaleFactor::TIME_MS:
140                     stream << "SCHEDULER_TIMER_MS";
141                     break;
142                 case ScaleFactor::TIME_S:
143                     stream << "SCHEDULER_TIMER_S";
144                     break;
145                 default:
146                     throw std::invalid_argument("Unsupported instrument scale");
147             }
148             break;
149         case InstrumentType::PMU:
150             switch(instrument.second)
151             {
152                 case ScaleFactor::NONE:
153                     stream << "PMU";
154                     break;
155                 case ScaleFactor::SCALE_1K:
156                     stream << "PMU_K";
157                     break;
158                 case ScaleFactor::SCALE_1M:
159                     stream << "PMU_M";
160                     break;
161                 default:
162                     throw std::invalid_argument("Unsupported instrument scale");
163             }
164             break;
165         case InstrumentType::PMU_CYCLE_COUNTER:
166             stream << "PMU_CYCLE_COUNTER";
167             break;
168         case InstrumentType::PMU_INSTRUCTION_COUNTER:
169             stream << "PMU_INSTRUCTION_COUNTER";
170             break;
171         case InstrumentType::MALI:
172             switch(instrument.second)
173             {
174                 case ScaleFactor::NONE:
175                     stream << "MALI";
176                     break;
177                 case ScaleFactor::SCALE_1K:
178                     stream << "MALI_K";
179                     break;
180                 case ScaleFactor::SCALE_1M:
181                     stream << "MALI_M";
182                     break;
183                 default:
184                     throw std::invalid_argument("Unsupported instrument scale");
185             }
186             break;
187         case InstrumentType::OPENCL_TIMESTAMPS:
188             switch(instrument.second)
189             {
190                 case ScaleFactor::NONE:
191                     stream << "OPENCL_TIMESTAMPS";
192                     break;
193                 case ScaleFactor::TIME_US:
194                     stream << "OPENCL_TIMESTAMPS_US";
195                     break;
196                 case ScaleFactor::TIME_MS:
197                     stream << "OPENCL_TIMESTAMPS_MS";
198                     break;
199                 case ScaleFactor::TIME_S:
200                     stream << "OPENCL_TIMESTAMPS_S";
201                     break;
202                 default:
203                     throw std::invalid_argument("Unsupported instrument scale");
204             }
205             break;
206         case InstrumentType::OPENCL_TIMER:
207             switch(instrument.second)
208             {
209                 case ScaleFactor::NONE:
210                     stream << "OPENCL_TIMER";
211                     break;
212                 case ScaleFactor::TIME_US:
213                     stream << "OPENCL_TIMER_US";
214                     break;
215                 case ScaleFactor::TIME_MS:
216                     stream << "OPENCL_TIMER_MS";
217                     break;
218                 case ScaleFactor::TIME_S:
219                     stream << "OPENCL_TIMER_S";
220                     break;
221                 default:
222                     throw std::invalid_argument("Unsupported instrument scale");
223             }
224             break;
225         case InstrumentType::OPENCL_MEMORY_USAGE:
226             switch(instrument.second)
227             {
228                 case ScaleFactor::NONE:
229                     stream << "OPENCL_MEMORY_USAGE";
230                     break;
231                 case ScaleFactor::SCALE_1K:
232                     stream << "OPENCL_MEMORY_USAGE_K";
233                     break;
234                 case ScaleFactor::SCALE_1M:
235                     stream << "OPENCL_MEMORY_USAGE_M";
236                     break;
237                 default:
238                     throw std::invalid_argument("Unsupported instrument scale");
239             }
240             break;
241         case InstrumentType::ALL:
242             stream << "ALL";
243             break;
244         case InstrumentType::NONE:
245             stream << "NONE";
246             break;
247         default:
248             throw std::invalid_argument("Unsupported instrument type");
249     }
250 
251     return stream;
252 }
253 } // namespace framework
254 } // namespace test
255 } // namespace arm_compute
256 #endif /* ARM_COMPUTE_TEST_INSTRUMENTS */
257