Imported Upstream version 1.25.0
[platform/core/ml/nnfw.git] / tests / tools / onert_train / src / measure.h
1 /*
2  * Copyright (c) 2023 Samsung Electronics Co., Ltd. All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __ONERT_TRAIN_MEASURE_H__
18 #define __ONERT_TRAIN_MEASURE_H__
19
20 #include <algorithm>
21 #include <ctime>
22 #include <vector>
23
24 namespace
25 {
26 uint64_t nowMicros()
27 {
28   struct timespec ts;
29   clock_gettime(CLOCK_MONOTONIC, &ts);
30   return static_cast<uint64_t>(ts.tv_nsec) / 1e3 + static_cast<uint64_t>(ts.tv_sec) * 1e6;
31 }
32 } // namespace
33
34 namespace onert_train
35 {
36
37 struct Step
38 {
39   uint64_t time; // us
40   // TODO Support memory usage
41 };
42
43 class Measure
44 {
45 public:
46   Measure() = default;
47
48   void set(const int epoch, const int step)
49   {
50     _results.clear();
51     _results.resize(epoch);
52     std::for_each(_results.begin(), _results.end(), [step](auto &v) { v.resize(step); });
53   }
54
55   void run(const int epoch, const int step, const std::function<void()> &func)
56   {
57     if (_results.empty() || _results.size() <= epoch || _results[epoch].size() <= step)
58     {
59       throw std::runtime_error("Please set the number of epochs and steps first");
60     }
61
62     _results[epoch][step].time = nowMicros();
63
64     func();
65
66     _results[epoch][step].time = nowMicros() - _results[epoch][step].time;
67   }
68
69   double timeMicros(const int epoch)
70   {
71     if (_results.empty() || _results.size() <= epoch)
72     {
73       throw std::runtime_error("Invalid epoch");
74     }
75
76     double sum = 0u;
77     std::for_each(_results[epoch].begin(), _results[epoch].end(),
78                   [&sum](auto &v) { sum += v.time; });
79     return sum / _results[epoch].size();
80   }
81
82   double timeMs(const int epoch) { return timeMicros(epoch) / 1e3; }
83
84 private:
85   std::vector<std::vector<Step>> _results;
86 };
87
88 } // namespace onert_train
89
90 #endif // __ONERT_TRAIN_MEASURE_H__