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

Change-Id: I57ce10ae616dda9529d22d4cee15556864760d6c
This commit is contained in:
Ammar ELWazir
2023-05-25 23:13:51 +00:00
committed by Ammar Elwazir
parent 2c34a6c166
commit 3ac57e167e
17 changed files with 296 additions and 1401 deletions
+13 -27
View File
@@ -401,7 +401,7 @@ int TracerCallback(activity_domain_t domain, uint32_t operation_id, void* data)
rocprofiler_record.domain = domain;
rocprofiler_record.external_id = rocprofiler_tracer_external_id_t{};
rocprofiler_record.operation_id = rocprofiler_tracer_operation_id_t{record->kind};
rocprofiler_record.api_data_handle = rocprofiler_tracer_api_data_handle_t{};
rocprofiler_record.api_data = rocprofiler_tracer_api_data_t{};
rocprofiler_record.correlation_id =
rocprofiler_tracer_activity_correlation_id_t{record->correlation_id};
rocprofiler_record.timestamps = rocprofiler_record_header_timestamp_t{
@@ -411,21 +411,14 @@ int TracerCallback(activity_domain_t domain, uint32_t operation_id, void* data)
rocprofiler_record.thread_id = rocprofiler_thread_id_t{GetTid()};
rocprofiler_record.phase = ROCPROFILER_PHASE_NONE;
if (operation_id == HIP_OP_ID_DISPATCH && record->kernel_name != nullptr) {
rocprofiler_record.api_data_handle.handle = strdup(record->kernel_name);
void* initial_handle = const_cast<void*>(rocprofiler_record.api_data_handle.handle);
rocprofiler_record.api_data_handle.size = (strlen(record->kernel_name) + 1);
rocprofiler_record.name = record->kernel_name;
size_t kernel_name_size = (strlen(record->kernel_name) + 1);
rocprofiler::GetROCProfilerSingleton()
->GetSession((*pool)->session_id)
->GetBuffer((*pool)->buffer_id)
->AddRecord(rocprofiler_record, rocprofiler_record.api_data_handle.handle,
rocprofiler_record.api_data_handle.size,
[initial_handle](auto& rocprofiler_record, const void* data) {
if (rocprofiler_record.api_data_handle.handle == initial_handle &&
data != initial_handle) {
free(initial_handle);
}
rocprofiler_record.api_data_handle.handle =
static_cast<const char*>(data);
->AddRecord(rocprofiler_record, rocprofiler_record.name, kernel_name_size,
[](auto& rocprofiler_record, const void* data) {
rocprofiler_record.name = static_cast<const char*>(data);
});
} else {
rocprofiler::GetROCProfilerSingleton()
@@ -469,7 +462,7 @@ int TracerCallback(activity_domain_t domain, uint32_t operation_id, void* data)
rocprofiler_record.domain = domain;
rocprofiler_record.external_id = rocprofiler_tracer_external_id_t{0};
rocprofiler_record.operation_id = rocprofiler_tracer_operation_id_t{record->op};
rocprofiler_record.api_data_handle = rocprofiler_tracer_api_data_handle_t{};
rocprofiler_record.api_data = rocprofiler_tracer_api_data_t{};
rocprofiler_record.correlation_id =
rocprofiler_tracer_activity_correlation_id_t{record->correlation_id};
rocprofiler_record.timestamps = rocprofiler_record_header_timestamp_t{
@@ -479,22 +472,15 @@ int TracerCallback(activity_domain_t domain, uint32_t operation_id, void* data)
rocprofiler_record.thread_id = rocprofiler_thread_id_t{GetTid()};
rocprofiler_record.phase = ROCPROFILER_PHASE_NONE;
if (record->kernel_name != nullptr && record->op == HSA_OP_ID_DISPATCH) {
rocprofiler_record.api_data_handle.handle = strdup(record->kernel_name);
void* initial_handle = const_cast<void*>(rocprofiler_record.api_data_handle.handle);
rocprofiler_record.api_data_handle.size = strlen(record->kernel_name) + 1;
size_t kernel_name_size = strlen(record->kernel_name) + 1;
rocprofiler::GetROCProfilerSingleton()
->GetSession((*pool)->session_id)
->GetBuffer((*pool)->buffer_id)
->AddRecord(rocprofiler_record, rocprofiler_record.api_data_handle.handle,
rocprofiler_record.api_data_handle.size,
[initial_handle](auto& rocprofiler_record, const void* data) {
if (rocprofiler_record.api_data_handle.handle == initial_handle &&
data != initial_handle) {
free(initial_handle);
}
rocprofiler_record.api_data_handle.handle =
static_cast<const char*>(data);
});
->AddRecord(
rocprofiler_record, record->kernel_name, kernel_name_size,
[](auto& rocprofiler_record, const void* data) {
rocprofiler_record.name = static_cast<const char*>(data);
});
} else {
rocprofiler::GetROCProfilerSingleton()
->GetSession((*pool)->session_id)
+30 -223
View File
@@ -7,10 +7,12 @@
#include <atomic>
#include <cassert>
#include <cstddef>
#include <cstring>
#include <map>
#include <mutex>
#include <utility>
#include "core/session/tracer/src/roctracer.h"
#include "src/api/rocprofiler_singleton.h"
#include "src/utils/helper.h"
#include "src/core/hsa/hsa_support.h"
@@ -19,21 +21,18 @@
namespace rocprofiler {
namespace tracer {
char* GetApiCallFunctionName(rocprofiler_tracer_activity_domain_t domain,
rocprofiler_tracer_operation_id_t operation_id) {
return const_cast<char*>(roctracer_op_string(domain, operation_id.id));
const char* GetApiCallOperationName(rocprofiler_tracer_activity_domain_t domain,
rocprofiler_tracer_operation_id_t operation_id) {
return roctracer_op_string(domain, operation_id.id);
}
size_t GetApiCallFunctionNameSize(rocprofiler_tracer_activity_domain_t domain,
rocprofiler_tracer_operation_id_t operation_id) {
return std::string(const_cast<char*>(roctracer_op_string(domain, operation_id.id))).size();
bool GetApiCallOperationID(rocprofiler_tracer_activity_domain_t domain, const char* name,
rocprofiler_tracer_operation_id_t* operation_id) {
assert(name != nullptr && operation_id != nullptr);
roctracer_op_code(domain, name, &(operation_id->id), nullptr);
return true;
}
std::mutex stream_ids_map_lock;
std::map<uint64_t, std::pair<uint64_t, uint64_t>> stream_ids;
std::map<uint64_t, uint64_t> used_stream_ids;
std::atomic<uint64_t> stream_count{1};
uint32_t GetPid() {
static uint32_t pid = syscall(__NR_getpid);
return pid;
@@ -110,199 +109,28 @@ Tracer::~Tracer() {
std::lock_guard<std::mutex> lock(tracer_lock_);
is_active_.exchange(false, std::memory_order_release);
// tracer_lock_.unlock();
}
std::mutex& Tracer::GetTracerLock() { return tracer_lock_; }
// TODO(aelwazir): To be implemented from here
bool Tracer::FindROCTxApiData(rocprofiler_tracer_api_data_handle_t api_data_handler) {
// std::lock_guard<std::mutex> lock(tracer_lock_);
return true;
}
bool Tracer::FindHSAApiData(rocprofiler_tracer_api_data_handle_t api_data_handler) {
// std::lock_guard<std::mutex> lock(tracer_lock_);
return true;
}
bool Tracer::FindHIPApiData(rocprofiler_tracer_api_data_handle_t api_data_handler) {
// std::lock_guard<std::mutex> lock(tracer_lock_);
return true;
}
size_t Tracer::GetROCTxApiDataInfoSize(rocprofiler_tracer_roctx_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id) {
const roctx_api_data_t* roctx_data =
reinterpret_cast<const roctx_api_data_t*>(api_data_id.handle);
switch (kind) {
case ROCPROFILER_ROCTX_MESSAGE: {
if (roctx_data && roctx_data->args.message)
return strlen(reinterpret_cast<const roctx_api_data_t*>(api_data_id.handle)->args.message) +
1;
else
return 0;
}
case ROCPROFILER_ROCTX_ID: {
if (roctx_data && roctx_data->args.id >= 0)
return std::to_string(roctx_data->args.id).size() + 1;
else
return 0;
}
default:
warning("ROCTX API Data Not Supported!");
}
return 0;
}
size_t Tracer::GetHSAApiDataInfoSize(rocprofiler_tracer_hsa_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id) {
switch (kind) {
case ROCPROFILER_HSA_FUNCTION_NAME: {
return strlen(roctracer_op_string(ACTIVITY_DOMAIN_HSA_API, operation_id.id)) + 1;
}
case ROCPROFILER_HSA_ACTIVITY_NAME: {
return strlen(roctracer_op_string(ACTIVITY_DOMAIN_HSA_OPS, operation_id.id)) + 1;
}
case ROCPROFILER_HSA_API_DATA: {
return api_data_id.size;
}
default:
warning("HSA API Data Not Supported!");
}
return 0;
}
size_t Tracer::GetHIPApiDataInfoSize(rocprofiler_tracer_hip_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id) {
switch (kind) {
case ROCPROFILER_HIP_KERNEL_NAME: {
hip_api_data_t* hip_data =
const_cast<hip_api_data_t*>(reinterpret_cast<const hip_api_data_t*>(api_data_id.handle));
if (api_data_id.handle && hip_data) {
auto kernel_name = GetHipKernelName(operation_id.id, hip_data);
if (kernel_name) return kernel_name->size() + 1;
}
return 0;
}
case ROCPROFILER_HIP_FUNCTION_NAME: {
return strlen(roctracer_op_string(ACTIVITY_DOMAIN_HIP_API, operation_id.id)) + 1;
}
case ROCPROFILER_HIP_ACTIVITY_NAME: {
return strlen(roctracer_op_string(ACTIVITY_DOMAIN_HIP_OPS, operation_id.id)) + 1;
}
case ROCPROFILER_HIP_STREAM_ID: {
// std::lock_guard<std::mutex> lock(stream_ids_map_lock);
// if (!stream_ids.empty() && stream_ids.find(operation_id.id) != stream_ids.end())
// return std::to_string(stream_ids.at(operation_id.id).second).size() + 1;
// else
// return 0;
warning("Stream ID is not supported!");
}
case ROCPROFILER_HIP_API_DATA: {
return api_data_id.size;
}
default:
warning("HIP API Data Not Supported!");
}
return 0;
}
char* Tracer::GetROCTxApiDataInfo(rocprofiler_tracer_roctx_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id) {
switch (kind) {
case ROCPROFILER_ROCTX_MESSAGE: {
return const_cast<char*>(
reinterpret_cast<const roctx_api_data_t*>(api_data_id.handle)->args.message);
}
case ROCPROFILER_ROCTX_ID: {
const roctx_api_data_t* roctx_data =
reinterpret_cast<const roctx_api_data_t*>(api_data_id.handle);
if (roctx_data && roctx_data->args.id >= 0)
return strdup(std::to_string(roctx_data->args.id).c_str());
else
return nullptr;
}
default:
warning("HSA API Data Not Supported!");
}
return nullptr;
}
char* Tracer::GetHSAApiDataInfo(rocprofiler_tracer_hsa_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id) {
switch (kind) {
case ROCPROFILER_HSA_FUNCTION_NAME: {
return const_cast<char*>(roctracer_op_string(ACTIVITY_DOMAIN_HSA_API, operation_id.id));
}
case ROCPROFILER_HSA_ACTIVITY_NAME: {
return const_cast<char*>(roctracer_op_string(ACTIVITY_DOMAIN_HSA_OPS, operation_id.id));
}
case ROCPROFILER_HSA_API_DATA: {
return const_cast<char*>(reinterpret_cast<const char*>(api_data_id.handle));
}
default:
warning("HSA API Data Not Supported!");
}
return nullptr;
}
char* Tracer::GetHIPApiDataInfo(rocprofiler_tracer_hip_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id) {
switch (kind) {
case ROCPROFILER_HIP_KERNEL_NAME: {
std::optional<std::string> kernel_name = GetHipKernelName(
operation_id.id,
const_cast<hip_api_data_t*>(reinterpret_cast<const hip_api_data_t*>(api_data_id.handle)));
if (kernel_name && kernel_name->find(" ") == std::string::npos) {
return strdup(kernel_name->c_str());
}
return nullptr;
}
case ROCPROFILER_HIP_FUNCTION_NAME: {
return const_cast<char*>(roctracer_op_string(ACTIVITY_DOMAIN_HIP_API, operation_id.id));
}
case ROCPROFILER_HIP_ACTIVITY_NAME: {
return const_cast<char*>(roctracer_op_string(ACTIVITY_DOMAIN_HIP_OPS, operation_id.id));
}
case ROCPROFILER_HIP_STREAM_ID: {
// std::lock_guard<std::mutex> lock(stream_ids_map_lock);
// if (!stream_ids.empty() && stream_ids.find(operation_id.id) != stream_ids.end())
// return strdup(
// const_cast<char*>(std::to_string(stream_ids.at(operation_id.id).second).c_str()));
// else
// return nullptr;
warning("Stream ID is not supported!");
}
case ROCPROFILER_HIP_API_DATA: {
return const_cast<char*>(reinterpret_cast<const char*>(api_data_id.handle));
}
default:
warning("HIP API Data Not Supported!");
}
return nullptr;
}
// TODO(aelwazir): Till here
void api_callback(activity_domain_t domain, uint32_t cid, const void* callback_data, void* args) {
api_callback_data_t* args_data = reinterpret_cast<api_callback_data_t*>(args);
rocprofiler_tracer_api_data_t api_data{};
if (args_data && rocprofiler::GetROCProfilerSingleton() &&
rocprofiler::GetROCProfilerSingleton()->GetSession(args_data->session_id) &&
rocprofiler::GetROCProfilerSingleton()->GetSession(args_data->session_id)->GetTracer()) {
switch (domain) {
case ACTIVITY_DOMAIN_ROCTX: {
const roctx_api_data_t* data = reinterpret_cast<const roctx_api_data_t*>(callback_data);
api_data.roctx = data;
args_data->user_sync_callback(
rocprofiler_record_tracer_t{
rocprofiler_record_header_t{
ROCPROFILER_TRACER_RECORD,
rocprofiler_record_id_t{rocprofiler::GetROCProfilerSingleton()->GetUniqueRecordId()}},
rocprofiler_tracer_external_id_t{0}, ACTIVITY_DOMAIN_ROCTX,
rocprofiler_tracer_operation_id_t{cid},
rocprofiler_tracer_api_data_handle_t{callback_data, sizeof(*data)},
rocprofiler_record_id_t{
rocprofiler::GetROCProfilerSingleton()->GetUniqueRecordId()}},
rocprofiler_tracer_external_id_t{data ? data->args.id : 0}, ACTIVITY_DOMAIN_ROCTX,
rocprofiler_tracer_operation_id_t{cid}, api_data,
rocprofiler_tracer_activity_correlation_id_t{0},
rocprofiler_record_header_timestamp_t{roctracer::hsa_support::timestamp_ns(),
rocprofiler_timestamp_t{0}},
@@ -313,15 +141,16 @@ void api_callback(activity_domain_t domain, uint32_t cid, const void* callback_d
case ACTIVITY_DOMAIN_HSA_API: {
hsa_api_data_t* data =
const_cast<hsa_api_data_t*>(reinterpret_cast<const hsa_api_data_t*>(callback_data));
api_data.hsa = data;
if (data->phase == ACTIVITY_API_PHASE_ENTER) {
args_data->user_sync_callback(
rocprofiler_record_tracer_t{
rocprofiler_record_header_t{
ROCPROFILER_TRACER_RECORD,
rocprofiler_record_id_t{rocprofiler::GetROCProfilerSingleton()->GetUniqueRecordId()}},
rocprofiler_record_id_t{
rocprofiler::GetROCProfilerSingleton()->GetUniqueRecordId()}},
rocprofiler_tracer_external_id_t{0}, ACTIVITY_DOMAIN_HSA_API,
rocprofiler_tracer_operation_id_t{cid},
rocprofiler_tracer_api_data_handle_t{callback_data, sizeof(*data)},
rocprofiler_tracer_operation_id_t{cid}, api_data,
rocprofiler_tracer_activity_correlation_id_t{data->correlation_id},
rocprofiler_record_header_timestamp_t{rocprofiler_timestamp_t{0},
rocprofiler_timestamp_t{0}},
@@ -332,10 +161,10 @@ void api_callback(activity_domain_t domain, uint32_t cid, const void* callback_d
rocprofiler_record_tracer_t{
rocprofiler_record_header_t{
ROCPROFILER_TRACER_RECORD,
rocprofiler_record_id_t{rocprofiler::GetROCProfilerSingleton()->GetUniqueRecordId()}},
rocprofiler_record_id_t{
rocprofiler::GetROCProfilerSingleton()->GetUniqueRecordId()}},
rocprofiler_tracer_external_id_t{0}, ACTIVITY_DOMAIN_HSA_API,
rocprofiler_tracer_operation_id_t{cid},
rocprofiler_tracer_api_data_handle_t{callback_data, sizeof(*data)},
rocprofiler_tracer_operation_id_t{cid}, api_data,
rocprofiler_tracer_activity_correlation_id_t{data->correlation_id},
rocprofiler_record_header_timestamp_t{rocprofiler_timestamp_t{0},
rocprofiler_timestamp_t{0}},
@@ -347,52 +176,30 @@ void api_callback(activity_domain_t domain, uint32_t cid, const void* callback_d
case ACTIVITY_DOMAIN_HIP_API: {
hip_api_data_t* data =
const_cast<hip_api_data_t*>(reinterpret_cast<const hip_api_data_t*>(callback_data));
api_data.hip = data;
if (data->phase == ACTIVITY_API_PHASE_ENTER) {
args_data->user_sync_callback(
rocprofiler_record_tracer_t{
rocprofiler_record_header_t{
ROCPROFILER_TRACER_RECORD,
rocprofiler_record_id_t{rocprofiler::GetROCProfilerSingleton()->GetUniqueRecordId()}},
rocprofiler_record_id_t{
rocprofiler::GetROCProfilerSingleton()->GetUniqueRecordId()}},
rocprofiler_tracer_external_id_t{0}, ACTIVITY_DOMAIN_HIP_API,
rocprofiler_tracer_operation_id_t{cid},
rocprofiler_tracer_api_data_handle_t{callback_data, sizeof(*data)},
rocprofiler_tracer_operation_id_t{cid}, api_data,
rocprofiler_tracer_activity_correlation_id_t{data->correlation_id},
rocprofiler_record_header_timestamp_t{rocprofiler_timestamp_t{0},
rocprofiler_timestamp_t{0}},
0, 0, GetTid(), ROCPROFILER_PHASE_ENTER},
args_data->session_id);
} else {
// TODO(aelwazir): STREAM ID GET need to be removed
// hipApiArgsInit((hip_api_id_t)cid, data);
// std::string hip_api_data_string = hipApiString((hip_api_id_t)cid, data);
// std::string start_str = "stream=";
// int start = hip_api_data_string.find(start_str);
// uint64_t stream_id = 0;
// if (start >= 0) {
// int end = hip_api_data_string.find(",", start);
// std::string stream_id_str = hip_api_data_string.substr(start + start_str.length(),
// end); std::stringstream ss; ss << std::hex << stream_id_str; ss >> stream_id;
// }
// {
// std::lock_guard<std::mutex> lock(stream_ids_map_lock);
// if (used_stream_ids.find(stream_id) == used_stream_ids.end()) {
// uint64_t stream_generated_id = stream_count.fetch_add(1,
// std::memory_order_release); used_stream_ids.emplace(stream_id,
// stream_generated_id); stream_ids.emplace(data->correlation_id,
// std::make_pair(stream_id, stream_generated_id));
// } else {
// stream_ids.emplace(data->correlation_id,
// std::make_pair(stream_id, used_stream_ids.at(stream_id)));
// }
// }
args_data->user_sync_callback(
rocprofiler_record_tracer_t{
rocprofiler_record_header_t{
ROCPROFILER_TRACER_RECORD,
rocprofiler_record_id_t{rocprofiler::GetROCProfilerSingleton()->GetUniqueRecordId()}},
rocprofiler_record_id_t{
rocprofiler::GetROCProfilerSingleton()->GetUniqueRecordId()}},
rocprofiler_tracer_external_id_t{0}, ACTIVITY_DOMAIN_HIP_API,
rocprofiler_tracer_operation_id_t{cid},
rocprofiler_tracer_api_data_handle_t{callback_data, sizeof(*data)},
rocprofiler_tracer_operation_id_t{cid}, api_data,
rocprofiler_tracer_activity_correlation_id_t{data->correlation_id},
rocprofiler_record_header_timestamp_t{rocprofiler_timestamp_t{0},
rocprofiler_timestamp_t{0}},
+4 -32
View File
@@ -40,11 +40,11 @@ typedef struct {
namespace rocprofiler {
namespace tracer {
char* GetApiCallFunctionName(rocprofiler_tracer_activity_domain_t domain,
rocprofiler_tracer_operation_id_t operation_id);
const char* GetApiCallOperationName(rocprofiler_tracer_activity_domain_t domain,
rocprofiler_tracer_operation_id_t operation_id);
size_t GetApiCallFunctionNameSize(rocprofiler_tracer_activity_domain_t domain,
rocprofiler_tracer_operation_id_t operation_id);
bool GetApiCallOperationID(rocprofiler_tracer_activity_domain_t domain, const char* name,
rocprofiler_tracer_operation_id_t* operation_id);
class Tracer {
public:
@@ -54,34 +54,6 @@ class Tracer {
std::vector<rocprofiler_tracer_activity_domain_t> domains);
~Tracer();
rocprofiler_tracer_api_data_handle_t AddROCTxApiData(std::string api_data);
rocprofiler_tracer_api_data_handle_t AddHSAApiData(hsa_api_data_t api_data);
rocprofiler_tracer_api_data_handle_t AddHIPApiData(hip_api_data_t api_data);
bool FindROCTxApiData(rocprofiler_tracer_api_data_handle_t api_data_handler);
bool FindHSAApiData(rocprofiler_tracer_api_data_handle_t api_data_handler);
bool FindHIPApiData(rocprofiler_tracer_api_data_handle_t api_data_handler);
size_t GetROCTxApiDataInfoSize(rocprofiler_tracer_roctx_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id);
size_t GetHSAApiDataInfoSize(rocprofiler_tracer_hsa_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id);
size_t GetHIPApiDataInfoSize(rocprofiler_tracer_hip_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id);
char* GetROCTxApiDataInfo(rocprofiler_tracer_roctx_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id);
char* GetHSAApiDataInfo(rocprofiler_tracer_hsa_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id);
char* GetHIPApiDataInfo(rocprofiler_tracer_hip_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id);
void InitRoctracer(
const std::map<rocprofiler_tracer_activity_domain_t, is_filtered_domain_t>& domains,
const std::vector<std::string>& api_filter_data_vector);