MUDA
Loading...
Searching...
No Matches
logger_viewer.h
1#pragma once
2#include <muda/logger/logger_basic_data.h>
3#include <muda/muda_def.h>
4#include <muda/check/check_cuda_errors.h>
5#include <muda/literal/unit.h>
6#include <muda/viewer/dense.h>
7namespace muda
8{
9class LoggerViewer;
11{
12 LoggerViewer* m_viewer = nullptr;
13 uint32_t m_log_id;
14
15 public:
16 MUDA_DEVICE LogProxy() = default;
17 MUDA_DEVICE LogProxy(LoggerViewer& viewer);
18
19 MUDA_DEVICE LogProxy(const LogProxy& other)
20 : m_viewer(other.m_viewer)
21 , m_log_id(other.m_log_id)
22 {
23 }
24
25 template <bool IsFmt>
26 MUDA_DEVICE LogProxy& push_string(const char* str);
27
28 MUDA_DEVICE LogProxy& operator<<(const char* str);
29
30#define PROXY_OPERATOR(enum_name, T) \
31 MUDA_INLINE MUDA_DEVICE friend LogProxy operator<<(LogProxy p, T v) \
32 { \
33 details::LoggerMetaData meta; \
34 meta.type = LoggerBasicType::enum_name; \
35 meta.size = sizeof(T); \
36 meta.id = p.m_log_id; \
37 p.push_data(meta, &v); \
38 return p; \
39 }
40
41 PROXY_OPERATOR(Int8, int8_t);
42 PROXY_OPERATOR(Int16, int16_t);
43 PROXY_OPERATOR(Int32, int32_t);
44 PROXY_OPERATOR(Int64, int64_t);
45
46
47 PROXY_OPERATOR(UInt8, uint8_t);
48 PROXY_OPERATOR(UInt16, uint16_t);
49 PROXY_OPERATOR(UInt32, uint32_t);
50 PROXY_OPERATOR(UInt64, uint64_t);
51
52 PROXY_OPERATOR(Float, float);
53 PROXY_OPERATOR(Double, double);
54
55#ifdef _WIN32
56 PROXY_OPERATOR(Long, long);
57 PROXY_OPERATOR(ULong, unsigned long);
58#elif __linux__
59 PROXY_OPERATOR(LongLong, long long);
60 PROXY_OPERATOR(ULongLong, unsigned long long);
61#endif
62
63#undef PROXY_OPERATOR
64
65 template <typename T>
66 MUDA_DEVICE void push_fmt_arg(const T& obj, LoggerFmtArg fmt_arg_func);
67
68 MUDA_DEVICE bool push_data(const details::LoggerMetaData& meta, const void* data);
69};
71{
72 public:
73 friend class Logger;
74 friend class LogProxy;
75
76 template <typename T>
77 MUDA_DEVICE LogProxy operator<<(const T& t);
78 MUDA_DEVICE LogProxy operator<<(const char* s);
79 template <bool IsFmt>
80 MUDA_DEVICE LogProxy push_string(const char* str);
81 MUDA_DEVICE LogProxy proxy() { return LogProxy(*this); }
82
83 MUDA_GENERIC operator bool() const
84 {
85 return m_meta_data && m_buffer && m_offset;
86 }
87
88 private:
89 // Don't use viewer, cuda don't allow to use constructor in __device__ global variable
90 // However, LoggerViewer should be able to use as a global variable for debugging
91 uint32_t* m_meta_data_id = nullptr;
92 int m_meta_data_id_size = 0;
93 details::LoggerMetaData* m_meta_data = nullptr;
94 int m_meta_data_size = 0;
95 char* m_buffer = nullptr;
96 int m_buffer_size = 0;
97 details::LoggerOffset* m_offset = nullptr;
98
99 MUDA_DEVICE uint32_t next_meta_data_idx() const;
100 MUDA_DEVICE uint32_t next_buffer_idx(uint32_t size) const;
101 MUDA_DEVICE bool push_data(details::LoggerMetaData meta, const void* data);
102};
103} // namespace muda
104
105#include <muda/logger/details/logger_viewer.inl>
Definition logger_viewer.h:11
Definition logger.h:36
Definition logger_viewer.h:71
Definition logger_basic_data.h:39
Definition logger_basic_data.h:50