docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
statistics.h
Go to the documentation of this file.
1#pragma once
2
3#include <chrono>
4#include <cstdint>
5#include <cstdlib>
6#include <functional>
7#include <memory>
8#include <string>
9#include <unordered_map>
10#include <vector>
11
12namespace sdfg {
13namespace passes {
14
15inline constexpr const char* DOCC_STATISTICS_ENV = "DOCC_STATISTICS";
16
18 const char* val = std::getenv(DOCC_STATISTICS_ENV);
19 return val != nullptr && std::string(val) == "1";
20}
21
23
24// Generic base class for hierarchical statistics collection.
25// Captures a tree of named scopes; each scope stores an enter/exit timestamp
26// and a map of uint64 metrics (e.g. "loopCount"). The class takes over the
27// timing: enter() and exit() record the timestamps automatically.
28// Not thread-safe by design: one instance is expected to be used per thread.
30public:
31 struct Node {
32 std::string scope_type;
33 std::string name;
34 std::chrono::high_resolution_clock::time_point enter_time;
35 std::chrono::high_resolution_clock::time_point exit_time;
36 std::unordered_map<std::string, uint64_t> metrics;
37 Node* parent = nullptr;
38 std::vector<std::unique_ptr<Node>> children;
39
40 uint64_t duration_ms() const;
41 };
42
43protected:
44 std::vector<std::unique_ptr<Node>> roots_;
45 Node* current_ = nullptr;
46
48
49 static void print_node_self(std::ostream& stream, const Node& node, int depth);
50
51 void print_node(std::ostream& stream, const HierarchicalStatistics::Node& node, int depth);
52
53 virtual RemapAction custom_print_node(std::ostream& out, const Node&, int depth);
54
55 std::string report(const std::string& title);
56
57public:
58 virtual ~HierarchicalStatistics() = default;
59
60 // Open a new scope as a child of the currently active scope.
61 Node* enter_scope(const std::string& name, const std::string& scope_type);
62
63 // Close the currently active scope.
64 void exit_scope();
65
66 // Set/accumulate a metric on the currently active scope.
67 void set_metric(const std::string& key, uint64_t value);
68 void add_metric(const std::string& key, uint64_t value);
69
70 void clear();
71};
72
74public:
80
81protected:
82 static bool enabled_;
83
84 static constexpr const char* ANALYSIS_SCOPE = "Analysis";
85 static constexpr const char* ANALYSIS_MGR_SCOPE = "AnalysisMgr";
86 static constexpr const char* PASS_SCOPE = "Pass";
87 static constexpr const char* PIPELINE_SCOPE = "Pipeline";
88 static constexpr const char* STAGE_SCOPE = "Stage";
90
91public:
93 static CompileStatistics analysis_statistics;
94 return analysis_statistics;
95 }
96
97 // Static wrappers that no-op when statistics are disabled.
98 static void enter_analysis_if_enabled(const std::string& name) {
100 auto& inst = instance();
101 inst.enter_analysis(name);
102 }
103 }
104
105 void enter_analysis(const std::string& name) {
107 }
108
110 exit_scope();
111 }
112
115 auto& inst = instance();
116 inst.exit_analysis();
117 }
118 }
119
120 static void enter_pass_if_enabled(const std::string& name) {
121 if (enabled_) {
122 auto& inst = instance();
123 inst.enter_pass(name);
124 }
125 }
126
127 void enter_pass(const std::string& name) {
128 enter_scope(name, PASS_SCOPE);
129 }
130
131 static void exit_pass_if_enabled() {
132 if (enabled_) {
133 auto& inst = instance();
134 inst.exit_pass();
135 }
136 }
137
138 void exit_pass() {
139 exit_scope();
140 }
141
142 static void enter_pipeline_if_enabled(const std::string& name) {
143 if (enabled_) {
144 auto& inst = instance();
145 inst.enter_pipeline(name);
146 }
147 }
148
149 void enter_pipeline(const std::string& name) {
151 }
152
154 if (enabled_) {
155 auto& inst = instance();
156 inst.exit_pipeline();
157 }
158 }
159
161 exit_scope();
162 }
163
164 static void enter_stage_if_enabled(const std::string& name) {
165 if (enabled_) {
166 auto& inst = instance();
167 inst.enter_stage(name);
168 }
169 }
170
171 void enter_stage(const std::string& name) {
173 }
174
175 static void exit_stage_if_enabled() {
176 if (enabled_) {
177 auto& inst = instance();
178 inst.exit_stage();
179 }
180 }
181
182 void exit_stage() {
183 exit_scope();
184 }
185
186 static void set_metric_if_enabled(const std::string& key, uint64_t value) {
187 if (enabled_) {
188 auto& inst = instance();
189 inst.set_metric(key, value);
190 }
191 }
192
193 static void add_metric_if_enabled(const std::string& key, uint64_t value) {
194 if (enabled_) {
195 auto& inst = instance();
196 inst.add_metric(key, value);
197 }
198 }
199
200 static bool enabled() {
201 return enabled_;
202 }
203 static void enable() {
204 enabled_ = true;
205 }
206 static void disable() {
207 enabled_ = false;
208 }
209
210 std::string summary();
211
213
214protected:
215 RemapAction custom_print_node(std::ostream& out, const Node& node, int depth) override;
216
217 // Collapse a pipeline scope into a single level: passes are summed per name,
218 // any other scope type is aggregated into an "other" bucket per scope type.
219 static void summarize_pipeline_passes(std::ostream& out, const Node& node, int depth);
220};
221
223private:
224 bool enabled_ = false;
225 std::unordered_map<std::string, uint64_t> count_, time_;
226
227public:
229 static CodegenStatistics codegen_statistics;
230 return codegen_statistics;
231 }
232
233 bool enabled() {
234 return enabled_;
235 }
236 void enable() {
237 enabled_ = true;
238 }
239 void disable() {
240 enabled_ = false;
241 }
242
243 void add_codegen(const std::string& name, uint64_t milliseconds);
244
245 std::string summary();
246};
247
248} // namespace passes
249} // namespace sdfg
Definition statistics.h:222
void enable()
Definition statistics.h:236
static CodegenStatistics & instance()
Definition statistics.h:228
bool enabled()
Definition statistics.h:233
void add_codegen(const std::string &name, uint64_t milliseconds)
void disable()
Definition statistics.h:239
Definition statistics.h:73
static void enter_pipeline_if_enabled(const std::string &name)
Definition statistics.h:142
static void exit_analysis_if_enabled()
Definition statistics.h:113
static void enter_stage_if_enabled(const std::string &name)
Definition statistics.h:164
void exit_pipeline()
Definition statistics.h:160
void enter_stage(const std::string &name)
Definition statistics.h:171
static constexpr const char * PIPELINE_SCOPE
Definition statistics.h:87
static void exit_pipeline_if_enabled()
Definition statistics.h:153
static void enter_analysis_if_enabled(const std::string &name)
Definition statistics.h:98
static void summarize_pipeline_passes(std::ostream &out, const Node &node, int depth)
void exit_analysis()
Definition statistics.h:109
static void exit_pass_if_enabled()
Definition statistics.h:131
void exit_stage()
Definition statistics.h:182
std::string report(ReportLevel detail)
static bool enabled_
Definition statistics.h:82
static void enable()
Definition statistics.h:203
static void add_metric_if_enabled(const std::string &key, uint64_t value)
Definition statistics.h:193
void enter_pipeline(const std::string &name)
Definition statistics.h:149
RemapAction custom_print_node(std::ostream &out, const Node &node, int depth) override
static void set_metric_if_enabled(const std::string &key, uint64_t value)
Definition statistics.h:186
static constexpr const char * PASS_SCOPE
Definition statistics.h:86
static constexpr const char * STAGE_SCOPE
Definition statistics.h:88
void exit_pass()
Definition statistics.h:138
void enter_analysis(const std::string &name)
Definition statistics.h:105
static void enter_pass_if_enabled(const std::string &name)
Definition statistics.h:120
static bool enabled()
Definition statistics.h:200
static constexpr const char * ANALYSIS_MGR_SCOPE
Definition statistics.h:85
ReportLevel report_detail_
Definition statistics.h:89
static constexpr const char * ANALYSIS_SCOPE
Definition statistics.h:84
ReportLevel
Definition statistics.h:75
@ SummarizePipelineContentsAndAnalysis
Definition statistics.h:77
@ PipelineTotalsOnly
Definition statistics.h:76
void enter_pass(const std::string &name)
Definition statistics.h:127
static void exit_stage_if_enabled()
Definition statistics.h:175
static CompileStatistics & instance()
Definition statistics.h:92
static void disable()
Definition statistics.h:206
Definition statistics.h:29
virtual RemapAction custom_print_node(std::ostream &out, const Node &, int depth)
static void print_node_self(std::ostream &stream, const Node &node, int depth)
void print_node(std::ostream &stream, const HierarchicalStatistics::Node &node, int depth)
Node * current_
Definition statistics.h:45
RemapAction
Definition statistics.h:47
void set_metric(const std::string &key, uint64_t value)
std::vector< std::unique_ptr< Node > > roots_
Definition statistics.h:44
void add_metric(const std::string &key, uint64_t value)
virtual ~HierarchicalStatistics()=default
std::string report(const std::string &title)
Node * enter_scope(const std::string &name, const std::string &scope_type)
Definition local_buffer_reuse.h:24
Definition approximate_math.h:12
bool statistics_enabled_by_env()
Definition statistics.h:17
constexpr const char * DOCC_STATISTICS_ENV
Definition statistics.h:15
int statistics_mode_env()
Definition analysis.h:7
std::chrono::high_resolution_clock::time_point exit_time
Definition statistics.h:35
std::string scope_type
Definition statistics.h:32
std::string name
Definition statistics.h:33
std::chrono::high_resolution_clock::time_point enter_time
Definition statistics.h:34
Node * parent
Definition statistics.h:37
std::unordered_map< std::string, uint64_t > metrics
Definition statistics.h:36
std::vector< std::unique_ptr< Node > > children
Definition statistics.h:38