7#include <guanaqo/export.h>
34 friend std::ostream &
operator<<(std::ostream &os, Log) {
return os; }
37 __itt_domain *domain = __itt_domain_create(
"guanaqo");
38 static constexpr int64_t max_instance_num = 255;
40 for (int64_t i = 0; i <= max_instance_num; ++i)
43 __itt_id_make(
nullptr,
static_cast<unsigned long long>(i)));
49 : domain{std::exchange(other.domain,
nullptr)} {}
54 for (int64_t i = 0; i <= max_instance_num; ++i)
57 __itt_id_make(
nullptr,
static_cast<unsigned long long>(i)));
62 ScopedLog(__itt_domain *domain, __itt_string_handle *name,
67 instance = std::clamp<int64_t>(instance, 0, max_instance_num);
68 auto id = __itt_id_make(
nullptr,
69 static_cast<unsigned long long>(instance));
70 __itt_task_begin(domain,
id, __itt_null, name);
75 : domain{std::exchange(other.domain,
nullptr)} {}
80 __itt_task_end(domain);
85 int64_t instance)
const {
89 [[nodiscard]] std::span<const Log>
get_logs()
const {
return {}; }
95#define GUANAQO_TRACE_IMPL(var_name, name, instance) \
96 static auto GUANAQO_CAT(var_name, _name) = \
97 __itt_string_handle_create(name); \
98 const auto var_name = ::guanaqo::get_trace_logger().trace( \
99 GUANAQO_CAT(var_name, _name), instance)
100#define GUANAQO_TRACE(name, instance) \
101 GUANAQO_TRACE_IMPL(GUANAQO_CAT(trace_log_, __COUNTER__), name, instance)
117 return os << std::quoted(log.name) <<
',' << log.instance <<
','
118 << log.start_time.count() <<
',' << log.duration.count()
119 <<
',' << log.thread_id <<
',' << log.flop_count;
124 return os <<
"name" <<
',' <<
"instance" <<
',' <<
"start_time" <<
','
125 <<
"duration" <<
',' <<
"thread_id" <<
',' <<
"flop_count";
128 using clock = std::chrono::steady_clock;
130 clock::time_point
t0 = clock::now();
144 :
log{std::exchange(other.log,
nullptr)},
156 int64_t flop_count = -1) {
157 size_t index =
count.fetch_add(1, std::memory_order_relaxed);
158 if (index >=
logs.size())
160 static constexpr std::hash<std::thread::id> hasher;
161 auto &log =
logs[index];
162 auto t1 = clock::now();
164 log.instance = instance;
165 log.flop_count = flop_count;
166 log.start_time = t1 -
t0;
167 log.thread_id = hasher(std::this_thread::get_id());
171 [[nodiscard]] std::span<const Log>
get_logs()
const {
172 auto n = std::min(
logs.size(),
count.load(std::memory_order_relaxed));
173 return std::span{
logs}.first(n);
179#if GUANAQO_WITH_TRACING
189#if GUANAQO_WITH_TRACING && !GUANAQO_WITH_PERFETTO
190#define GUANAQO_TRACE(name, ...) \
191 const auto GUANAQO_CAT(trace_log_, __COUNTER__) = \
192 ::guanaqo::get_trace_logger().trace(name, __VA_ARGS__)
193#define GUANAQO_TRACE_INSTANT(category, name, ...) \
195 ::guanaqo::get_trace_logger().trace(name, __VA_ARGS__)->log = nullptr; \
197#define GUANAQO_TRACE_LINALG(name, gflops) GUANAQO_TRACE(name, 0, gflops)
198#define GUANAQO_TRACE_REGION(name, instance) GUANAQO_TRACE(name, instance)
199#define GUANAQO_TRACE_STATIC_STR(s) s
202#if !GUANAQO_WITH_TRACING && !GUANAQO_WITH_ITT && !GUANAQO_WITH_PERFETTO
203#define GUANAQO_TRACE(...) GUANAQO_NOOP()
204#define GUANAQO_TRACE_INSTANT(...) GUANAQO_NOOP()
205#define GUANAQO_TRACE_LINALG(...) GUANAQO_NOOP()
206#define GUANAQO_TRACE_REGION(...) GUANAQO_NOOP()
207#define GUANAQO_TRACE_STATIC_STR(s) s
211#define GUANAQO_IF_ITT(...) __VA_ARGS__
213#define GUANAQO_IF_ITT(...)
TraceLogger & get_trace_logger()
Get a reference to the global trace logger instance.
Perfetto tracing macros and session helpers.
Token concatenation and argument-counting helpers.
Stringify and token concatenation helpers.
std::chrono::nanoseconds start_time
std::chrono::nanoseconds duration
friend std::ostream & operator<<(std::ostream &os, const Log &log)
ScopedLog(Log *log, clock::time_point start_time_point)
ScopedLog(const ScopedLog &)=delete
ScopedLog & operator=(ScopedLog &&)=delete
ScopedLog(ScopedLog &&other) noexcept
clock::time_point start_time_point
ScopedLog & operator=(const ScopedLog &)=delete
Class for recording trace logs, used when ITT or Perfetto tracing is not enabled.
TraceLogger(size_t capacity)
std::chrono::steady_clock clock
ScopedLog trace(const char *name, int64_t instance, int64_t flop_count=-1)
static std::ostream & write_column_headings(std::ostream &os)
std::span< const Log > get_logs() const