1
1
#include " xpti/xpti_trace_framework.hpp"
2
2
3
+ #include < algorithm>
3
4
#include < iostream>
4
5
#include < mutex>
5
6
#include < string_view>
6
7
7
8
std::mutex GMutex;
8
9
10
+ XPTI_CALLBACK_API void syclCallback (uint16_t , xpti::trace_event_data_t *,
11
+ xpti::trace_event_data_t *, uint64_t ,
12
+ const void *);
13
+
9
14
XPTI_CALLBACK_API void memCallback (uint16_t , xpti::trace_event_data_t *,
10
15
xpti::trace_event_data_t *, uint64_t ,
11
16
const void *);
@@ -64,6 +69,43 @@ XPTI_CALLBACK_API void xptiTraceInit(unsigned int MajorVersion,
64
69
static_cast <uint16_t >(xpti::trace_point_type_t ::offload_alloc_accessor),
65
70
syclBufferCallback);
66
71
}
72
+ if (NameView == " sycl" ) {
73
+ uint8_t StreamID = xptiRegisterStream (StreamName);
74
+ xptiRegisterCallback (
75
+ StreamID, static_cast <uint16_t >(xpti::trace_point_type_t ::graph_create),
76
+ syclCallback);
77
+ xptiRegisterCallback (
78
+ StreamID, static_cast <uint16_t >(xpti::trace_point_type_t ::node_create),
79
+ syclCallback);
80
+ xptiRegisterCallback (
81
+ StreamID, static_cast <uint16_t >(xpti::trace_point_type_t ::edge_create),
82
+ syclCallback);
83
+ xptiRegisterCallback (
84
+ StreamID, static_cast <uint16_t >(xpti::trace_point_type_t ::task_begin),
85
+ syclCallback);
86
+ xptiRegisterCallback (
87
+ StreamID, static_cast <uint16_t >(xpti::trace_point_type_t ::task_end),
88
+ syclCallback);
89
+ xptiRegisterCallback (
90
+ StreamID, static_cast <uint16_t >(xpti::trace_point_type_t ::signal ),
91
+ syclCallback);
92
+ xptiRegisterCallback (
93
+ StreamID,
94
+ static_cast <uint16_t >(xpti::trace_point_type_t ::barrier_begin),
95
+ syclCallback);
96
+ xptiRegisterCallback (
97
+ StreamID, static_cast <uint16_t >(xpti::trace_point_type_t ::barrier_end),
98
+ syclCallback);
99
+ xptiRegisterCallback (
100
+ StreamID, static_cast <uint16_t >(xpti::trace_point_type_t ::wait_begin),
101
+ syclCallback);
102
+ xptiRegisterCallback (
103
+ StreamID, static_cast <uint16_t >(xpti::trace_point_type_t ::wait_end),
104
+ syclCallback);
105
+ xptiRegisterCallback (
106
+ StreamID, static_cast <uint16_t >(xpti::trace_point_type_t ::signal ),
107
+ syclCallback);
108
+ }
67
109
}
68
110
69
111
XPTI_CALLBACK_API void xptiTraceFinish (const char *streamName) {
@@ -86,9 +128,9 @@ XPTI_CALLBACK_API void memCallback(uint16_t TraceType,
86
128
} else if (Type == xpti::trace_point_type_t ::mem_release_end) {
87
129
std::cout << " Mem Release End : " ;
88
130
}
89
- std::cout << " mem_obj_handle: " << Data-> mem_object_handle << " \n " ;
90
- std::cout << " alloc_pointer : " << Data->alloc_pointer << " \n " ;
91
- std::cout << " alloc_size : " << Data->alloc_size << " \n " ;
131
+ std::cout << " mem_obj_handle:0x " << std::hex << Data-> mem_object_handle ;
132
+ std::cout << " | alloc_pointer:0x " << Data->alloc_pointer ;
133
+ std::cout << " | alloc_size: " << std::dec << Data->alloc_size << std::endl ;
92
134
}
93
135
94
136
XPTI_CALLBACK_API void syclBufferCallback (uint16_t TraceType,
@@ -148,3 +190,104 @@ XPTI_CALLBACK_API void syclBufferCallback(uint16_t TraceType,
148
190
std::cout << " Unknown tracepoint\n " ;
149
191
}
150
192
}
193
+
194
+ template <typename T>
195
+ T getMetadataByKey (xpti::metadata_t *Metadata, const char *key) {
196
+ for (auto &Item : *Metadata) {
197
+ if (std::string (xptiLookupString (Item.first )) == key) {
198
+ return xpti::getMetadata<T>(Item).second ;
199
+ }
200
+ }
201
+ return {};
202
+ }
203
+
204
+ bool isMetadataPresent (xpti::metadata_t *Metadata, const char *key) {
205
+ for (auto &Item : *Metadata) {
206
+ if (std::string (xptiLookupString (Item.first )) == key) {
207
+ return true ;
208
+ }
209
+ }
210
+ return false ;
211
+ }
212
+ void parseMetadata (xpti::trace_event_data_t *Event) {
213
+ xpti::metadata_t *Metadata = xptiQueryMetadata (Event);
214
+ if (isMetadataPresent (Metadata, " kernel_name" )) {
215
+ std::cout << getMetadataByKey<std::string>(Metadata, " kernel_name" ) << " |" ;
216
+ }
217
+ if (isMetadataPresent (Metadata, " sym_source_file_name" ) &&
218
+ isMetadataPresent (Metadata, " sym_line_no" ) &&
219
+ isMetadataPresent (Metadata, " sym_column_no" )) {
220
+ std::cout << getMetadataByKey<std::string>(Metadata, " sym_source_file_name" )
221
+ << " :" << getMetadataByKey<int >(Metadata, " sym_line_no" ) << " :"
222
+ << getMetadataByKey<int >(Metadata, " sym_column_no" ) << " |" ;
223
+ }
224
+ if (isMetadataPresent (Metadata, " enqueue_kernel_data" )) {
225
+ auto KernelEnqueueData =
226
+ getMetadataByKey<xpti::offload_kernel_enqueue_data_t >(
227
+ Metadata, " enqueue_kernel_data" );
228
+
229
+ std::cout << " {" << KernelEnqueueData.global_size [0 ] << " , "
230
+ << KernelEnqueueData.global_size [1 ] << " , "
231
+ << KernelEnqueueData.global_size [2 ] << " }, {"
232
+ << KernelEnqueueData.local_size [0 ] << " , "
233
+ << KernelEnqueueData.local_size [1 ] << " , "
234
+ << KernelEnqueueData.local_size [2 ] << " }, {"
235
+ << KernelEnqueueData.offset [0 ] << " , "
236
+ << KernelEnqueueData.offset [1 ] << " , "
237
+ << KernelEnqueueData.offset [2 ] << " }, "
238
+ << KernelEnqueueData.args_num << " |\n " ;
239
+
240
+ for (int i = 0 ; i < KernelEnqueueData.args_num ; i++) {
241
+ std::string Name (" arg" + std::to_string (i));
242
+
243
+ auto arg = getMetadataByKey<xpti::offload_kernel_arg_data_t >(
244
+ Metadata, Name.c_str ());
245
+ std::cout << " " << Name << " : {" << arg.type << " , " << std::hex
246
+ << " 0x" << (uintptr_t )arg.pointer << std::dec << " , "
247
+ << arg.size << " , " << arg.index << " } "
248
+ << " \n " ;
249
+ }
250
+ }
251
+ }
252
+ XPTI_CALLBACK_API void syclCallback (uint16_t TraceType,
253
+ xpti::trace_event_data_t *,
254
+ xpti::trace_event_data_t *Event, uint64_t ,
255
+ const void *UserData) {
256
+ std::lock_guard Lock{GMutex};
257
+ auto Type = static_cast <xpti::trace_point_type_t >(TraceType);
258
+ switch (Type) {
259
+ case xpti::trace_point_type_t ::graph_create:
260
+ std::cout << " Graph create|" ;
261
+ break ;
262
+ case xpti::trace_point_type_t ::node_create:
263
+ std::cout << " Node create|" ;
264
+ break ;
265
+ case xpti::trace_point_type_t ::edge_create:
266
+ std::cout << " Edge create|" ;
267
+ break ;
268
+ case xpti::trace_point_type_t ::task_begin:
269
+ std::cout << " Task begin|" ;
270
+ break ;
271
+ case xpti::trace_point_type_t ::task_end:
272
+ std::cout << " Task end|" ;
273
+ break ;
274
+ case xpti::trace_point_type_t ::signal :
275
+ std::cout << " Signal|" ;
276
+ break ;
277
+ case xpti::trace_point_type_t ::wait_begin:
278
+ std::cout << " Wait begin|" ;
279
+ break ;
280
+ case xpti::trace_point_type_t ::wait_end:
281
+ std::cout << " Wait end|" ;
282
+ break ;
283
+ case xpti::trace_point_type_t ::barrier_begin:
284
+ std::cout << " Barrier begin|" ;
285
+ break ;
286
+ case xpti::trace_point_type_t ::barrier_end:
287
+ std::cout << " Barrier end|" ;
288
+ break ;
289
+ default :
290
+ std::cout << " Unknown tracepoint|" ;
291
+ }
292
+ parseMetadata (Event);
293
+ }
0 commit comments