xref: /aosp_15_r20/external/ComputeLibrary/tests/framework/Profiler.h (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1*c217d954SCole Faust /*
2*c217d954SCole Faust  * Copyright (c) 2017-2018,2021 Arm Limited.
3*c217d954SCole Faust  *
4*c217d954SCole Faust  * SPDX-License-Identifier: MIT
5*c217d954SCole Faust  *
6*c217d954SCole Faust  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*c217d954SCole Faust  * of this software and associated documentation files (the "Software"), to
8*c217d954SCole Faust  * deal in the Software without restriction, including without limitation the
9*c217d954SCole Faust  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*c217d954SCole Faust  * sell copies of the Software, and to permit persons to whom the Software is
11*c217d954SCole Faust  * furnished to do so, subject to the following conditions:
12*c217d954SCole Faust  *
13*c217d954SCole Faust  * The above copyright notice and this permission notice shall be included in all
14*c217d954SCole Faust  * copies or substantial portions of the Software.
15*c217d954SCole Faust  *
16*c217d954SCole Faust  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*c217d954SCole Faust  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*c217d954SCole Faust  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*c217d954SCole Faust  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*c217d954SCole Faust  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*c217d954SCole Faust  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*c217d954SCole Faust  * SOFTWARE.
23*c217d954SCole Faust  */
24*c217d954SCole Faust #ifndef ARM_COMPUTE_TEST_PROFILER
25*c217d954SCole Faust #define ARM_COMPUTE_TEST_PROFILER
26*c217d954SCole Faust 
27*c217d954SCole Faust #include "instruments/Instrument.h"
28*c217d954SCole Faust #include "instruments/Measurement.h"
29*c217d954SCole Faust 
30*c217d954SCole Faust #include <map>
31*c217d954SCole Faust #include <memory>
32*c217d954SCole Faust #include <string>
33*c217d954SCole Faust #include <vector>
34*c217d954SCole Faust 
35*c217d954SCole Faust namespace arm_compute
36*c217d954SCole Faust {
37*c217d954SCole Faust namespace test
38*c217d954SCole Faust {
39*c217d954SCole Faust namespace framework
40*c217d954SCole Faust {
41*c217d954SCole Faust /** Profiler class to collect benchmark numbers.
42*c217d954SCole Faust  *
43*c217d954SCole Faust  * A profiler manages multiple instruments that can collect different types of benchmarking numbers.
44*c217d954SCole Faust  */
45*c217d954SCole Faust class Profiler
46*c217d954SCole Faust {
47*c217d954SCole Faust public:
48*c217d954SCole Faust     /** Mapping from instrument ids to their measurements. */
49*c217d954SCole Faust     using MeasurementsMap = std::map<std::string, std::vector<Measurement>>;
50*c217d954SCole Faust 
51*c217d954SCole Faust     /** Add @p instrument to the performance monitor.
52*c217d954SCole Faust      *
53*c217d954SCole Faust      * All added instruments will be used when @ref start or @ref stop are
54*c217d954SCole Faust      * called to make measurements.
55*c217d954SCole Faust      *
56*c217d954SCole Faust      * @param[in] instrument Instrument to be used to measure performance.
57*c217d954SCole Faust      */
58*c217d954SCole Faust     void add(std::unique_ptr<Instrument> instrument);
59*c217d954SCole Faust 
60*c217d954SCole Faust     /** Call test_start() on all the added instruments
61*c217d954SCole Faust      *
62*c217d954SCole Faust      * Called before the test set up starts
63*c217d954SCole Faust      */
64*c217d954SCole Faust     void test_start();
65*c217d954SCole Faust 
66*c217d954SCole Faust     /** Call start() on all the added instruments
67*c217d954SCole Faust      *
68*c217d954SCole Faust      * Called just before the run of the test starts
69*c217d954SCole Faust      */
70*c217d954SCole Faust     void start();
71*c217d954SCole Faust 
72*c217d954SCole Faust     /** Call stop() on all the added instruments
73*c217d954SCole Faust      *
74*c217d954SCole Faust      * Called just after the run of the test ends
75*c217d954SCole Faust     */
76*c217d954SCole Faust     void stop();
77*c217d954SCole Faust 
78*c217d954SCole Faust     /** Call test_stop() on all the added instruments
79*c217d954SCole Faust      *
80*c217d954SCole Faust      * Called after the test teardown ended
81*c217d954SCole Faust      */
82*c217d954SCole Faust     void test_stop();
83*c217d954SCole Faust 
84*c217d954SCole Faust     /** Return measurements for all instruments.
85*c217d954SCole Faust      *
86*c217d954SCole Faust      * @return measurements for all instruments.
87*c217d954SCole Faust      */
88*c217d954SCole Faust     const MeasurementsMap &measurements() const;
89*c217d954SCole Faust 
90*c217d954SCole Faust     /** Return JSON formatted header data.
91*c217d954SCole Faust      *
92*c217d954SCole Faust      * @returns JSON formmated string
93*c217d954SCole Faust      */
94*c217d954SCole Faust     const std::string &header() const;
95*c217d954SCole Faust 
96*c217d954SCole Faust private:
97*c217d954SCole Faust     std::vector<std::unique_ptr<Instrument>> _instruments{};
98*c217d954SCole Faust     MeasurementsMap                          _measurements{};
99*c217d954SCole Faust     std::string                              _header_data{};
100*c217d954SCole Faust };
101*c217d954SCole Faust } // namespace framework
102*c217d954SCole Faust } // namespace test
103*c217d954SCole Faust } // namespace arm_compute
104*c217d954SCole Faust #endif /* ARM_COMPUTE_TEST_PROFILER */
105