nvtx.hpp
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION.
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 #pragma once
6 
7 #include <cstdint>
8 
9 #include <nvtx3/nvtx3.hpp>
10 
11 #include <kvikio/shim/cuda.hpp>
12 #include <kvikio/utils.hpp>
13 
14 namespace kvikio {
15 
20  static constexpr char const* name{"libkvikio"};
21 };
22 
23 using nvtx_scoped_range_type = nvtx3::scoped_range_in<libkvikio_domain>;
24 using nvtx_registered_string_type = nvtx3::registered_string_in<libkvikio_domain>;
25 
26 // Macro to concatenate two tokens x and y.
27 #define KVIKIO_CONCAT_HELPER(x, y) x##y
28 #define KVIKIO_CONCAT(x, y) KVIKIO_CONCAT_HELPER(x, y)
29 
30 // Macro to create a static, registered string that will not have a name conflict with any
31 // registered string defined in the same scope.
32 #define KVIKIO_REGISTER_STRING(message) \
33  [](const char* a_message) -> auto& { \
34  static kvikio::nvtx_registered_string_type a_reg_str{a_message}; \
35  return a_reg_str; \
36  }(message)
37 
38 // Implementation of KVIKIO_NVTX_FUNC_RANGE()
39 // todo: Although supported by many compilers, __PRETTY_FUNCTION__ is non-standard. Replacement may
40 // be considered once reflection is standardized.
41 #define KVIKIO_NVTX_FUNC_RANGE_IMPL_0() KVIKIO_NVTX_SCOPED_RANGE_IMPL_1(__PRETTY_FUNCTION__)
42 #define KVIKIO_NVTX_FUNC_RANGE_IMPL_1(payload) \
43  KVIKIO_NVTX_SCOPED_RANGE_IMPL_2(__PRETTY_FUNCTION__, payload)
44 #define KVIKIO_NVTX_FUNC_RANGE_IMPL_2(payload, color) \
45  KVIKIO_NVTX_SCOPED_RANGE_IMPL_3(__PRETTY_FUNCTION__, payload, color)
46 #define KVIKIO_NVTX_FUNC_RANGE_SELECTOR(_0, _1, _2, NAME, ...) NAME
47 // todo: Although supported by gcc and clang, ##__VA_ARGS__ is non-standard, and should be replaced
48 // by __VA_OPT__ (since C++20) in the future.
49 #define KVIKIO_NVTX_FUNC_RANGE_IMPL(...) \
50  KVIKIO_NVTX_FUNC_RANGE_SELECTOR(_0, \
51  ##__VA_ARGS__, \
52  KVIKIO_NVTX_FUNC_RANGE_IMPL_2, \
53  KVIKIO_NVTX_FUNC_RANGE_IMPL_1, \
54  KVIKIO_NVTX_FUNC_RANGE_IMPL_0) \
55  (__VA_ARGS__)
56 
57 // Implementation of KVIKIO_NVTX_SCOPED_RANGE(...)
58 #define KVIKIO_NVTX_SCOPED_RANGE_IMPL_1(message) \
59  kvikio::nvtx_scoped_range_type KVIKIO_CONCAT(_kvikio_nvtx_range, __LINE__) \
60  { \
61  nvtx3::event_attributes \
62  { \
63  KVIKIO_REGISTER_STRING(message), kvikio::NvtxManager::default_color() \
64  } \
65  }
66 #define KVIKIO_NVTX_SCOPED_RANGE_IMPL_3(message, payload_v, color) \
67  kvikio::nvtx_scoped_range_type KVIKIO_CONCAT(_kvikio_nvtx_range, __LINE__) \
68  { \
69  nvtx3::event_attributes \
70  { \
71  KVIKIO_REGISTER_STRING(message), nvtx3::payload{kvikio::convert_to_64bit(payload_v)}, color \
72  } \
73  }
74 #define KVIKIO_NVTX_SCOPED_RANGE_IMPL_2(message, payload) \
75  KVIKIO_NVTX_SCOPED_RANGE_IMPL_3(message, payload, kvikio::NvtxManager::default_color())
76 #define KVIKIO_NVTX_SCOPED_RANGE_SELECTOR(_1, _2, _3, NAME, ...) NAME
77 #define KVIKIO_NVTX_SCOPED_RANGE_IMPL(...) \
78  KVIKIO_NVTX_SCOPED_RANGE_SELECTOR(__VA_ARGS__, \
79  KVIKIO_NVTX_SCOPED_RANGE_IMPL_3, \
80  KVIKIO_NVTX_SCOPED_RANGE_IMPL_2, \
81  KVIKIO_NVTX_SCOPED_RANGE_IMPL_1) \
82  (__VA_ARGS__)
83 
84 // Implementation of KVIKIO_NVTX_MARKER(message, payload)
85 #define KVIKIO_NVTX_MARKER_IMPL(message, payload_v) \
86  nvtx3::mark_in<kvikio::libkvikio_domain>(nvtx3::event_attributes{ \
87  KVIKIO_REGISTER_STRING(message), nvtx3::payload{kvikio::convert_to_64bit(payload_v)}})
88 
89 using nvtx_color_type = nvtx3::color;
90 
94 class NvtxManager {
95  public:
96  static NvtxManager& instance() noexcept;
97 
103  static const nvtx_color_type& default_color() noexcept;
104 
113  static const nvtx_color_type& get_color_by_index(std::uint64_t idx) noexcept;
114 
121  static void rename_current_thread(std::string_view new_name) noexcept;
122 
123  NvtxManager(NvtxManager const&) = delete;
124  NvtxManager& operator=(NvtxManager const&) = delete;
125  NvtxManager(NvtxManager&&) = delete;
126  NvtxManager& operator=(NvtxManager&&) = delete;
127 
128  private:
129  NvtxManager() = default;
130 };
131 
164 #define KVIKIO_NVTX_FUNC_RANGE(...) KVIKIO_NVTX_FUNC_RANGE_IMPL(__VA_ARGS__)
165 
183 #define KVIKIO_NVTX_SCOPED_RANGE(...) KVIKIO_NVTX_SCOPED_RANGE_IMPL(__VA_ARGS__)
184 
203 #define KVIKIO_NVTX_MARKER(message, payload) KVIKIO_NVTX_MARKER_IMPL(message, payload)
204 
205 } // namespace kvikio
Utility singleton class for NVTX annotation.
Definition: nvtx.hpp:94
static void rename_current_thread(std::string_view new_name) noexcept
Rename the current thread under the KvikIO NVTX domain.
static const nvtx_color_type & get_color_by_index(std::uint64_t idx) noexcept
Return the color at the given index from the internal color palette whose size n is a power of 2....
static const nvtx_color_type & default_color() noexcept
Return the default color.
KvikIO namespace.
Definition: batch.hpp:16
Tag type for libkvikio's NVTX domain.
Definition: nvtx.hpp:19