Skip to content

Commit 21059ad

Browse files
mkessler94zma2
andauthored
Enable ITT API metadata collection (#417)
* Enable ITT API metadata collection * fixed uint types * memory allocation optimization * memory optimization in struct allocation * input and allocation checks * Update itt_collector.h --------- Co-authored-by: Zhiqiang Ma <[email protected]>
1 parent a3b8659 commit 21059ad

File tree

4 files changed

+214
-75
lines changed

4 files changed

+214
-75
lines changed

tools/unitrace/src/chromelogger.h

Lines changed: 137 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,103 @@ static std::tuple<uint32_t, uint32_t> ClGetDevicePidTid(cl_device_pci_bus_info_k
259259
return std::tuple<uint32_t, uint32_t>(device_pid, device_tid);
260260
}
261261

262+
static std::string convertDataToString(IttArgs* args) {
263+
std::string strData = "";
264+
void* dataPtr = args->isIndirectData ? args->data[0] : args->data;
265+
if (args->count) {
266+
switch (args->type) {
267+
case __itt_metadata_u64: {
268+
const uint64_t* uint64Ptr = reinterpret_cast<const uint64_t*>(dataPtr);
269+
for (int i=0; i < args->count; i++) {
270+
if (i) {
271+
strData += ",";
272+
}
273+
strData += std::to_string(*(uint64Ptr + i));
274+
}
275+
break;
276+
}
277+
case __itt_metadata_s64: {
278+
const int64_t* int64Ptr = reinterpret_cast<const int64_t*>(dataPtr);
279+
for (int i=0; i < args->count; i++) {
280+
if (i) {
281+
strData += ",";
282+
}
283+
strData += std::to_string(*(int64Ptr + i));
284+
}
285+
break;
286+
}
287+
case __itt_metadata_u32: {
288+
const uint32_t* uint32Ptr = reinterpret_cast<const uint32_t*>(dataPtr);
289+
for (int i=0; i < args->count; i++) {
290+
if (i) {
291+
strData += ",";
292+
}
293+
strData += std::to_string(*(uint32Ptr + i));
294+
}
295+
break;
296+
}
297+
case __itt_metadata_s32: {
298+
const int32_t* int32Ptr = reinterpret_cast<const int32_t*>(dataPtr);
299+
for (int i=0; i < args->count; i++) {
300+
if (i) {
301+
strData += ",";
302+
}
303+
strData += std::to_string(*(int32Ptr + i));
304+
}
305+
break;
306+
}
307+
case __itt_metadata_u16: {
308+
const uint16_t* uint16Ptr = reinterpret_cast<const uint16_t*>(dataPtr);
309+
for (int i=0; i < args->count; i++) {
310+
if (i) {
311+
strData += ",";
312+
}
313+
strData += std::to_string(*(uint16Ptr + i));
314+
}
315+
break;
316+
}
317+
case __itt_metadata_s16: {
318+
const int16_t* uint16Ptr = reinterpret_cast<const int16_t*>(dataPtr);
319+
for (int i=0; i < args->count; i++) {
320+
if (i) {
321+
strData += ",";
322+
}
323+
strData += std::to_string(*(uint16Ptr + i));
324+
}
325+
break;
326+
}
327+
case __itt_metadata_float: {
328+
const float* floatPtr = reinterpret_cast<const float*>(dataPtr);
329+
for (int i=0; i < args->count; i++) {
330+
if (i) {
331+
strData += ",";
332+
}
333+
strData += std::to_string(*(floatPtr + i));
334+
}
335+
break;
336+
}
337+
case __itt_metadata_double: {
338+
const double* doublePtr = reinterpret_cast<const double*>(dataPtr);
339+
for (int i=0; i < args->count; i++) {
340+
if (i) {
341+
strData += ",";
342+
}
343+
strData += std::to_string(*(doublePtr + i));
344+
}
345+
break;
346+
}
347+
default: { // default is string
348+
const char* stringPtr = reinterpret_cast<const char*>(dataPtr);
349+
strData += "\"";
350+
strData += std::string(stringPtr, args->count);
351+
strData += "\"";
352+
break;
353+
}
354+
}
355+
}
356+
return strData;
357+
}
358+
262359
class TraceBuffer;
263360
std::set<TraceBuffer *> *trace_buffers_ = nullptr;
264361

@@ -546,10 +643,24 @@ class TraceBuffer {
546643
if (args.mpi_counter >= 0) {
547644
str_args += ", \"mpi_counter\": " + std::to_string(args.mpi_counter);
548645
}
549-
} else if (rec.api_type_ == CCL) {
550-
const CclArgs& args = rec.ccl_args_;
551-
str_args += "\"ssize\": " + std::to_string(args.buff_size);
552-
}
646+
} else if (rec.api_type_ == ITT) {
647+
str_args = str_args + "\"" + rec.itt_args_.key + "\":[";
648+
str_args += convertDataToString(&rec.itt_args_);
649+
str_args += "]";
650+
if (rec.itt_args_.isIndirectData) {
651+
free(rec.itt_args_.data[0]);
652+
}
653+
IttArgs* args = rec.itt_args_.next;
654+
while (args != nullptr) {
655+
str_args += ",";
656+
str_args = str_args + "\"" + args->key + "\":[";
657+
str_args += convertDataToString(args);
658+
str_args += "]";
659+
IttArgs* toFree = args;
660+
args = args->next;
661+
free(toFree);
662+
}
663+
}
553664

554665
if (!str_args.empty()) {
555666
str += ", \"args\": {" + str_args + "}";
@@ -971,10 +1082,24 @@ class ClTraceBuffer {
9711082
str_args += ", \"mpi_counter\": " + std::to_string(args.mpi_counter);
9721083
}
9731084

974-
} else if (rec.api_type_ == CCL) {
975-
const CclArgs& args = rec.ccl_args_;
976-
str_args += "\"ssize\": " + std::to_string(args.buff_size);
977-
}
1085+
} else if (rec.api_type_ == ITT) {
1086+
str_args = str_args + "\"" + rec.itt_args_.key + "\":[";
1087+
str_args += convertDataToString(&rec.itt_args_);
1088+
str_args += "]";
1089+
if (rec.itt_args_.isIndirectData) {
1090+
free(rec.itt_args_.data[0]);
1091+
}
1092+
IttArgs* args = rec.itt_args_.next;
1093+
while (args != nullptr) {
1094+
str_args += ",";
1095+
str_args = str_args + "\"" + args->key + "\":[";
1096+
str_args += convertDataToString(args);
1097+
str_args += "]";
1098+
IttArgs* toFree = args;
1099+
args = args->next;
1100+
free(toFree);
1101+
}
1102+
}
9781103

9791104
if (!str_args.empty()) {
9801105
str += ", \"args\": {" + str_args + "}";
@@ -1303,7 +1428,7 @@ class ChromeLogger {
13031428
}
13041429
}
13051430

1306-
static void IttLoggingCallback(const char *name, uint64_t start_ts, uint64_t end_ts) {
1431+
static void IttLoggingCallback(const char *name, uint64_t start_ts, uint64_t end_ts, IttArgs* metadata_args) {
13071432
if (!thread_local_buffer_.IsFinalized()) {
13081433
HostEventRecord *rec = thread_local_buffer_.GetHostEvent();
13091434

@@ -1319,27 +1444,10 @@ class ChromeLogger {
13191444
rec->start_time_ = start_ts;
13201445
rec->end_time_ = end_ts;
13211446
rec->id_ = 0;
1322-
thread_local_buffer_.BufferHostEvent();
1323-
}
1324-
}
1325-
1326-
static void CclLoggingCallback(const char *name, uint64_t start_ts, uint64_t end_ts, uint64_t buff_size) {
1327-
if (!thread_local_buffer_.IsFinalized()) {
1328-
HostEventRecord *rec = thread_local_buffer_.GetHostEvent();
1329-
1330-
if (name != nullptr) {
1331-
rec->name_ = strdup(name);
1332-
} else {
1333-
rec->name_ = nullptr;
1447+
if (metadata_args != nullptr && metadata_args->count != 0) {
1448+
rec->api_type_ = ITT;
1449+
rec->itt_args_ = *metadata_args;
13341450
}
1335-
1336-
rec->type_ = EVENT_COMPLETE;
1337-
rec->api_id_ = IttTracingId;
1338-
rec->start_time_ = start_ts;
1339-
rec->end_time_ = end_ts;
1340-
rec->id_ = 0;
1341-
rec->api_type_ = CCL;
1342-
rec->ccl_args_.buff_size = buff_size;
13431451
thread_local_buffer_.BufferHostEvent();
13441452
}
13451453
}

0 commit comments

Comments
 (0)