Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
chrome.cpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
20#include "shambase/string.hpp"
21#include <fstream>
22#include <iostream>
23#include <memory>
24#include <variant>
25
26u32 chrome_pid = u32_max;
27
28f64 time_offset = 0.0;
29
30void shambase::profiling::chrome::set_time_offset(f64 offset) { time_offset = offset; }
31
32void shambase::profiling::chrome::set_chrome_pid(u32 pid) { chrome_pid = pid; }
33
34namespace {
35
36 f64 to_prof_time(f64 in) { return (in - time_offset) * 1e6; };
37 f64 to_prof_delta(f64 in) { return (in) * 1e6; };
38
39 struct ChromeEvent {
40
41 struct EventStart {
42 std::string name;
43 std::string category_name;
44 f64 t_start;
45 u64 pid;
46 u64 tid;
47
48 std::string to_string() const {
49 return shambase::format(
50 "{{\"name\": \"{}\", \"cat\": \"{}\", \"ph\": \"B\", \"ts\": {}, \"pid\": {}, "
51 "\"tid\": "
52 "{}}},\n",
53 name,
54 category_name,
55 to_prof_time(t_start),
56 pid,
57 tid);
58 }
59 };
60
61 struct EventEnd {
62 std::string name;
63 std::string category_name;
64 f64 tend;
65 u64 pid;
66 u64 tid;
67
68 std::string to_string() const {
69 return shambase::format(
70 "{{\"name\": \"{}\", \"cat\": \"{}\", \"ph\": \"E\", \"ts\": {}, \"pid\": {}, "
71 "\"tid\": "
72 "{}}},\n",
73 name,
74 category_name,
75 to_prof_time(tend),
76 pid,
77 tid);
78 }
79 };
80
81 struct EventComplete {
82 std::string name;
83 std::string category_name;
84 f64 t_start;
85 f64 tend;
86 u64 pid;
87 u64 tid;
88
89 std::string to_string() const {
90 return shambase::format(
91 "{{\"name\": \"{}\", \"cat\": \"{}\", \"ph\": \"X\", \"ts\": {}, \"dur\": {}, "
92 "\"pid\": {}, "
93 "\"tid\": "
94 "{}}},\n",
95 name,
96 category_name,
97 to_prof_time(t_start),
98 to_prof_delta(tend - t_start),
99 pid,
100 tid);
101 }
102 };
103
104 struct CounterEvent {
105 std::string name;
106 f64 t;
107 f64 val;
108 u64 pid;
109
110 std::string to_string() const {
111 return shambase::format(
112 "{{ \"pid\": {}, \"ph\": \"C\", \"ts\": {}, \"args\": {{\"{}\": {:e} }} }},\n",
113 pid,
114 to_prof_time(t),
115 name,
116 val);
117 }
118 };
119
120 using var_t = std::variant<EventStart, EventEnd, EventComplete, CounterEvent>;
121 var_t var;
122
123 std::string to_string() const {
124 return std::visit(
125 [](auto &&v) {
126 return v.to_string();
127 },
128 var);
129 }
130
131 void change_pid(u64 new_pid) {
132 std::visit(
133 [&](auto &&v) {
134 v.pid = new_pid;
135 },
136 var);
137 }
138 };
139
140 struct EventStorage {
141
142 std::vector<ChromeEvent> events = {};
143 std::string filename_prefix = "shamrock_chrome_trace";
144 std::unique_ptr<std::ofstream> stream;
145
146 EventStorage(std::string filename) : filename_prefix(filename) {}
147
148 void flush_events() {
149
150 if (chrome_pid == u32_max) {
151 return;
152 }
153
154 if (!stream) {
155 std::string filename = filename_prefix + "_" + std::to_string(chrome_pid) + ".json";
156 stream = std::make_unique<std::ofstream>(filename);
157 }
158
159 for (auto &e : events) {
160 e.change_pid(chrome_pid);
161 auto event = e.to_string();
162 *stream << event;
163 }
164
165 events.clear();
166 }
167
168 void register_event(ChromeEvent event) {
169 events.push_back(event);
170 flush_events();
171 }
172
173 void register_event(ChromeEvent::EventStart event) { register_event(ChromeEvent{event}); }
174
175 void register_event(ChromeEvent::EventEnd event) { register_event(ChromeEvent{event}); }
176
177 void register_event(ChromeEvent::EventComplete event) {
178 register_event(ChromeEvent{event});
179 }
180
181 void register_event(ChromeEvent::CounterEvent event) { register_event(ChromeEvent{event}); }
182 };
183
184 auto get_prof_prefix = []() {
185 const char *val = std::getenv("SHAM_PROF_PREFIX");
186 if (val != nullptr) {
187 return std::string(val);
188 }
189 return std::string("shamrock_profile");
190 };
191
192 std::string prof_prefix = get_prof_prefix();
193 EventStorage event_storage{prof_prefix};
194
195} // namespace
196
198 const std::string &name, const std::string &category_name, f64 t_start, u64 pid, u64 tid) {
199
200 event_storage.register_event(ChromeEvent::EventStart{name, category_name, t_start, pid, tid});
201}
202
204 const std::string &name, const std::string &category_name, f64 tend, u64 pid, u64 tid) {
205 event_storage.register_event(ChromeEvent::EventEnd{name, category_name, tend, pid, tid});
206}
207
209 const std::string &name,
210 const std::string &category_name,
211 f64 t_start,
212 f64 tend,
213 u64 pid,
214 u64 tid) {
215
216 event_storage.register_event(
217 ChromeEvent::EventComplete{name, category_name, t_start, tend, pid, tid});
218}
219
221 u64 pid, u64 tid, const std::string &name) {
222 // register_event("");
223}
224
226 u64 pid, f64 t, const std::string &name, f64 val) {
227
228 event_storage.register_event(ChromeEvent::CounterEvent{name, t, val, pid});
229}
double f64
Alias for double.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
void register_event_complete(const std::string &name, const std::string &category_name, f64 t_start, f64 tend, u64 pid, u64 tid)
Register a complete event in Chrome tracing.
Definition chrome.cpp:208
void set_time_offset(f64 offset)
Set the time offset used for Chrome tracing.
Definition chrome.cpp:30
void register_counter_val(u64 pid, f64 t, const std::string &name, f64 val)
Register a counter value in Chrome tracing.
Definition chrome.cpp:225
void set_chrome_pid(u32 pid)
Set the Chrome tracing process id.
Definition chrome.cpp:32
void register_metadata_thread_name(u64 pid, u64 tid, const std::string &name)
Register a thread name in Chrome tracing.
Definition chrome.cpp:220
void register_event_end(const std::string &name, const std::string &category_name, f64 tend, u64 pid, u64 tid)
Register the end of an event in Chrome tracing.
Definition chrome.cpp:203
void register_event_start(const std::string &name, const std::string &category_name, f64 t_start, u64 pid, u64 tid)
Register the start of an event in Chrome tracing.
Definition chrome.cpp:197
constexpr u32 u32_max
u32 max value