Radix/zml/tools/tracer.zig

99 lines
2.7 KiB
Zig

const builtin = @import("builtin");
const c = @import("c");
pub const Tracer = switch (builtin.os.tag) {
.macos => MacOsTracer,
.linux => if (@hasDecl(c, "ZML_RUNTIME_CUDA")) CudaTracer else FakeTracer,
else => FakeTracer,
};
const CudaTracer = struct {
extern fn cudaProfilerStart() c_int;
extern fn cudaProfilerStop() c_int;
extern fn nvtxMarkA(message: [*:0]const u8) void;
extern fn nvtxRangeStartA(message: [*:0]const u8) c_int;
extern fn nvtxRangeEnd(id: c_int) void;
pub fn init(name: [:0]const u8) CudaTracer {
_ = name;
_ = cudaProfilerStart();
return .{};
}
pub fn deinit(self: *const CudaTracer) void {
_ = self;
_ = cudaProfilerStop();
}
pub fn event(self: *const CudaTracer, message: [:0]const u8) void {
_ = self;
nvtxMarkA(message.ptr);
}
pub fn frameStart(self: *const CudaTracer, message: [:0]const u8) u64 {
_ = self;
return @intCast(nvtxRangeStartA(message.ptr));
}
pub fn frameEnd(self: *const CudaTracer, interval_id: u64, message: [:0]const u8) void {
_ = self;
_ = message;
nvtxRangeEnd(@intCast(interval_id));
return;
}
};
const MacOsTracer = struct {
logger: c.os_log_t,
pub fn init(name: [:0]const u8) MacOsTracer {
const logger = c.os_log_create(name.ptr, c.OS_LOG_CATEGORY_POINTS_OF_INTEREST);
return .{
.logger = logger,
};
}
pub fn event(self: *const MacOsTracer, message: [:0]const u8) void {
const interval_id = c.os_signpost_id_generate(self.logger);
c.zml_os_signpost_event(self.logger, interval_id, message);
}
pub fn frameStart(self: *const MacOsTracer, message: [:0]const u8) c.os_signpost_id_t {
const interval_id = c.os_signpost_id_generate(self.logger);
c.zml_os_signpost_interval_begin(self.logger, interval_id, message);
return interval_id;
}
pub fn frameEnd(self: *const MacOsTracer, interval_id: c.os_signpost_id_t, message: [:0]const u8) void {
c.zml_os_signpost_interval_end(self.logger, interval_id, message);
}
};
/// Mock tracer for OS which don't have an impl.
const FakeTracer = struct {
pub fn init(name: [:0]const u8) FakeTracer {
_ = name;
return .{};
}
pub fn event(self: *const FakeTracer, message: [:0]const u8) void {
_ = self;
_ = message;
return;
}
pub fn frameStart(self: *const FakeTracer, message: [:0]const u8) u64 {
_ = self;
_ = message;
return 0;
}
pub fn frameEnd(self: *const FakeTracer, interval_id: u64, message: [:0]const u8) void {
_ = self;
_ = interval_id;
_ = message;
return;
}
};