Fixing Timestamps for Tracing for the trace buffer results

Change-Id: I89b36daacb6531840ac334ba4629c73a7b8f1e79
This commit is contained in:
Ammar ELWazir
2023-05-23 19:01:16 +00:00
rodzic 1bba393b1b
commit 6b07b139c4
15 zmienionych plików z 489 dodań i 586 usunięć
+16 -17
Wyświetl plik
@@ -62,7 +62,7 @@ class att_plugin_t {
bool IsValid() const { return is_valid_; }
void FlushATTRecord(const rocprofiler_record_att_tracer_t* att_tracer_record,
rocprofiler_session_id_t session_id, rocprofiler_buffer_id_t buffer_id) {
rocprofiler_session_id_t session_id, rocprofiler_buffer_id_t buffer_id) {
std::lock_guard<std::mutex> lock(writing_lock);
if (!att_tracer_record) {
@@ -71,11 +71,11 @@ class att_plugin_t {
}
size_t name_length;
CHECK_ROCPROFILER(rocprofiler_query_kernel_info_size(ROCPROFILER_KERNEL_NAME,
att_tracer_record->kernel_id, &name_length));
CHECK_ROCPROFILER(rocprofiler_query_kernel_info_size(
ROCPROFILER_KERNEL_NAME, att_tracer_record->kernel_id, &name_length));
const char* kernel_name_c = static_cast<const char*>(malloc(name_length * sizeof(char)));
CHECK_ROCPROFILER(rocprofiler_query_kernel_info(ROCPROFILER_KERNEL_NAME,
att_tracer_record->kernel_id, &kernel_name_c));
att_tracer_record->kernel_id, &kernel_name_c));
std::string name_demangled = rocmtools::truncate_name(rocmtools::cxx_demangle(kernel_name_c));
@@ -99,7 +99,8 @@ class att_plugin_t {
auto dispatch_id = att_tracer_record->header.id.handle;
std::string fname =
outpath + name_demangled + "_v" + std::to_string(file_iteration) + "_kernel.txt";
std::ofstream(fname.c_str()) << name_demangled << " [" << dispatch_id << "]: " << kernel_name_c << '\n';
std::ofstream(fname.c_str()) << name_demangled << " [" << dispatch_id << "]: " << kernel_name_c
<< '\n';
// iterate over each shader engine att trace
for (int i = 0; i < se_num; i++) {
@@ -125,8 +126,8 @@ class att_plugin_t {
}
int WriteBufferRecords(const rocprofiler_record_header_t* begin,
const rocprofiler_record_header_t* end, rocprofiler_session_id_t session_id,
rocprofiler_buffer_id_t buffer_id) {
const rocprofiler_record_header_t* end,
rocprofiler_session_id_t session_id, rocprofiler_buffer_id_t buffer_id) {
while (begin < end) {
if (!begin) return 0;
switch (begin->kind) {
@@ -139,8 +140,9 @@ class att_plugin_t {
break;
case ROCPROFILER_ATT_TRACER_RECORD: {
rocprofiler_record_att_tracer_t* att_record = const_cast<rocprofiler_record_att_tracer_t*>(
reinterpret_cast<const rocprofiler_record_att_tracer_t*>(begin));
rocprofiler_record_att_tracer_t* att_record =
const_cast<rocprofiler_record_att_tracer_t*>(
reinterpret_cast<const rocprofiler_record_att_tracer_t*>(begin));
FlushATTRecord(att_record, session_id, buffer_id);
break;
}
@@ -159,7 +161,7 @@ att_plugin_t* att_plugin = nullptr;
} // namespace
ROCPROFILER_EXPORT int rocprofiler_plugin_initialize(uint32_t rocprofiler_major_version,
uint32_t rocprofiler_minor_version) {
uint32_t rocprofiler_minor_version) {
if (rocprofiler_major_version != ROCPROFILER_VERSION_MAJOR ||
rocprofiler_minor_version < ROCPROFILER_VERSION_MINOR)
return -1;
@@ -181,17 +183,14 @@ ROCPROFILER_EXPORT void rocprofiler_plugin_finalize() {
att_plugin = nullptr;
}
ROCPROFILER_EXPORT int rocprofiler_plugin_write_buffer_records(const rocprofiler_record_header_t* begin,
const rocprofiler_record_header_t* end,
rocprofiler_session_id_t session_id,
rocprofiler_buffer_id_t buffer_id) {
ROCPROFILER_EXPORT int rocprofiler_plugin_write_buffer_records(
const rocprofiler_record_header_t* begin, const rocprofiler_record_header_t* end,
rocprofiler_session_id_t session_id, rocprofiler_buffer_id_t buffer_id) {
if (!att_plugin || !att_plugin->IsValid()) return -1;
return att_plugin->WriteBufferRecords(begin, end, session_id, buffer_id);
}
ROCPROFILER_EXPORT int rocprofiler_plugin_write_record(
rocprofiler_record_tracer_t record,
rocprofiler_plugin_tracer_extra_data_t tracer_extra_data) {
ROCPROFILER_EXPORT int rocprofiler_plugin_write_record(rocprofiler_record_tracer_t record) {
if (!att_plugin || !att_plugin->IsValid()) return -1;
if (record.header.id.handle == 0) return 0;
return 0;
+2 -3
Wyświetl plik
@@ -88,8 +88,7 @@ ROCPROFILER_EXPORT int rocprofiler_plugin_write_buffer_records(
return 0;
}
ROCPROFILER_EXPORT int rocprofiler_plugin_write_record(
const rocprofiler_record_tracer_t record, rocprofiler_plugin_tracer_extra_data_t tracer_data) {
ROCPROFILER_EXPORT int rocprofiler_plugin_write_record(const rocprofiler_record_tracer_t record) {
assert(the_plugin);
if (record.header.id.handle == 0) {
@@ -97,7 +96,7 @@ ROCPROFILER_EXPORT int rocprofiler_plugin_write_record(
}
try {
the_plugin->HandleTracerRecord(record, rocprofiler_session_id_t{0}, tracer_data);
the_plugin->HandleTracerRecord(record, rocprofiler_session_id_t{0});
} catch (const std::exception& exc) {
std::cerr << "rocprofiler_plugin_write_record(): " << exc.what() << std::endl;
return -1;
+4 -7
Wyświetl plik
@@ -630,8 +630,7 @@ Plugin::Plugin(const std::size_t packet_size, const fs::path& trace_dir,
}
void Plugin::HandleTracerRecord(const rocprofiler_record_tracer_t& record,
const rocprofiler_session_id_t session_id,
rocprofiler_plugin_tracer_extra_data_t tracer_data) {
const rocprofiler_session_id_t session_id) {
std::lock_guard<std::mutex> lock{lock_};
// Depending on the domain, create and add an event record to the
@@ -668,8 +667,8 @@ void Plugin::HandleTracerRecord(const rocprofiler_record_tracer_t& record,
std::string kernel_name;
hip_api_data_t hip_api_data =
*reinterpret_cast<const hip_api_data_t*>(record.api_data_handle.handle);
if (tracer_data.kernel_name != nullptr)
kernel_name = rocmtools::cxx_demangle(std::string(tracer_data.kernel_name));
if (record.name != nullptr)
kernel_name = rocmtools::cxx_demangle(std::string(record.name));
else
kernel_name = "";
hip_api_tracer_.AddEventRecord(
@@ -708,9 +707,7 @@ void Plugin::HandleBufferRecords(const rocprofiler_record_header_t* begin,
const rocprofiler_buffer_id_t buffer_id) {
while (begin && begin < end) {
if (begin->kind == ROCPROFILER_TRACER_RECORD) {
rocprofiler_plugin_tracer_extra_data_t tracer_data = {};
HandleTracerRecord(*reinterpret_cast<const rocprofiler_record_tracer_t*>(begin), session_id,
tracer_data);
HandleTracerRecord(*reinterpret_cast<const rocprofiler_record_tracer_t*>(begin), session_id);
} else {
assert(begin->kind == ROCPROFILER_PROFILER_RECORD);
HandleProfilerRecord(*reinterpret_cast<const rocprofiler_record_profiler_t*>(begin),
+3 -4
Wyświetl plik
@@ -54,8 +54,7 @@ class Plugin final {
// Handles a tracer record.
void HandleTracerRecord(const rocprofiler_record_tracer_t& record,
rocprofiler_session_id_t session_id,
rocprofiler_plugin_tracer_extra_data_t tracer_data);
rocprofiler_session_id_t session_id);
// Handles a profiler record.
@@ -65,8 +64,8 @@ class Plugin final {
// Handles tracer or profiler records from `begin` to `end`
// (excluded).
void HandleBufferRecords(const rocprofiler_record_header_t* begin,
const rocprofiler_record_header_t* end, rocprofiler_session_id_t session_id,
rocprofiler_buffer_id_t buffer_id);
const rocprofiler_record_header_t* end,
rocprofiler_session_id_t session_id, rocprofiler_buffer_id_t buffer_id);
private:
// rocTX barectf platform descriptor.
+49 -60
Wyświetl plik
@@ -198,46 +198,53 @@ class file_plugin_t {
void FlushTracerRecord(rocprofiler_record_tracer_t tracer_record,
rocprofiler_session_id_t session_id,
rocprofiler_plugin_tracer_extra_data_t tracer_extra_data,
rocprofiler_buffer_id_t buffer_id = rocprofiler_buffer_id_t{0}){
rocprofiler_buffer_id_t buffer_id = rocprofiler_buffer_id_t{0}) {
std::lock_guard<std::mutex> lock(writing_lock);
if (tracer_record.timestamps.end.value <= 0 && tracer_record.domain != ACTIVITY_DOMAIN_ROCTX)
return;
std::string kernel_name;
std::string function_name;
std::string roctx_message;
uint64_t roctx_id;
if ((tracer_record.operation_id.id == 0 && tracer_record.domain == ACTIVITY_DOMAIN_HIP_OPS)) {
if (tracer_record.api_data_handle.handle &&
strlen(reinterpret_cast<const char*>(tracer_record.api_data_handle.handle)) > 1)
kernel_name = rocmtools::cxx_demangle(
reinterpret_cast<const char*>(tracer_record.api_data_handle.handle));
if (tracer_record.name) {
if (tracer_record.domain == ACTIVITY_DOMAIN_HIP_API)
kernel_name = rocmtools::cxx_demangle(tracer_record.name);
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX) roctx_message = tracer_record.name;
}
size_t function_name_size = 0;
char* function_name_c = nullptr;
if (tracer_record.domain == ACTIVITY_DOMAIN_HSA_API) {
if (tracer_extra_data.function_name)
function_name = std::string(tracer_extra_data.function_name);
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info_size(
rocprofiler_session_id_t{0}, ROCPROFILER_HSA_FUNCTION_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &function_name_size));
function_name_c = new char[function_name_size];
if (function_name_size > 1) {
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info(
rocprofiler_session_id_t{0}, ROCPROFILER_HSA_FUNCTION_NAME,
tracer_record.api_data_handle, tracer_record.operation_id, &function_name_c));
}
}
if (tracer_record.domain == ACTIVITY_DOMAIN_HIP_API) {
if (tracer_extra_data.kernel_name)
kernel_name = rocmtools::cxx_demangle(std::string(tracer_extra_data.kernel_name));
if(tracer_extra_data.function_name)
function_name = std::string(tracer_extra_data.function_name);
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info_size(
rocprofiler_session_id_t{0}, ROCPROFILER_HIP_FUNCTION_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &function_name_size));
if (function_name_size > 1) {
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info(
rocprofiler_session_id_t{0}, ROCPROFILER_HIP_FUNCTION_NAME,
tracer_record.api_data_handle, tracer_record.operation_id, &function_name_c));
}
}
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX) {
const char* roctx_msg = reinterpret_cast<const char*>(tracer_record.api_data_handle.handle);
if(roctx_msg)
roctx_message = rocmtools::cxx_demangle(std::string(roctx_msg));
roctx_id = tracer_record.operation_id.id;
}
// return;
output_file_t* output_file = get_output_file(output_type_t::TRACER, tracer_record.domain);
*output_file << "Record(" << tracer_record.header.id.handle << "), Domain("
<< GetDomainName(tracer_record.domain) << "),";
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX && roctx_id >= 0)
*output_file << " ROCTX_ID(" << roctx_id << "),";
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX && roctx_message.size() > 1)
*output_file << " ROCTX_Message(" << roctx_message << "),";
if (function_name.size() > 1) *output_file << " Function(" << function_name << "),";
*output_file << " ROCTX_ID(" << tracer_record.operation_id.id << "),";
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX && tracer_record.name)
*output_file << " ROCTX_Message(" << reinterpret_cast<const char*>(tracer_record.name)
<< "),";
if (function_name_c) *output_file << " Function(" << function_name_c << "),";
if (kernel_name.size() > 1) *output_file << " Kernel_Name(" << kernel_name.c_str() << "),";
if (tracer_record.domain == ACTIVITY_DOMAIN_HSA_OPS || tracer_record.domain == ACTIVITY_DOMAIN_HIP_OPS) {
if (tracer_record.domain == ACTIVITY_DOMAIN_HSA_OPS ||
tracer_record.domain == ACTIVITY_DOMAIN_HIP_OPS) {
switch (tracer_record.operation_id.id) {
case 0:
*output_file << " Operation(DISPATCH_OP),";
@@ -252,27 +259,12 @@ class file_plugin_t {
break;
}
}
if (tracer_record.phase == ROCPROFILER_PHASE_NONE) {
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX) {
*output_file << " timestamp(" << tracer_record.timestamps.begin.value << "),";
} else if (tracer_record.phase == ROCPROFILER_PHASE_EXIT ||
tracer_record.phase == ROCPROFILER_PHASE_NONE) {
*output_file << " Begin(" << tracer_record.timestamps.begin.value << "), End("
<< tracer_record.timestamps.end.value << "),";
} else {
if (tracer_record.phase == ROCPROFILER_PHASE_ENTER &&
tracer_record.domain != ACTIVITY_DOMAIN_ROCTX) {
rocprofiler_timestamp_t timestamp;
rocprofiler_get_timestamp(&timestamp);
*output_file << " Begin(" << timestamp.value << "),";
}
if (tracer_record.phase == ROCPROFILER_PHASE_ENTER &&
tracer_record.domain == ACTIVITY_DOMAIN_ROCTX) {
rocprofiler_timestamp_t timestamp;
rocprofiler_get_timestamp(&timestamp);
*output_file << " timestamp(" << timestamp.value << "),";
}
if (tracer_record.phase == ROCPROFILER_PHASE_EXIT) {
rocprofiler_timestamp_t timestamp;
rocprofiler_get_timestamp(&timestamp);
*output_file << " End(" << timestamp.value << "),";
}
}
*output_file << " Correlation_ID(" << tracer_record.correlation_id.value << ")";
*output_file << std::endl;
@@ -382,11 +374,9 @@ class file_plugin_t {
break;
}
case ROCPROFILER_TRACER_RECORD: {
rocprofiler_plugin_tracer_extra_data_t tracer_extra_data;
tracer_extra_data.function_name = nullptr;
rocprofiler_record_tracer_t* tracer_record = const_cast<rocprofiler_record_tracer_t*>(
reinterpret_cast<const rocprofiler_record_tracer_t*>(begin));
FlushTracerRecord(*tracer_record, session_id, tracer_extra_data, buffer_id);
FlushTracerRecord(*tracer_record, session_id, buffer_id);
break;
}
case ROCPROFILER_ATT_TRACER_RECORD: {
@@ -406,16 +396,16 @@ class file_plugin_t {
return 0;
}
bool is_valid() const { return valid_; }
bool is_valid() const { return valid_; }
private:
bool valid_{false};
private:
bool valid_{false};
output_file_t roctx_file_{"roctx_trace.txt"}, hsa_api_file_{"hsa_api_trace.txt"},
hip_api_file_{"hip_api_trace.txt"}, hip_activity_file_{"hcc_ops_trace.txt"},
hsa_async_copy_file_{"async_copy_trace.txt"}, pc_sample_file_{"pcs_trace.txt"},
output_file_{"results.txt"};
};
output_file_t roctx_file_{"roctx_trace.txt"}, hsa_api_file_{"hsa_api_trace.txt"},
hip_api_file_{"hip_api_trace.txt"}, hip_activity_file_{"hcc_ops_trace.txt"},
hsa_async_copy_file_{"async_copy_trace.txt"}, pc_sample_file_{"pcs_trace.txt"},
output_file_{"results.txt"};
};
file_plugin_t* file_plugin = nullptr;
@@ -432,7 +422,7 @@ ROCPROFILER_EXPORT int rocprofiler_plugin_initialize(uint32_t rocprofiler_major_
file_plugin = new file_plugin_t();
if (file_plugin->is_valid()) return 0;
// The plugin failed to initialied, destroy it and return an error.
// The plugin failed to initialized, destroy it and return an error.
delete file_plugin;
file_plugin = nullptr;
return -1;
@@ -451,10 +441,9 @@ ROCPROFILER_EXPORT int rocprofiler_plugin_write_buffer_records(
return file_plugin->WriteBufferRecords(begin, end, session_id, buffer_id);
}
ROCPROFILER_EXPORT int rocprofiler_plugin_write_record(rocprofiler_record_tracer_t record,
rocprofiler_plugin_tracer_extra_data_t tracer_extra_data){
ROCPROFILER_EXPORT int rocprofiler_plugin_write_record(rocprofiler_record_tracer_t record) {
if (!file_plugin || !file_plugin->is_valid()) return -1;
if (record.header.id.handle == 0) return 0;
file_plugin->FlushTracerRecord(record, rocprofiler_session_id_t{0}, tracer_extra_data, rocprofiler_buffer_id_t{0});
file_plugin->FlushTracerRecord(record, rocprofiler_session_id_t{0}, rocprofiler_buffer_id_t{0});
return 0;
}
+68 -83
Wyświetl plik
@@ -73,15 +73,15 @@ static std::string output_file_name;
std::string get_kernel_name(rocprofiler_record_profiler_t& profiler_record) {
std::string kernel_name = "";
size_t name_length = 1;
CHECK_ROCPROFILER(rocprofiler_query_kernel_info_size(ROCPROFILER_KERNEL_NAME, profiler_record.kernel_id,
&name_length));
CHECK_ROCPROFILER(rocprofiler_query_kernel_info_size(ROCPROFILER_KERNEL_NAME,
profiler_record.kernel_id, &name_length));
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
#pragma GCC diagnostic ignored "-Wstringop-overread"
if (name_length > 1) {
const char* kernel_name_c = nullptr;
CHECK_ROCPROFILER(rocprofiler_query_kernel_info(ROCPROFILER_KERNEL_NAME, profiler_record.kernel_id,
&kernel_name_c));
CHECK_ROCPROFILER(rocprofiler_query_kernel_info(ROCPROFILER_KERNEL_NAME,
profiler_record.kernel_id, &kernel_name_c));
if (kernel_name_c && strlen(kernel_name_c) > 1)
kernel_name = rocmtools::cxx_demangle(strdup(kernel_name_c));
}
@@ -323,9 +323,9 @@ class perfetto_plugin_t {
&name_length));
if (name_length > 1) {
const char* name_c = nullptr;
CHECK_ROCPROFILER(
rocprofiler_query_counter_info(session_id, ROCPROFILER_COUNTER_NAME,
profiler_record.counters[i].counter_handler, &name_c));
CHECK_ROCPROFILER(rocprofiler_query_counter_info(
session_id, ROCPROFILER_COUNTER_NAME, profiler_record.counters[i].counter_handler,
&name_c));
perfetto::CounterTrack counters_track = get_counter_track_fn(std::string(name_c));
TRACE_COUNTER("COUNTERS", counters_track, profiler_record.timestamps.begin.value,
@@ -340,9 +340,8 @@ class perfetto_plugin_t {
return 0;
}
int FlushTracerRecord(rocprofiler_record_tracer_t tracer_record,
rocprofiler_session_id_t session_id,
rocprofiler_plugin_tracer_extra_data_t tracer_extra_data) {
int FlushTracerRecord(rocprofiler_record_tracer_t tracer_record,
rocprofiler_session_id_t session_id) {
std::lock_guard<std::mutex> lock(writing_lock);
if (!tracing_session_) rocmtools::warning("Tracing session is deleted!\n");
std::string kernel_name;
@@ -426,34 +425,17 @@ int FlushTracerRecord(rocprofiler_record_tracer_t tracer_record,
}
auto& roctx_track = roctx_track_it->second;
roctx_id = tracer_record.operation_id.id;
if (reinterpret_cast<const char*>(tracer_record.api_data_handle.handle))
roctx_message = std::string(reinterpret_cast<const char*>(tracer_record.api_data_handle.handle));
if (tracer_record.phase == ROCPROFILER_PHASE_NONE) {
if (tracer_record.operation_id.id == 1) {
perfetto::StaticString roctx_message_pft(
(!roctx_message.empty() ? roctx_message.c_str() : ""));
TRACE_EVENT_BEGIN("ROCTX_API", roctx_message_pft, roctx_track,
tracer_record.timestamps.begin.value, "Timestamp(ns)",
tracer_record.timestamps.begin.value, "RocTx ID", roctx_id);
roctx_track_entries_++;
} else {
TRACE_EVENT_END("ROCTX_API", roctx_track, tracer_record.timestamps.begin.value);
roctx_track_entries_--;
}
roctx_message = std::string(reinterpret_cast<const char*>(tracer_record.name));
if (tracer_record.operation_id.id == 1) {
perfetto::StaticString roctx_message_pft(
(!roctx_message.empty() ? roctx_message.c_str() : ""));
TRACE_EVENT_BEGIN("ROCTX_API", roctx_message_pft, roctx_track,
tracer_record.timestamps.begin.value, "Timestamp(ns)",
tracer_record.timestamps.begin.value, "RocTx ID", roctx_id);
roctx_track_entries_++;
} else {
rocprofiler_timestamp_t timestamp;
rocprofiler_get_timestamp(&timestamp);
if (tracer_record.operation_id.id == 1) {
perfetto::StaticString roctx_message_pft(
(!roctx_message.empty() ? roctx_message.c_str() : ""));
TRACE_EVENT_BEGIN("ROCTX_API", roctx_message_pft, roctx_track, timestamp.value,
"Timestamp(ns)", timestamp.value, "RocTx ID", roctx_id);
roctx_track_entries_++;
} else {
TRACE_EVENT_END("ROCTX_API", roctx_track, timestamp.value);
roctx_track_entries_--;
}
TRACE_EVENT_END("ROCTX_API", roctx_track, tracer_record.timestamps.begin.value);
roctx_track_entries_--;
}
break;
}
@@ -481,16 +463,31 @@ int FlushTracerRecord(rocprofiler_record_tracer_t tracer_record,
}
}
auto& hsa_track = hsa_track_it->second;
function_name = tracer_extra_data.function_name;
rocprofiler_timestamp_t timestamp;
rocprofiler_get_timestamp(&timestamp);
size_t function_name_size;
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info_size(
rocprofiler_session_id_t{0}, ROCPROFILER_HSA_FUNCTION_NAME,
tracer_record.api_data_handle, tracer_record.operation_id, &function_name_size));
if (function_name_size > 1) {
char* function_name_str = new char[function_name_size];
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info(
rocprofiler_session_id_t{0}, ROCPROFILER_HSA_FUNCTION_NAME,
tracer_record.api_data_handle, tracer_record.operation_id, &function_name_str));
function_name = function_name_str;
} else {
function_name = "Unknown";
}
if (tracer_record.phase == ROCPROFILER_PHASE_ENTER)
TRACE_EVENT_BEGIN("HSA_API", perfetto::StaticString(function_name), hsa_track,
timestamp.value,
tracer_record.timestamps.begin.value,
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
if (tracer_record.phase == ROCPROFILER_PHASE_EXIT)
TRACE_EVENT_END("HSA_API", hsa_track, timestamp.value);
TRACE_EVENT_END("HSA_API", hsa_track, tracer_record.timestamps.end.value);
if (tracer_record.phase == ROCPROFILER_PHASE_NONE) {
TRACE_EVENT_BEGIN("HSA_API", perfetto::StaticString(function_name), hsa_track,
tracer_record.timestamps.begin.value,
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
TRACE_EVENT_END("HSA_API", hsa_track, tracer_record.timestamps.end.value);
}
break;
}
case ACTIVITY_DOMAIN_HIP_API: {
@@ -518,25 +515,32 @@ int FlushTracerRecord(rocprofiler_record_tracer_t tracer_record,
}
}
auto& hip_track = hip_track_it->second;
function_name = tracer_extra_data.function_name;
if (tracer_extra_data.kernel_name != nullptr)
kernel_name = std::string(tracer_extra_data.kernel_name);
rocprofiler_timestamp_t timestamp;
rocprofiler_get_timestamp(&timestamp);
size_t function_name_size;
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info_size(
rocprofiler_session_id_t{0}, ROCPROFILER_HIP_FUNCTION_NAME,
tracer_record.api_data_handle, tracer_record.operation_id, &function_name_size));
if (function_name_size > 1) {
char* function_name_str = new char[function_name_size];
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info(
rocprofiler_session_id_t{0}, ROCPROFILER_HIP_FUNCTION_NAME,
tracer_record.api_data_handle, tracer_record.operation_id, &function_name_str));
function_name = function_name_str;
} else {
function_name = "Unknown";
}
if (tracer_record.phase == ROCPROFILER_PHASE_ENTER) {
if (kernel_name.size() > 0) {
TRACE_EVENT_BEGIN("HIP_API", perfetto::StaticString(function_name), hip_track,
timestamp.value, "Kernel Name", kernel_name,
tracer_record.timestamps.begin.value, "Kernel Name", kernel_name,
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
} else {
TRACE_EVENT_BEGIN("HIP_API", perfetto::StaticString(function_name), hip_track,
timestamp.value,
tracer_record.timestamps.begin.value,
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
}
}
if (tracer_record.phase == ROCPROFILER_PHASE_EXIT) {
TRACE_EVENT_END("HIP_API", hip_track, timestamp.value);
TRACE_EVENT_END("HIP_API", hip_track, tracer_record.timestamps.end.value);
}
if (tracer_record.phase == ROCPROFILER_PHASE_NONE) {
if (kernel_name.size() > 0) {
@@ -560,21 +564,6 @@ int FlushTracerRecord(rocprofiler_record_tracer_t tracer_record,
// TODO(aelwazir): Stream ID is removed from the API processing.
// Waiting for better implementation to get the stream id.
uint64_t stream_id = 0;
// size_t stream_id_str_size = 0;
// char* stream_id_str;
// CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info_size(
// session_id, ROCPROFILER_HIP_STREAM_ID, rocprofiler_tracer_api_data_handle_t{nullptr,
// 0}, rocprofiler_tracer_operation_id_t{(uint32_t)tracer_record.correlation_id.value},
// &stream_id_str_size));
// if (stream_id_str_size > 1) {
// stream_id_str = static_cast<char*>(malloc(stream_id_str_size * sizeof(char)));
// CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info(
// session_id, ROCPROFILER_HIP_STREAM_ID,
// rocprofiler_tracer_api_data_handle_t{nullptr, 0},
// rocprofiler_tracer_operation_id_t{(uint32_t)tracer_record.correlation_id.value},
// &stream_id_str));
// if (stream_id_str != nullptr) stream_id = std::stoll(stream_id_str);
// }
std::unordered_map<int, perfetto::Track>::iterator stream_track_it;
{
std::lock_guard<std::mutex> lock(stream_tracks_lock_);
@@ -689,24 +678,23 @@ int FlushTracerRecord(rocprofiler_record_tracer_t tracer_record,
}
int WriteBufferRecords(const rocprofiler_record_header_t* begin,
const rocprofiler_record_header_t* end, rocprofiler_session_id_t session_id,
rocprofiler_buffer_id_t buffer_id) {
const rocprofiler_record_header_t* end,
rocprofiler_session_id_t session_id, rocprofiler_buffer_id_t buffer_id) {
if (!tracing_session_) rocmtools::warning("Tracing session is deleted!\n");
while (begin < end) {
if (!begin) return 0;
switch (begin->kind) {
case ROCPROFILER_PROFILER_RECORD: {
rocprofiler_record_profiler_t* profiler_record = const_cast<rocprofiler_record_profiler_t*>(
reinterpret_cast<const rocprofiler_record_profiler_t*>(begin));
rocprofiler_record_profiler_t* profiler_record =
const_cast<rocprofiler_record_profiler_t*>(
reinterpret_cast<const rocprofiler_record_profiler_t*>(begin));
FlushProfilerRecord(*profiler_record, session_id);
break;
}
case ROCPROFILER_TRACER_RECORD: {
rocprofiler_plugin_tracer_extra_data_t tracer_extra_data;
tracer_extra_data.function_name = nullptr;
rocprofiler_record_tracer_t* tracer_record = const_cast<rocprofiler_record_tracer_t*>(
reinterpret_cast<const rocprofiler_record_tracer_t*>(begin));
FlushTracerRecord(*tracer_record, session_id, tracer_extra_data);
FlushTracerRecord(*tracer_record, session_id);
break;
}
default:
@@ -758,7 +746,7 @@ perfetto_plugin_t* perfetto_plugin = nullptr;
} // namespace
int rocprofiler_plugin_initialize(uint32_t rocprofiler_major_version,
uint32_t rocprofiler_minor_version) {
uint32_t rocprofiler_minor_version) {
if (rocprofiler_major_version != ROCPROFILER_VERSION_MAJOR ||
rocprofiler_minor_version > ROCPROFILER_VERSION_MINOR)
return -1;
@@ -779,19 +767,16 @@ void rocprofiler_plugin_finalize() {
perfetto_plugin = nullptr;
}
ROCPROFILER_EXPORT int rocprofiler_plugin_write_buffer_records(const rocprofiler_record_header_t* begin,
const rocprofiler_record_header_t* end,
rocprofiler_session_id_t session_id,
rocprofiler_buffer_id_t buffer_id) {
ROCPROFILER_EXPORT int rocprofiler_plugin_write_buffer_records(
const rocprofiler_record_header_t* begin, const rocprofiler_record_header_t* end,
rocprofiler_session_id_t session_id, rocprofiler_buffer_id_t buffer_id) {
if (!perfetto_plugin || !perfetto_plugin->IsValid()) return -1;
return perfetto_plugin->WriteBufferRecords(begin, end, session_id, buffer_id);
}
ROCPROFILER_EXPORT int rocprofiler_plugin_write_record(
rocprofiler_record_tracer_t record,
rocprofiler_plugin_tracer_extra_data_t tracer_extra_data) {
ROCPROFILER_EXPORT int rocprofiler_plugin_write_record(rocprofiler_record_tracer_t record) {
if (!perfetto_plugin || !perfetto_plugin->IsValid()) return -1;
if (record.header.id.handle == 0) return 0;
perfetto_plugin->FlushTracerRecord(record, rocprofiler_session_id_t{0}, tracer_extra_data);
perfetto_plugin->FlushTracerRecord(record, rocprofiler_session_id_t{0});
return 0;
}