3#if GUANAQO_WITH_PERFETTO
12 static thread_local uint64_t gflop_count = 0;
17 ::perfetto::TracingInitArgs args;
18 args.backends = ::perfetto::kInProcessBackend;
20 ::perfetto::Tracing::Initialize(args);
21 guanaqo::trace::TrackEvent::Register();
24std::unique_ptr<::perfetto::TracingSession>
start_tracing(uint32_t memory_kb) {
25 ::perfetto::TraceConfig cfg;
26 cfg.add_buffers()->set_size_kb(memory_kb);
28 auto *ds_cfg = cfg.add_data_sources()->mutable_config();
29 ds_cfg->set_name(
"track_event");
31 std::unique_ptr<::perfetto::TracingSession> tracing_session =
32 ::perfetto::Tracing::NewTrace();
33 tracing_session->Setup(cfg);
34 tracing_session->StartBlocking();
35 return tracing_session;
39 std::unique_ptr<::perfetto::TracingSession> tracing_session) {
40 tracing_session->StopBlocking();
43void stop_tracing(std::unique_ptr<::perfetto::TracingSession> tracing_session,
44 const fs::path &output_path) {
45 std::ofstream output{output_path, std::ios::out | std::ios::binary};
47 throw std::runtime_error(std::format(
"Failed to open output file: {}",
48 output_path.string()));
49 std::promise<void> done;
50 tracing_session->FlushBlocking();
51 tracing_session->ReadTrace(
52 [&](::perfetto::TracingSession::ReadTraceCallbackArgs args) {
53 output.write(args.data, std::streamsize(args.size));
57 std::this_thread::sleep_for(
58 std::chrono::seconds(10));
59 tracing_session->FlushBlocking();
60 tracing_session->Stop();
61 done.get_future().wait();
62 tracing_session.reset();
65#if GUANAQO_WITH_PCM_TRACING
66#define GUANAQO_COUNT_PCM(ctr, name, track, time) \
67 TRACE_COUNTER("pcm", ::perfetto::CounterTrack(#name, track), time, \
72 auto time = TrackEvent::GetTraceTimeNs();
73 TRACE_COUNTER(
"gflops", ::perfetto::CounterTrack(
"gflops",
parent_track),
76 GUANAQO_COUNT_PCM(ctr, instructions,
parent_track, time);
82 GUANAQO_COUNT_PCM(ctr, branch_misses,
parent_track, time);
84 GUANAQO_COUNT_PCM(ctr, frontend_bound_slots,
parent_track, time);
85 GUANAQO_COUNT_PCM(ctr, backend_bound_slots,
parent_track, time);
86 GUANAQO_COUNT_PCM(ctr, bad_speculation_slots,
parent_track, time);
87 GUANAQO_COUNT_PCM(ctr, retiring_slots,
parent_track, time);
88 GUANAQO_COUNT_PCM(ctr, mem_bound_slots,
parent_track, time);
89 GUANAQO_COUNT_PCM(ctr, fetch_lat_slots,
parent_track, time);
void stop_tracing(std::unique_ptr<::perfetto::TracingSession > tracing_session, const fs::path &output_path)
Stop the tracing session and write the trace data to the specified output file.
void abort_tracing(std::unique_ptr<::perfetto::TracingSession > tracing_session)
Stop the tracing session and discard the trace data.
std::unique_ptr<::perfetto::TracingSession > start_tracing(uint32_t memory_kb=128 *1024)
Start a new tracing session with the specified buffer size in KiB.
uint64_t & get_thread_gflop_count()
Get a reference to the thread-local GFLOP counter.
void initialize_tracing()
Initialize Perfetto for in-process tracing and register guanaqo's track event categories.
PERFETTO_TRACK_EVENT_STATIC_STORAGE_IN_NAMESPACE_WITH_ATTRS(guanaqo::trace,)
Perfetto tracing macros and session helpers.
::perfetto::ThreadTrack parent_track
void trace_gflops() const