20 #ifndef HEDGEHOG_NVTX_PROFILER_H 21 #define HEDGEHOG_NVTX_PROFILER_H 24 #include <nvtx3/nvToolsExt.h> 27 #include <string_view> 33 #define NVTX_COLOR_INITIALIZING 0xFF123456 34 #define NVTX_COLOR_EXECUTING 0xFF72ff68 35 #define NVTX_COLOR_WAITING 0xFFff7f83 36 #define NVTX_COLOR_WAITING_FOR_MEM 0xFFffc86a 37 #define NVTX_COLOR_RELEASE_MEM 0xFF7fbdff 38 #define NVTX_COLOR_SHUTTING_DOWN 0xFF654321 60 std::string_view initializeName_{};
61 std::string_view executeName_{};
62 std::string_view waitName_{};
63 std::string_view waitForMemName_{};
64 std::string_view releaseMemName_{};
65 std::string_view shutdownName_{};
67 nvtxDomainHandle_t taskDomain_;
69 nvtxStringHandle_t initializeString_{};
70 nvtxStringHandle_t executeString_{};
71 nvtxStringHandle_t waitString_{};
72 nvtxStringHandle_t waitForMemString_{};
73 nvtxStringHandle_t releaseMemString_{};
74 nvtxStringHandle_t shutdownString_{};
76 nvtxEventAttributes_t *initializeAttrib_;
77 nvtxEventAttributes_t *executeAttrib_;
78 nvtxEventAttributes_t *waitAttrib_;
79 nvtxEventAttributes_t *waitForMemAttrib_;
80 nvtxEventAttributes_t *releaseMemAttrib_;
81 nvtxEventAttributes_t *shutdownAttrib_;
83 nvtxRangeId_t initializeRangeId_ = 0;
84 nvtxRangeId_t executeRangeId_ = 0;
85 nvtxRangeId_t waitRangeId_ = 0;
86 nvtxRangeId_t waitForMemRangeId_ = 0;
87 nvtxRangeId_t shutdownRangeId_ = 0;
92 nvtxEventAttributes_t *createEventAttribute(uint32_t color) {
93 nvtxEventAttributes_t *
event =
new nvtxEventAttributes_t;
94 bzero(event, NVTX_EVENT_ATTRIB_STRUCT_SIZE);
95 event->version = NVTX_VERSION;
96 event->size = NVTX_EVENT_ATTRIB_STRUCT_SIZE;
97 event->colorType = NVTX_COLOR_ARGB;
110 explicit NvtxProfiler(std::string_view
const & taskName) {
115 taskDomain_ = nvtxDomainCreateA(taskName.data());
117 initializeAttrib_ = createEventAttribute(NVTX_COLOR_INITIALIZING);
118 executeAttrib_ = createEventAttribute(NVTX_COLOR_EXECUTING);
120 waitAttrib_ = createEventAttribute(NVTX_COLOR_WAITING);
121 waitAttrib_->payloadType = NVTX_PAYLOAD_TYPE_UNSIGNED_INT64;
123 waitAttrib_->payload.ullValue = 0;
125 waitForMemAttrib_ = createEventAttribute(NVTX_COLOR_WAITING_FOR_MEM);
126 releaseMemAttrib_ = createEventAttribute(NVTX_COLOR_RELEASE_MEM);
127 shutdownAttrib_ = createEventAttribute(NVTX_COLOR_SHUTTING_DOWN);
139 delete initializeAttrib_;
140 delete executeAttrib_;
142 delete waitForMemAttrib_;
143 delete releaseMemAttrib_;
144 delete shutdownAttrib_;
145 nvtxDomainDestroy(taskDomain_);
157 std::string prefixName(std::to_string(threadId));
158 initializeName_ = prefixName +
":Initializing";
159 executeName_ = prefixName +
":Executing";
160 waitName_ = prefixName +
":Waiting";
161 waitForMemName_ = prefixName +
":MemWait";
162 releaseMemName_ = prefixName +
":Release";
163 shutdownName_ = prefixName +
":Shutdown";
165 initializeString_ = nvtxDomainRegisterStringA(taskDomain_, initializeName_.data());
166 executeString_ = nvtxDomainRegisterStringA(taskDomain_, executeName_.data());
167 waitString_ = nvtxDomainRegisterStringA(taskDomain_, waitName_.data());
168 waitForMemString_ = nvtxDomainRegisterStringA(taskDomain_, waitForMemName_.data());
169 releaseMemString_ = nvtxDomainRegisterStringA(taskDomain_, releaseMemName_.data());
170 shutdownString_ = nvtxDomainRegisterStringA(taskDomain_, shutdownName_.data());
172 initializeAttrib_->messageType = NVTX_MESSAGE_TYPE_REGISTERED;
173 initializeAttrib_->message.registered = initializeString_;
175 executeAttrib_->messageType = NVTX_MESSAGE_TYPE_REGISTERED;
176 executeAttrib_->message.registered = executeString_;
178 waitAttrib_->messageType = NVTX_MESSAGE_TYPE_REGISTERED;
179 waitAttrib_->message.registered = waitString_;
181 waitForMemAttrib_->messageType = NVTX_MESSAGE_TYPE_REGISTERED;
182 waitForMemAttrib_->message.registered = waitForMemString_;
184 releaseMemAttrib_->messageType = NVTX_MESSAGE_TYPE_REGISTERED;
185 releaseMemAttrib_->message.registered = releaseMemString_;
187 shutdownAttrib_->messageType = NVTX_MESSAGE_TYPE_REGISTERED;
188 shutdownAttrib_->message.registered = shutdownString_;
195 nvtxDomainMarkEx(taskDomain_, releaseMemAttrib_);
202 initializeRangeId_ = nvtxDomainRangeStartEx(taskDomain_, initializeAttrib_);
209 executeRangeId_ = nvtxDomainRangeStartEx(taskDomain_, executeAttrib_);
218 waitAttrib_->payload.ullValue = queueSize;
219 waitRangeId_ = nvtxDomainRangeStartEx(taskDomain_, waitAttrib_);
227 waitForMemRangeId_ = nvtxDomainRangeStartEx(taskDomain_, waitForMemAttrib_);
234 shutdownRangeId_ = nvtxDomainRangeStartEx(taskDomain_, shutdownAttrib_);
241 nvtxDomainRangeEnd(taskDomain_, initializeRangeId_);
248 nvtxDomainRangeEnd(taskDomain_, executeRangeId_);
255 nvtxDomainRangeEnd(taskDomain_, waitRangeId_);
262 nvtxDomainRangeEnd(taskDomain_, waitForMemRangeId_);
269 nvtxDomainRangeEnd(taskDomain_, shutdownRangeId_);
277 nvtxDomainHandle_t taskDomain()
const {
284 #endif //HEDGEHOG_NVTX_PROFILER_H A class to wrap calls to the NVTX library for tracking events that occur within an Hedgehog task grap...
void startRangeWaiting([[maybe_unused]]uint64_t const &queueSize)
Starts tracking execution in the timeline to show when the task has started waiting for data...
void startRangeWaitingForMemory()
Starts tracking waiting for memory in the timeline to show when the task has started waiting for memo...
void endRangeWaiting()
Ends tracking the waiting for data for a task.
NvtxProfiler()=delete
Deleted default constructor.
void initialize([[maybe_unused]]int threadId)
Initializes the NvtxProfiler, and adds the threadId that is associated with the task.
void startRangeExecuting()
Starts tracking execution in the timeline to show when the task has started executing on data...
void endRangeWaitingForMem()
Ends tracking the waiting for memory from a memory edge.
void startRangeInitializing()
Starts tracking intialization in the timeline to show when the task has started its initialization ph...
void endRangeShuttingDown()
Ends tracking the shutdown phase for a task.
void endRangeInitializing()
Ends tracking the initialization phase for a task.
void addReleaseMarker()
Adds a release marker into the timeline to show when the task released memory.
void startRangeShuttingDown()
Starts tracking shutdown in the timeline to show when the task has started its shutdown phase...
~NvtxProfiler()=default
Destructor, deletes all attributes allocated.
void endRangeExecuting()
Ends tracking the execute for a task.