SWDEV-403068 & SWDEV-403069: Memory Leaks fix for tracer

Change-Id: I57ce10ae616dda9529d22d4cee15556864760d6c
Этот коммит содержится в:
Ammar ELWazir
2023-05-25 23:13:51 +00:00
коммит произвёл Ammar Elwazir
родитель 2c34a6c166
Коммит 3ac57e167e
17 изменённых файлов: 296 добавлений и 1401 удалений
+22 -92
Просмотреть файл
@@ -159,9 +159,7 @@ class file_plugin_t {
}
public:
file_plugin_t() {
valid_ = true;
}
file_plugin_t() { valid_ = true; }
std::mutex writing_lock;
@@ -196,95 +194,27 @@ class file_plugin_t {
std::lock_guard<std::mutex> lock(writing_lock);
if (tracer_record.timestamps.end.value <= 0 && tracer_record.domain != ACTIVITY_DOMAIN_ROCTX)
return;
std::string function_name;
std::string kernel_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.name) {
kernel_name = rocprofiler::cxx_demangle(tracer_record.name);
std::string key = "\"";
std::size_t found = kernel_name.rfind(key);
while (found != std::string::npos) {
kernel_name.replace(found, key.length(), "'");
found = kernel_name.rfind(key, found - 1);
}
}
}
size_t function_name_size = 0;
char* function_name_c = nullptr;
if (tracer_record.domain == ACTIVITY_DOMAIN_HSA_API) {
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 (function_name_c) function_name = std::string(function_name_c);
}
}
if (tracer_record.domain == ACTIVITY_DOMAIN_HIP_API) {
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(
session_id, ROCPROFILER_HIP_FUNCTION_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &function_name_c));
if (function_name_c) function_name = std::string(function_name_c);
}
if (tracer_record.name) {
kernel_name = rocprofiler::cxx_demangle(std::string(tracer_record.name));
std::string key = "\"";
std::size_t found = kernel_name.rfind(key);
while (found != std::string::npos) {
kernel_name.replace(found, key.length(), "'");
found = kernel_name.rfind(key, found - 1);
}
// TODO: Change how this API returns a string.
}
}
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX) {
if (tracer_record.name) roctx_message = rocprofiler::cxx_demangle(tracer_record.name);
roctx_id = tracer_record.operation_id.id;
}
char* activity_name = nullptr;
if (tracer_record.domain == ACTIVITY_DOMAIN_HIP_OPS) {
if (tracer_record.api_data_handle.handle) {
kernel_name = rocprofiler::cxx_demangle(
const_cast<char*>(reinterpret_cast<const char*>(tracer_record.api_data_handle.handle)));
}
size_t activity_name_size = 0;
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info_size(
session_id, ROCPROFILER_HIP_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name_size));
if (activity_name_size > 1) {
activity_name = nullptr;
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info(
session_id, ROCPROFILER_HIP_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name));
}
}
if (tracer_record.domain == ACTIVITY_DOMAIN_HSA_OPS) {
size_t activity_name_size = 0;
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info_size(
session_id, ROCPROFILER_HSA_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name_size));
if (activity_name_size > 1) {
activity_name = nullptr;
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info(
session_id, ROCPROFILER_HSA_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name));
}
const char* operation_name_c = nullptr;
// ROCTX domain Operation ID doesn't have a name
// It depends on the user input of the roctx functions.
// ROCTX message is the tracer_record.name
if (tracer_record.domain != ACTIVITY_DOMAIN_ROCTX) {
CHECK_ROCPROFILER(rocprofiler_query_tracer_operation_name(
tracer_record.domain, tracer_record.operation_id, &operation_name_c));
}
output_file_t* output_file = get_output_file(output_type_t::TRACER, tracer_record.domain);
*output_file << "Domain(" << GetDomainName(tracer_record.domain) << "), ";
if (function_name.size() > 1) *output_file << "Function(" << function_name << "), ";
if (activity_name) *output_file << "Operation_Name(" << activity_name << "), ";
if (kernel_name.size() > 1) *output_file << "Kernel_Name(" << kernel_name.c_str() << "), ";
if (operation_name_c)
*output_file << ((tracer_record.domain == ACTIVITY_DOMAIN_HIP_API ||
tracer_record.domain == ACTIVITY_DOMAIN_HSA_API)
? "Function("
: "Operation_Name(")
<< operation_name_c << "), ";
if (tracer_record.name && tracer_record.domain != ACTIVITY_DOMAIN_ROCTX)
*output_file << "Kernel_Name("
<< rocprofiler::truncate_name(rocprofiler::cxx_demangle(tracer_record.name))
<< "), ";
if (tracer_record.domain != ACTIVITY_DOMAIN_ROCTX) {
*output_file << "Start_Timestamp(" << tracer_record.timestamps.begin.value << "), "
<< "End_Timestamp(" << tracer_record.timestamps.end.value << "), "
@@ -292,10 +222,10 @@ class file_plugin_t {
} else {
*output_file << "Timestamp(" << tracer_record.timestamps.begin.value << "), ";
}
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 (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX && tracer_record.external_id.id >= 0)
*output_file << "ROCTX_ID(" << tracer_record.external_id.id << "), ";
if (tracer_record.name && tracer_record.domain == ACTIVITY_DOMAIN_ROCTX)
*output_file << "ROCTX_Message(" << tracer_record.name << ")";
*output_file << std::endl;
}
+10 -66
Просмотреть файл
@@ -136,7 +136,7 @@ class RocTxEventRecord final : public TracerEventRecord<barectf_roctx_ctx> {
explicit RocTxEventRecord(const rocprofiler_record_tracer_t& record,
const rocprofiler_session_id_t session_id)
: TracerEventRecord<barectf_roctx_ctx>{record, GetRecordBeginClockVal(record)},
id_{record.operation_id.id} {
id_{record.external_id.id} {
msg_ = record.name ? record.name : "";
}
@@ -156,37 +156,13 @@ class HsaApiEventRecord : public TracerEventRecord<barectf_hsa_api_ctx> {
const rocprofiler_session_id_t session_id,
const std::uint64_t clock_val)
: TracerEventRecord<barectf_hsa_api_ctx>{record, clock_val},
api_data_{QueryApiData(record, session_id)} {}
api_data_{*(record.api_data.hsa)} {}
explicit HsaApiEventRecord(const rocprofiler_record_tracer_t& record,
const std::uint64_t clock_val, hsa_api_data_t& api_data)
: TracerEventRecord<barectf_hsa_api_ctx>{record, clock_val}, api_data_(api_data) {}
const hsa_api_data_t& GetApiData() const noexcept { return api_data_; }
private:
// Queries and returns the API data of the record `record` and session
// ID `session_id`.
static const hsa_api_data_t& QueryApiData(const rocprofiler_record_tracer_t& record,
const rocprofiler_session_id_t session_id) {
// Query size first (only for assertions).
[[maybe_unused]] std::size_t size = 0;
[[maybe_unused]] auto ret = rocprofiler_query_hsa_tracer_api_data_info_size(
session_id, ROCPROFILER_HSA_API_DATA, record.api_data_handle, record.operation_id, &size);
assert(ret == ROCPROFILER_STATUS_SUCCESS && "Query HSA API data size");
assert(size > 0);
// Query data (borrowed from the record).
char* data = nullptr;
ret = rocprofiler_query_hsa_tracer_api_data_info(
session_id, ROCPROFILER_HSA_API_DATA, record.api_data_handle, record.operation_id, &data);
assert(ret == ROCPROFILER_STATUS_SUCCESS && "Query HSA API data");
assert(data);
// Reinterpret as an HSA API data pointer.
return *reinterpret_cast<const hsa_api_data_t*>(data);
}
hsa_api_data_t api_data_;
};
@@ -228,7 +204,7 @@ class HipApiEventRecord : public TracerEventRecord<barectf_hip_api_ctx> {
const rocprofiler_session_id_t session_id,
const std::uint64_t clock_val)
: TracerEventRecord<barectf_hip_api_ctx>{record, clock_val},
api_data_{QueryApiData(record, session_id)},
api_data_{*(record.api_data.hip)},
kernel_name_{nullptr} {}
explicit HipApiEventRecord(const rocprofiler_record_tracer_t& record,
const std::uint64_t clock_val, hip_api_data_t& api_data,
@@ -240,30 +216,6 @@ class HipApiEventRecord : public TracerEventRecord<barectf_hip_api_ctx> {
const std::string& GetKernelName() const noexcept { return kernel_name_; }
private:
// Queries and returns the API data of the record `record` and session
// ID `session_id`.
static const hip_api_data_t& QueryApiData(const rocprofiler_record_tracer_t& record,
const rocprofiler_session_id_t session_id) {
// Query size first (only for assertions).
[[maybe_unused]] std::size_t size = 0;
[[maybe_unused]] auto ret = rocprofiler_query_hip_tracer_api_data_info_size(
session_id, ROCPROFILER_HIP_API_DATA, record.api_data_handle, record.operation_id, &size);
assert(ret == ROCPROFILER_STATUS_SUCCESS && "Query HIP API data size");
assert(size > 0);
// Query data (borrowed from the record).
char* data = nullptr;
ret = rocprofiler_query_hip_tracer_api_data_info(
session_id, ROCPROFILER_HIP_API_DATA, record.api_data_handle, record.operation_id, &data);
assert(ret == ROCPROFILER_STATUS_SUCCESS && "Query HIP API data");
assert(data);
// Reinterpret as an HIP API data pointer.
return *reinterpret_cast<const hip_api_data_t*>(data);
}
hip_api_data_t api_data_;
std::string kernel_name_;
};
@@ -370,15 +322,9 @@ class HipOpEventRecordBegin final : public ApiOpEventRecord {
//
// Returns an empty string if not available.
static std::string QueryKernelName(const rocprofiler_record_tracer_t& record) {
if (record.operation_id.id == 0) {
if (const auto api_handle = record.api_data_handle.handle) {
const auto str = reinterpret_cast<const char*>(api_handle);
if (std::strlen(str) > 1) {
// Return demangled version.
return rocprofiler::cxx_demangle(str);
}
}
if (record.name) {
// Return demangled version.
return rocprofiler::cxx_demangle(record.name);
}
return {};
@@ -640,14 +586,13 @@ void Plugin::HandleTracerRecord(const rocprofiler_record_tracer_t& record,
break;
case ACTIVITY_DOMAIN_HSA_API: {
/*If data is nullptr then the call is asynchromous*/
if (record.api_data_handle.handle == nullptr) {
if (record.api_data.hsa == nullptr) {
hsa_api_tracer_.AddEventRecord(
std::make_shared<const HsaApiEventRecordBegin>(record, session_id));
hsa_api_tracer_.AddEventRecord(
std::make_shared<const HsaApiEventRecordEnd>(record, session_id));
} else {
hsa_api_data_t hsa_api_data =
*reinterpret_cast<const hsa_api_data_t*>(record.api_data_handle.handle);
hsa_api_data_t hsa_api_data = *(record.api_data.hsa);
hsa_api_tracer_.AddEventRecord(
std::make_shared<const HsaApiEventRecordBegin>(record, hsa_api_data));
hsa_api_tracer_.AddEventRecord(
@@ -657,15 +602,14 @@ void Plugin::HandleTracerRecord(const rocprofiler_record_tracer_t& record,
}
case ACTIVITY_DOMAIN_HIP_API: {
/*If data is nullptr then the call is asynchromous*/
if (record.api_data_handle.handle == nullptr) {
if (record.api_data.hip == nullptr) {
hip_api_tracer_.AddEventRecord(
std::make_shared<const HipApiEventRecordBegin>(record, session_id));
hip_api_tracer_.AddEventRecord(
std::make_shared<const HipApiEventRecordEnd>(record, session_id));
} else {
std::string kernel_name;
hip_api_data_t hip_api_data =
*reinterpret_cast<const hip_api_data_t*>(record.api_data_handle.handle);
hip_api_data_t hip_api_data = *(record.api_data.hip);
if (record.name != nullptr)
kernel_name = rocprofiler::cxx_demangle(std::string(record.name));
else
+19 -90
Просмотреть файл
@@ -118,7 +118,7 @@ class file_plugin_t {
bPrintToStdout = true;
return;
}
if (output_dir == nullptr) output_dir = "./";
if (output_dir == nullptr) output_dir = ".";
fs::path output_prefix(output_dir);
if (!fs::is_directory(fs::status(output_prefix))) {
@@ -216,7 +216,7 @@ class file_plugin_t {
case ACTIVITY_DOMAIN_HIP_API: {
if (hip_api_header_written_.load(std::memory_order_relaxed)) return;
output_file = get_output_file(output_type_t::TRACER, ACTIVITY_DOMAIN_HIP_API);
*output_file << "Domain,Function,Kernel_Name,Start_Timestamp,End_Timestamp,Correlation_ID"
*output_file << "Record_ID,Domain,Function,Start_Timestamp,End_Timestamp,Correlation_ID"
<< std::endl;
*output_file << std::endl;
hip_api_header_written_.exchange(true, std::memory_order_release);
@@ -313,106 +313,35 @@ class file_plugin_t {
if (tracer_record.timestamps.end.value <= 0 && tracer_record.domain != ACTIVITY_DOMAIN_ROCTX)
return;
WriteHeader(output_type_t::TRACER, tracer_record.domain);
std::string function_name;
std::string kernel_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.name) {
kernel_name = rocprofiler::cxx_demangle(tracer_record.name);
std::string key = "\"";
std::size_t found = kernel_name.rfind(key);
while (found != std::string::npos) {
kernel_name.replace(found, key.length(), "'");
found = kernel_name.rfind(key, found - 1);
}
}
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX && tracer_record.name) {
roctx_message = tracer_record.name;
}
size_t function_name_size = 0;
char* function_name_c = nullptr;
if (tracer_record.domain == ACTIVITY_DOMAIN_HSA_API) {
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) {
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 (function_name_c) function_name = std::string(function_name_c);
}
const char* operation_name_c = nullptr;
// ROCTX domain Operation ID doesn't have a name
// It depends on the user input of the roctx functions.
// ROCTX message is the tracer_record.name
if (tracer_record.domain != ACTIVITY_DOMAIN_ROCTX) {
CHECK_ROCPROFILER(rocprofiler_query_tracer_operation_name(
tracer_record.domain, tracer_record.operation_id, &operation_name_c));
}
if (tracer_record.domain == ACTIVITY_DOMAIN_HIP_API) {
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(
session_id, ROCPROFILER_HIP_FUNCTION_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &function_name_c));
if (function_name_c) function_name = std::string(function_name_c);
}
if (tracer_record.name) {
kernel_name = rocprofiler::cxx_demangle(std::string(tracer_record.name));
std::string key = "\"";
std::size_t found = kernel_name.rfind(key);
while (found != std::string::npos) {
kernel_name.replace(found, key.length(), "'");
found = kernel_name.rfind(key, found - 1);
}
// TODO: Change how this API returns a string.
}
}
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX) {
if (tracer_record.name) roctx_message = rocprofiler::cxx_demangle(tracer_record.name);
roctx_id = tracer_record.operation_id.id;
}
char* activity_name = nullptr;
if (tracer_record.domain == ACTIVITY_DOMAIN_HIP_OPS) {
if (tracer_record.api_data_handle.handle) {
kernel_name = rocprofiler::cxx_demangle(
const_cast<char*>(reinterpret_cast<const char*>(tracer_record.api_data_handle.handle)));
}
size_t activity_name_size = 0;
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info_size(
session_id, ROCPROFILER_HIP_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name_size));
if (activity_name_size > 1) {
activity_name = nullptr;
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info(
session_id, ROCPROFILER_HIP_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name));
}
}
if (tracer_record.domain == ACTIVITY_DOMAIN_HSA_OPS) {
size_t activity_name_size = 0;
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info_size(
session_id, ROCPROFILER_HSA_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name_size));
if (activity_name_size > 1) {
activity_name = nullptr;
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info(
session_id, ROCPROFILER_HSA_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name));
}
}
// return;
output_file_t* output_file = get_output_file(output_type_t::TRACER, tracer_record.domain);
*output_file << GetDomainName(tracer_record.domain);
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX && roctx_id >= 0)
*output_file << "," << roctx_id;
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX && tracer_record.external_id.id >= 0)
*output_file << "," << tracer_record.external_id.id;
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX) {
if (roctx_message.size() > 1)
*output_file << ",\"" << roctx_message << "\"";
else
*output_file << ",";
}
if (function_name.size() > 1) *output_file << ",\"" << function_name << "\"";
if (activity_name) *output_file << ",\"" << activity_name << "\"";
if (kernel_name.size() > 1)
*output_file << ",\"" << kernel_name.c_str() << "\"";
else if (tracer_record.domain == ACTIVITY_DOMAIN_HIP_API ||
tracer_record.domain == ACTIVITY_DOMAIN_HIP_OPS)
if (operation_name_c) *output_file << ",\"" << operation_name_c << "\"";
if (tracer_record.name && tracer_record.domain != ACTIVITY_DOMAIN_ROCTX) {
*output_file << ",\"" << rocprofiler::cxx_demangle(tracer_record.name) << "\"";
} else if (tracer_record.domain == ACTIVITY_DOMAIN_HIP_OPS) {
*output_file << ",";
}
if (tracer_record.domain != ACTIVITY_DOMAIN_ROCTX) {
*output_file << "," << tracer_record.timestamps.begin.value << ","
<< tracer_record.timestamps.end.value;
+40 -158
Просмотреть файл
@@ -34,6 +34,7 @@
#include <string>
#include <functional>
#include <iostream>
#include <string_view>
#include <cxxabi.h>
#include <fcntl.h>
@@ -346,8 +347,15 @@ class perfetto_plugin_t {
std::lock_guard<std::mutex> lock(writing_lock);
if (!tracing_session_) rocprofiler::warning("Tracing session is deleted!\n");
std::string kernel_name;
const char* function_name;
char* activity_name;
const char* operation_name_c = nullptr;
// ROCTX domain Operation ID doesn't have a name
// It depends on the user input of the roctx functions.
// ROCTX message is the tracer_record.name
if (tracer_record.domain != ACTIVITY_DOMAIN_ROCTX) {
CHECK_ROCPROFILER(rocprofiler_query_tracer_operation_name(
tracer_record.domain, tracer_record.operation_id, &operation_name_c));
if (!operation_name_c) operation_name_c = "Unknown Operation";
}
std::string roctx_message;
uint64_t roctx_id = 0;
uint64_t thread_id = tracer_record.thread_id.value;
@@ -447,7 +455,7 @@ class perfetto_plugin_t {
}
}
auto& roctx_track = roctx_track_it->second;
roctx_id = tracer_record.operation_id.id;
roctx_id = tracer_record.external_id.id;
roctx_message = tracer_record.name ? tracer_record.name : "";
if (tracer_record.operation_id.id == 1) {
perfetto::StaticString roctx_message_pft(
@@ -486,27 +494,14 @@ class perfetto_plugin_t {
}
}
auto& hsa_track = hsa_track_it->second;
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,
TRACE_EVENT_BEGIN("HSA_API", perfetto::StaticString(operation_name_c), hsa_track,
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, tracer_record.timestamps.end.value);
if (tracer_record.phase == ROCPROFILER_PHASE_NONE) {
TRACE_EVENT_BEGIN("HSA_API", perfetto::StaticString(function_name), hsa_track,
TRACE_EVENT_BEGIN("HSA_API", perfetto::StaticString(operation_name_c), 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);
@@ -538,43 +533,16 @@ class perfetto_plugin_t {
}
}
auto& hip_track = hip_track_it->second;
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,
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,
tracer_record.timestamps.begin.value,
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
}
}
if (tracer_record.phase == ROCPROFILER_PHASE_EXIT) {
if (tracer_record.phase == ROCPROFILER_PHASE_ENTER)
TRACE_EVENT_BEGIN("HIP_API", perfetto::StaticString(operation_name_c), hip_track,
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, tracer_record.timestamps.end.value);
}
if (tracer_record.phase == ROCPROFILER_PHASE_NONE) {
if (kernel_name.size() > 0) {
TRACE_EVENT_BEGIN("HIP_API", perfetto::StaticString(function_name), hip_track,
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,
tracer_record.timestamps.begin.value,
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
}
TRACE_EVENT_BEGIN("HIP_API", perfetto::StaticString(operation_name_c), hip_track,
tracer_record.timestamps.begin.value,
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
TRACE_EVENT_END("HIP_API", hip_track, tracer_record.timestamps.end.value);
}
break;
@@ -584,36 +552,9 @@ class perfetto_plugin_t {
break;
}
case ACTIVITY_DOMAIN_HIP_OPS: {
// TODO(aelwazir): Stream ID is removed from the API processing.
// Waiting for better implementation to get the stream id.
// uint64_t stream_id = 0;
// std::unordered_map<int, perfetto::Track>::iterator stream_track_it;
// {
// std::lock_guard<std::mutex> lock(stream_tracks_lock_);
// uint64_t stream_track_id = (stream_id + STREAM_CONSTANT) *
// (tracer_record.agent_id.handle + 2) * (machine_id_ + 2);
// stream_track_it = stream_tracks_.find(stream_track_id);
// if (stream_track_it == stream_tracks_.end()) {
// /* Create a new perfetto::Track */
// stream_track_it =
// stream_tracks_.emplace(stream_track_id, perfetto::Track(stream_track_id,
// gpu_track))
// .first;
// auto stream_desc = stream_track_it->second.Serialize();
// std::string stream_str = rocprofiler::string_printf("Stream %d", stream_id);
// stream_desc.set_name(stream_str);
// perfetto::TrackEvent::SetTrackDescriptor(stream_track_it->second, stream_desc);
// track_ids_used_.emplace_back(stream_track_id);
// }
// }
// auto& stream_track = stream_track_it->second;
rocprofiler_timestamp_t timestamp;
rocprofiler_get_timestamp(&timestamp);
std::string::size_type pos = std::string::npos;
if (tracer_record.api_data_handle.handle && tracer_record.api_data_handle.size > 1) {
kernel_name = rocprofiler::cxx_demangle(
strdup(reinterpret_cast<const char*>(tracer_record.api_data_handle.handle)));
if (tracer_record.name) {
kernel_name = rocprofiler::cxx_demangle(tracer_record.name);
TRACE_EVENT_BEGIN(
"HIP_OPS",
perfetto::StaticString(strdup(rocprofiler::truncate_name(kernel_name).c_str())),
@@ -621,94 +562,35 @@ class perfetto_plugin_t {
tracer_record.agent_id.handle, "Process ID", GetPid(), "Kernel Name", kernel_name,
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
} else {
size_t activity_name_size = 0;
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info_size(
session_id, ROCPROFILER_HIP_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name_size));
if (activity_name_size > 1) {
activity_name = nullptr;
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info(
session_id, ROCPROFILER_HIP_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name));
} else {
activity_name = const_cast<char*>(std::string("N/A").c_str());
}
pos = std::string(activity_name).find("Copy");
if (tracer_record.phase == ROCPROFILER_PHASE_NONE) {
if (std::string::npos == pos)
TRACE_EVENT_BEGIN("HIP_OPS", perfetto::StaticString(activity_name), gpu_track,
tracer_record.timestamps.begin.value, "Process ID", GetPid(),
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
else
TRACE_EVENT_BEGIN("MEM_COPIES", perfetto::StaticString(activity_name),
mem_copies_track, tracer_record.timestamps.begin.value,
"Process ID", GetPid(),
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
} else if (tracer_record.phase == ROCPROFILER_PHASE_ENTER) {
if (std::string::npos == pos)
TRACE_EVENT_BEGIN("HIP_OPS", perfetto::StaticString(activity_name), gpu_track,
timestamp.value, "Process ID", GetPid(),
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
else
TRACE_EVENT_BEGIN("MEM_COPIES", perfetto::StaticString(activity_name),
mem_copies_track, timestamp.value, "Process ID", GetPid(),
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
}
}
if (tracer_record.phase == ROCPROFILER_PHASE_NONE) {
// MEM Copies are not correlated to GPUs, so they need a special track
pos = operation_name_c ? std::string_view(operation_name_c).find("Copy")
: std::string::npos;
if (std::string::npos == pos)
TRACE_EVENT_END("HIP_OPS", gpu_track, tracer_record.timestamps.end.value);
TRACE_EVENT_BEGIN("HIP_OPS", perfetto::StaticString(operation_name_c), gpu_track,
tracer_record.timestamps.begin.value, "Process ID", GetPid(),
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
else
TRACE_EVENT_END("MEM_COPIES", mem_copies_track, tracer_record.timestamps.end.value);
} else if (tracer_record.phase == ROCPROFILER_PHASE_EXIT) {
if (std::string::npos == pos)
TRACE_EVENT_END("HIP_OPS", gpu_track, timestamp.value);
else
TRACE_EVENT_END("MEM_COPIES", mem_copies_track, timestamp.value);
TRACE_EVENT_BEGIN("MEM_COPIES", perfetto::StaticString(operation_name_c),
mem_copies_track, tracer_record.timestamps.begin.value, "Process ID",
GetPid(),
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
}
if (std::string::npos == pos)
TRACE_EVENT_END("HIP_OPS", gpu_track, tracer_record.timestamps.end.value);
else
TRACE_EVENT_END("MEM_COPIES", mem_copies_track, tracer_record.timestamps.end.value);
break;
}
case ACTIVITY_DOMAIN_HSA_OPS: {
// std::pair<int, uint64_t> gpu_queue_id =
// std::make_pair(tracer_record.agent_id.handle, tracer_record.queue_id.handle);
// std::unordered_map<int, perfetto::Track>::iterator queue_track_it;
// {
// std::lock_guard<std::mutex> lock(queue_tracks_lock_);
// uint64_t queue_track_id = (tracer_record.queue_id.handle + 2) *
// (tracer_record.agent_id.handle + 2) * (machine_id_ + 2);
// queue_track_it = queue_tracks_.find(queue_track_id);
// if (queue_track_it == queue_tracks_.end()) {
// /* Create a new perfetto::Track */
// queue_track_it =
// queue_tracks_.emplace(queue_track_id, perfetto::Track(queue_track_id, gpu_track))
// .first;
// auto queue_desc = queue_track_it->second.Serialize();
// std::string queue_str = rocprofiler::string_printf("Queue %ld", gpu_queue_id.second);
// queue_desc.set_name(queue_str);
// perfetto::TrackEvent::SetTrackDescriptor(queue_track_it->second, queue_desc);
// }
// track_ids_used_.emplace_back(queue_track_id);
// }
// auto& queue_track = queue_track_it->second;
size_t activity_name_size = 0;
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info_size(
session_id, ROCPROFILER_HSA_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name_size));
if (activity_name_size > 1) {
activity_name = nullptr;
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info(
session_id, ROCPROFILER_HSA_ACTIVITY_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &activity_name));
}
TRACE_EVENT_BEGIN("MEM_COPIES", perfetto::StaticString(activity_name), mem_copies_track,
TRACE_EVENT_BEGIN("MEM_COPIES", perfetto::StaticString(operation_name_c), mem_copies_track,
tracer_record.timestamps.begin.value, "Process ID", GetPid(),
perfetto::Flow::ProcessScoped(tracer_record.correlation_id.value));
TRACE_EVENT_END("MEM_COPIES", mem_copies_track, tracer_record.timestamps.end.value);
break;
}
default: {
rocprofiler::warning("ignored record for domain %d", tracer_record.domain);
rocprofiler::warning("Ignored record for domain %d", tracer_record.domain);
break;
}
}