LLVM OpenMP 22.0.0git
InternalEvent.cpp
Go to the documentation of this file.
1//===- InternalEvent.cpp - Internal event implementation --------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// Implements internal event representation methods and helper functions.
11///
12//===----------------------------------------------------------------------===//
13
14#include "InternalEvent.h"
15
16#include <iomanip>
17#include <sstream>
18
19using namespace omptest;
20using namespace util;
21
22std::string util::makeHexString(uint64_t Data, bool IsPointer, size_t MinBytes,
23 bool ShowHexBase) {
24 if (Data == 0 && IsPointer)
25 return "(nil)";
26
27 thread_local std::ostringstream os;
28 // Clear the content of the stream
29 os.str(std::string());
30
31 // Manually prefixing "0x" will make the use of std::setfill more easy
32 if (ShowHexBase)
33 os << "0x";
34
35 // Default to 32bit (8 hex digits) width, if exceeding 64bit or zero value
36 size_t NumDigits = (MinBytes > 0 && MinBytes < 9) ? (MinBytes << 1) : 8;
37
38 if (MinBytes > 0)
39 os << std::setfill('0') << std::setw(NumDigits);
40
41 os << std::hex << Data;
42 return os.str();
43}
44
46 std::string S{"Assertion SyncPoint: '"};
47 S.append(Name).append(1, '\'');
48 return S;
49}
50
52 std::string S{"OMPT Callback ThreadBegin: "};
53 S.append("ThreadType=").append(std::to_string(ThreadType));
54 return S;
55}
56
57std::string internal::ThreadEnd::toString() const {
58 std::string S{"OMPT Callback ThreadEnd"};
59 return S;
60}
61
63 std::string S{"OMPT Callback ParallelBegin: "};
64 S.append("NumThreads=").append(std::to_string(NumThreads));
65 return S;
66}
67
69 // TODO: Should we expose more detailed info here?
70 std::string S{"OMPT Callback ParallelEnd"};
71 return S;
72}
73
74std::string internal::Work::toString() const {
75 std::string S{"OMPT Callback Work: "};
76 S.append("work_type=").append(std::to_string(WorkType));
77 S.append(" endpoint=").append(std::to_string(Endpoint));
78 S.append(" parallel_data=").append(makeHexString((uint64_t)ParallelData));
79 S.append(" task_data=").append(makeHexString((uint64_t)TaskData));
80 S.append(" count=").append(std::to_string(Count));
81 S.append(" codeptr=").append(makeHexString((uint64_t)CodeptrRA));
82 return S;
83}
84
85std::string internal::Dispatch::toString() const {
86 std::string S{"OMPT Callback Dispatch: "};
87 S.append("parallel_data=").append(makeHexString((uint64_t)ParallelData));
88 S.append(" task_data=").append(makeHexString((uint64_t)TaskData));
89 S.append(" kind=").append(std::to_string(Kind));
90 // TODO Check what to print for instance in all different cases
91 if (Kind == ompt_dispatch_iteration) {
92 S.append(" instance=[it=")
93 .append(std::to_string(Instance.value))
94 .append(1, ']');
95 } else if (Kind == ompt_dispatch_section) {
96 S.append(" instance=[ptr=")
97 .append(makeHexString((uint64_t)Instance.ptr))
98 .append(1, ']');
99 } else if ((Kind == ompt_dispatch_ws_loop_chunk ||
100 Kind == ompt_dispatch_taskloop_chunk ||
101 Kind == ompt_dispatch_distribute_chunk) &&
102 Instance.ptr != nullptr) {
103 auto Chunk = static_cast<ompt_dispatch_chunk_t *>(Instance.ptr);
104 S.append(" instance=[chunk=(start=")
105 .append(std::to_string(Chunk->start))
106 .append(", iterations=")
107 .append(std::to_string(Chunk->iterations))
108 .append(")]");
109 }
110 return S;
111}
112
114 std::string S{"OMPT Callback TaskCreate: "};
115 S.append("encountering_task_data=")
116 .append(makeHexString((uint64_t)EncounteringTaskData));
117 S.append(" encountering_task_frame=")
118 .append(makeHexString((uint64_t)EncounteringTaskFrame));
119 S.append(" new_task_data=").append(makeHexString((uint64_t)NewTaskData));
120 S.append(" flags=").append(std::to_string(Flags));
121 S.append(" has_dependences=").append(std::to_string(HasDependences));
122 S.append(" codeptr=").append(makeHexString((uint64_t)CodeptrRA));
123 return S;
124}
125
127 std::string S{"OMPT Callback ImplicitTask: "};
128 S.append("endpoint=").append(std::to_string(Endpoint));
129 S.append(" parallel_data=").append(makeHexString((uint64_t)ParallelData));
130 S.append(" task_data=").append(makeHexString((uint64_t)TaskData));
131 S.append(" actual_parallelism=").append(std::to_string(ActualParallelism));
132 S.append(" index=").append(std::to_string(Index));
133 S.append(" flags=").append(std::to_string(Flags));
134 return S;
135}
136
138 std::string S{"OMPT Callback SyncRegion: "};
139 S.append("kind=").append(std::to_string(Kind));
140 S.append(" endpoint=").append(std::to_string(Endpoint));
141 S.append(" parallel_data=").append(makeHexString((uint64_t)ParallelData));
142 S.append(" task_data=").append(makeHexString((uint64_t)TaskData));
143 S.append(" codeptr=").append(makeHexString((uint64_t)CodeptrRA));
144 return S;
145}
146
147std::string internal::Target::toString() const {
148 // TODO Should we canonicalize the string prefix (use "OMPT ..." everywhere)?
149 std::string S{"Callback Target: target_id="};
150 S.append(std::to_string(TargetId));
151 S.append(" kind=").append(std::to_string(Kind));
152 S.append(" endpoint=").append(std::to_string(Endpoint));
153 S.append(" device_num=").append(std::to_string(DeviceNum));
154 S.append(" code=").append(makeHexString((uint64_t)CodeptrRA));
155 return S;
156}
157
158std::string internal::TargetEmi::toString() const {
159 // TODO Should we canonicalize the string prefix (use "OMPT ..." everywhere)?
160 std::string S{"Callback Target EMI: kind="};
161 S.append(std::to_string(Kind));
162 S.append(" endpoint=").append(std::to_string(Endpoint));
163 S.append(" device_num=").append(std::to_string(DeviceNum));
164 S.append(" task_data=").append(makeHexString((uint64_t)TaskData));
165 S.append(" (")
166 .append(makeHexString((uint64_t)(TaskData) ? TaskData->value : 0,
167 /*IsPointer=*/false))
168 .append(1, ')');
169 S.append(" target_task_data=")
170 .append(makeHexString((uint64_t)TargetTaskData));
171 S.append(" (")
172 .append(
173 makeHexString((uint64_t)(TargetTaskData) ? TargetTaskData->value : 0,
174 /*IsPointer=*/false))
175 .append(1, ')');
176 S.append(" target_data=").append(makeHexString((uint64_t)TargetData));
177 S.append(" (")
178 .append(makeHexString((uint64_t)(TargetData) ? TargetData->value : 0,
179 /*IsPointer=*/false))
180 .append(1, ')');
181 S.append(" code=").append(makeHexString((uint64_t)CodeptrRA));
182 return S;
183}
184
186 std::string S{" Callback DataOp: target_id="};
187 S.append(std::to_string(TargetId));
188 S.append(" host_op_id=").append(std::to_string(HostOpId));
189 S.append(" optype=").append(std::to_string(OpType));
190 S.append(" src=").append(makeHexString((uint64_t)SrcAddr));
191 S.append(" src_device_num=").append(std::to_string(SrcDeviceNum));
192 S.append(" dest=").append(makeHexString((uint64_t)DstAddr));
193 S.append(" dest_device_num=").append(std::to_string(DstDeviceNum));
194 S.append(" bytes=").append(std::to_string(Bytes));
195 S.append(" code=").append(makeHexString((uint64_t)CodeptrRA));
196 return S;
197}
198
200 std::string S{" Callback DataOp EMI: endpoint="};
201 S.append(std::to_string(Endpoint));
202 S.append(" optype=").append(std::to_string(OpType));
203 S.append(" target_task_data=")
204 .append(makeHexString((uint64_t)TargetTaskData));
205 S.append(" (")
206 .append(
207 makeHexString((uint64_t)(TargetTaskData) ? TargetTaskData->value : 0,
208 /*IsPointer=*/false))
209 .append(1, ')');
210 S.append(" target_data=").append(makeHexString((uint64_t)TargetData));
211 S.append(" (")
212 .append(makeHexString((uint64_t)(TargetData) ? TargetData->value : 0,
213 /*IsPointer=*/false))
214 .append(1, ')');
215 S.append(" host_op_id=").append(makeHexString((uint64_t)HostOpId));
216 S.append(" (")
217 .append(makeHexString((uint64_t)(HostOpId) ? (*HostOpId) : 0,
218 /*IsPointer=*/false))
219 .append(1, ')');
220 S.append(" src=").append(makeHexString((uint64_t)SrcAddr));
221 S.append(" src_device_num=").append(std::to_string(SrcDeviceNum));
222 S.append(" dest=").append(makeHexString((uint64_t)DstAddr));
223 S.append(" dest_device_num=").append(std::to_string(DstDeviceNum));
224 S.append(" bytes=").append(std::to_string(Bytes));
225 S.append(" code=").append(makeHexString((uint64_t)CodeptrRA));
226 return S;
227}
228
230 std::string S{" Callback Submit: target_id="};
231 S.append(std::to_string(TargetId));
232 S.append(" host_op_id=").append(std::to_string(HostOpId));
233 S.append(" req_num_teams=").append(std::to_string(RequestedNumTeams));
234 return S;
235}
236
238 std::string S{" Callback Submit EMI: endpoint="};
239 S.append(std::to_string(Endpoint));
240 S.append(" req_num_teams=").append(std::to_string(RequestedNumTeams));
241 S.append(" target_data=").append(makeHexString((uint64_t)TargetData));
242 S.append(" (")
243 .append(makeHexString((uint64_t)(TargetData) ? TargetData->value : 0,
244 /*IsPointer=*/false))
245 .append(1, ')');
246 S.append(" host_op_id=").append(makeHexString((uint64_t)HostOpId));
247 S.append(" (")
248 .append(makeHexString((uint64_t)(HostOpId) ? (*HostOpId) : 0,
249 /*IsPointer=*/false))
250 .append(1, ')');
251 return S;
252}
253
255 std::string S{"Callback Init: device_num="};
256 S.append(std::to_string(DeviceNum));
257 S.append(" type=").append((Type) ? Type : "(null)");
258 S.append(" device=").append(makeHexString((uint64_t)Device));
259 S.append(" lookup=").append(makeHexString((uint64_t)LookupFn));
260 S.append(" doc=").append(makeHexString((uint64_t)DocStr));
261 return S;
262}
263
265 std::string S{"Callback Fini: device_num="};
266 S.append(std::to_string(DeviceNum));
267 return S;
268}
269
271 std::string S{"Callback Load: device_num:"};
272 S.append(std::to_string(DeviceNum));
273 S.append(" module_id:").append(std::to_string(ModuleId));
274 S.append(" filename:").append((Filename == nullptr) ? "(null)" : Filename);
275 S.append(" host_addr:").append(makeHexString((uint64_t)HostAddr));
276 S.append(" device_addr:").append(makeHexString((uint64_t)DeviceAddr));
277 S.append(" bytes:").append(std::to_string(Bytes));
278 return S;
279}
280
282 std::string S{"Allocated "};
283 S.append(std::to_string((Bytes != nullptr) ? *Bytes : 0))
284 .append(" bytes at ");
285 S.append(makeHexString((Buffer != nullptr) ? (uint64_t)*Buffer : 0));
286 S.append(" in buffer request callback");
287 return S;
288}
289
291 std::string S{"Executing buffer complete callback: "};
292 S.append(std::to_string(DeviceNum)).append(1, ' ');
293 S.append(makeHexString((uint64_t)Buffer)).append(1, ' ');
294 S.append(std::to_string(Bytes)).append(1, ' ');
295 S.append(makeHexString((uint64_t)Begin)).append(1, ' ');
296 S.append(std::to_string(BufferOwned));
297 return S;
298}
299
301 std::string S{""};
302 std::string T{""};
303 S.append("rec=").append(makeHexString((uint64_t)RecordPtr));
304 S.append(" type=").append(std::to_string(Record.type));
305
306 T.append("time=").append(std::to_string(Record.time));
307 T.append(" thread_id=").append(std::to_string(Record.thread_id));
308 T.append(" target_id=").append(std::to_string(Record.target_id));
309
310 switch (Record.type) {
311 case ompt_callback_target:
312 case ompt_callback_target_emi: {
313 // Handle Target Record
314 ompt_record_target_t TR = Record.record.target;
315 S.append(" (Target task) ").append(T);
316 S.append(" kind=").append(std::to_string(TR.kind));
317 S.append(" endpoint=").append(std::to_string(TR.endpoint));
318 S.append(" device=").append(std::to_string(TR.device_num));
319 S.append(" task_id=").append(std::to_string(TR.task_id));
320 S.append(" codeptr=").append(makeHexString((uint64_t)TR.codeptr_ra));
321 break;
322 }
323 case ompt_callback_target_data_op:
324 case ompt_callback_target_data_op_emi: {
325 // Handle Target DataOp Record
326 ompt_record_target_data_op_t TDR = Record.record.target_data_op;
327 S.append(" (Target data op) ").append(T);
328 S.append(" host_op_id=").append(std::to_string(TDR.host_op_id));
329 S.append(" optype=").append(std::to_string(TDR.optype));
330 S.append(" src_addr=").append(makeHexString((uint64_t)TDR.src_addr));
331 S.append(" src_device=").append(std::to_string(TDR.src_device_num));
332 S.append(" dest_addr=").append(makeHexString((uint64_t)TDR.dest_addr));
333 S.append(" dest_device=").append(std::to_string(TDR.dest_device_num));
334 S.append(" bytes=").append(std::to_string(TDR.bytes));
335 S.append(" end_time=").append(std::to_string(TDR.end_time));
336 S.append(" duration=").append(std::to_string(TDR.end_time - Record.time));
337 S.append(" ns codeptr=").append(makeHexString((uint64_t)TDR.codeptr_ra));
338 break;
339 }
340 case ompt_callback_target_submit:
341 case ompt_callback_target_submit_emi: {
342 // Handle Target Kernel Record
343 ompt_record_target_kernel_t TKR = Record.record.target_kernel;
344 S.append(" (Target kernel) ").append(T);
345 S.append(" host_op_id=").append(std::to_string(TKR.host_op_id));
346 S.append(" requested_num_teams=")
347 .append(std::to_string(TKR.requested_num_teams));
348 S.append(" granted_num_teams=")
349 .append(std::to_string(TKR.granted_num_teams));
350 S.append(" end_time=").append(std::to_string(TKR.end_time));
351 S.append(" duration=").append(std::to_string(TKR.end_time - Record.time));
352 S.append(" ns");
353 break;
354 }
355 default:
356 S.append(" (unsupported record type)");
357 break;
358 }
359
360 return S;
361}
362
364 std::string S{"Deallocated "};
365 S.append(makeHexString((uint64_t)Buffer));
366 return S;
367}
Declares internal event representations along the default CTOR definition.
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark S
std::string makeHexString(uint64_t Data, bool IsPointer=true, size_t DataBytes=0, bool ShowHexBase=true)
String manipulation helper function.
unsigned * Index(unsigned *p, unsigned i, unsigned j, unsigned bound2)
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.
std::string toString() const override
Basic toString method, which may be overridden with own implementations.