• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017-2020 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_INSTRUMENT
25 #define ARM_COMPUTE_TEST_INSTRUMENT
26 
27 #include "support/MemorySupport.h"
28 
29 #include "../Utils.h"
30 #include "Measurement.h"
31 
32 #include <map>
33 #include <memory>
34 #include <string>
35 
36 namespace arm_compute
37 {
38 namespace test
39 {
40 namespace framework
41 {
42 enum class ScaleFactor : unsigned int
43 {
44     NONE,     /* Default scale */
45     SCALE_1K, /* 1000          */
46     SCALE_1M, /* 1 000 000     */
47     TIME_US,  /* Microseconds  */
48     TIME_MS,  /* Milliseconds  */
49     TIME_S,   /* Seconds       */
50 };
51 /** Interface for classes that can be used to measure performance. */
52 class Instrument
53 {
54 public:
55     /** Helper function to create an instrument of the given type.
56      *
57      * @return Instance of an instrument of the given type.
58      */
59     template <typename T, ScaleFactor scale>
60     static std::unique_ptr<Instrument> make_instrument();
61 
62     /** Default constructor. */
63     Instrument() = default;
64 
65     /** Allow instances of this class to be copy constructed */
66     Instrument(const Instrument &) = default;
67     /** Allow instances of this class to be move constructed */
68     Instrument(Instrument &&) = default;
69     /** Allow instances of this class to be copied */
70     Instrument &operator=(const Instrument &) = default;
71     /** Allow instances of this class to be moved */
72     Instrument &operator=(Instrument &&) = default;
73     /** Default destructor. */
74     virtual ~Instrument() = default;
75 
76     /** Identifier for the instrument */
77     virtual std::string id() const = 0;
78 
79     /** Start of the test
80      *
81      * Called before the test set up starts
82      */
test_start()83     virtual void test_start()
84     {
85     }
86 
87     /** Start measuring.
88      *
89      * Called just before the run of the test starts
90      */
start()91     virtual void start()
92     {
93     }
94 
95     /** Stop measuring.
96      *
97      * Called just after the run of the test ends
98     */
stop()99     virtual void stop()
100     {
101     }
102 
103     /** End of the test
104      *
105      * Called after the test teardown ended
106      */
test_stop()107     virtual void test_stop()
108     {
109     }
110     /** Map of measurements */
111     using MeasurementsMap = std::map<std::string, Measurement>;
112 
113     /** Return the latest measurements.
114      *
115      * @return the latest measurements.
116      */
measurements()117     virtual MeasurementsMap measurements() const
118     {
119         return MeasurementsMap();
120     }
121 
122     /** Return the latest test measurements.
123      *
124      * @return the latest test measurements.
125      */
test_measurements()126     virtual MeasurementsMap test_measurements() const
127     {
128         return MeasurementsMap();
129     }
130 
131 protected:
132     std::string _unit{};
133 };
134 
135 template <typename T, ScaleFactor scale>
make_instrument()136 inline std::unique_ptr<Instrument> Instrument::make_instrument()
137 {
138     return support::cpp14::make_unique<T>(scale);
139 }
140 
141 } // namespace framework
142 } // namespace test
143 } // namespace arm_compute
144 #endif /* ARM_COMPUTE_TEST_INSTRUMENT */
145