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

Change-Id: I57ce10ae616dda9529d22d4cee15556864760d6c


[ROCm/rocprofiler commit: 3ac57e167e]
This commit is contained in:
Ammar ELWazir authored and Ammar Elwazir committed 2023-06-21 06:28:47 -04:00
1 parent bf471ed17b
commit 4a3ce16d54
17 files changed
+296 -1401

No files matched your search

+2 -6
Vedi File
@@ -17,12 +17,8 @@ global: OnLoad;
rocprofiler_query_kernel_info;
rocprofiler_query_counter_info_size;
rocprofiler_query_counter_info;
rocprofiler_query_roctx_tracer_api_data_info_size;
rocprofiler_query_roctx_tracer_api_data_info;
rocprofiler_query_hsa_tracer_api_data_info_size;
rocprofiler_query_hsa_tracer_api_data_info;
rocprofiler_query_hip_tracer_api_data_info_size;
rocprofiler_query_hip_tracer_api_data_info;
rocprofiler_query_tracer_operation_name;
rocprofiler_tracer_operation_id;
rocprofiler_flush_data;
rocprofiler_next_record;
rocprofiler_create_session;
+17 -197
Vedi File
@@ -1,10 +1,13 @@
#include <atomic>
#include <cstdlib>
#include <cstdio>
#include "rocprofiler.h"
#include "core/session/tracer/tracer.h"
#include "src/core/hsa/hsa_support.h"
#include "src/api/rocprofiler_singleton.h"
#include "src/utils/helper.h"
#include "rocprofiler.h"
// TODO(aelwazir): change that to adapt with our own Exception
// What about outside exceptions and callbacks exceptions!!
@@ -255,205 +258,22 @@ ROCPROFILER_API rocprofiler_status_t rocprofiler_query_counter_info(
API_METHOD_SUFFIX
}
ROCPROFILER_API rocprofiler_status_t rocprofiler_query_roctx_tracer_api_data_info_size(
rocprofiler_session_id_t session_id, 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* data_size) {
API_INIT_CHECKER
// TODO(aelwazir): To be implemented
// if (!rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindROCTxApiData(api_data_id)) {
// if (rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHSAApiData(api_data_id) ||
// rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHIPApiData(api_data_id)) {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_INCORRECT_DOMAIN);
// } else {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_NOT_FOUND);
// }
// }
*data_size = rocprofiler::GetROCProfilerSingleton()
->GetSession(session_id)
->GetTracer()
->GetROCTxApiDataInfoSize(kind, api_data_id, operation_id);
// if (*data_size <= 0)
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_INFORMATION_MISSING);
API_METHOD_SUFFIX
ROCPROFILER_API rocprofiler_status_t rocprofiler_query_tracer_operation_name(
rocprofiler_tracer_activity_domain_t domain, rocprofiler_tracer_operation_id_t operation_id,
const char** name) {
*name = rocprofiler::tracer::GetApiCallOperationName(domain, operation_id);
return ROCPROFILER_STATUS_SUCCESS;
}
ROCPROFILER_API rocprofiler_status_t rocprofiler_query_roctx_tracer_api_data_info(
rocprofiler_session_id_t session_id, 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** data) {
ROCPROFILER_API rocprofiler_status_t
rocprofiler_query_tracer_operation_id(rocprofiler_tracer_activity_domain_t domain, const char* name,
rocprofiler_tracer_operation_id_t* operation_id) {
API_INIT_CHECKER
// TODO(aelwazir): To be implemented
// if (!rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindROCTxApiData(api_data_id)) {
// if (rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHSAApiData(api_data_id) ||
// rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHIPApiData(api_data_id)) {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_INCORRECT_DOMAIN);
// } else {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_NOT_FOUND);
// }
// }
if (!(*data = rocprofiler::GetROCProfilerSingleton()
->GetSession(session_id)
->GetTracer()
->GetROCTxApiDataInfo(kind, api_data_id, operation_id)))
throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_INFORMATION_MISSING);
API_METHOD_SUFFIX
}
ROCPROFILER_API rocprofiler_status_t rocprofiler_query_hsa_tracer_api_data_info_size(
rocprofiler_session_id_t session_id, 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* data_size) {
API_INIT_CHECKER
// TODO(aelwazir): To be implemented
// if (!rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHSAApiData(api_data_id)) {
// if (rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindROCTxApiData(api_data_id) ||
// rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHIPApiData(api_data_id)) {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_INCORRECT_DOMAIN);
// } else {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_NOT_FOUND);
// }
// }
*data_size =
((kind == ROCPROFILER_HSA_FUNCTION_NAME)
? rocprofiler::tracer::GetApiCallFunctionNameSize(ACTIVITY_DOMAIN_HSA_API, operation_id)
: rocprofiler::GetROCProfilerSingleton()
->GetSession(session_id)
->GetTracer()
->GetHSAApiDataInfoSize(kind, api_data_id, operation_id));
if (*data_size <= 0)
throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_INFORMATION_MISSING);
API_METHOD_SUFFIX
}
ROCPROFILER_API rocprofiler_status_t rocprofiler_query_hsa_tracer_api_data_info(
rocprofiler_session_id_t session_id, 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** data) {
API_INIT_CHECKER
// TODO(aelwazir): To be implemented
// if (!rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHSAApiData(api_data_id)) {
// if (rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindROCTxApiData(api_data_id) ||
// rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHIPApiData(api_data_id)) {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_INCORRECT_DOMAIN);
// } else {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_NOT_FOUND);
// }
// }
*data = (kind == ROCPROFILER_HSA_FUNCTION_NAME)
? rocprofiler::tracer::GetApiCallFunctionName(ACTIVITY_DOMAIN_HSA_API, operation_id)
: rocprofiler::GetROCProfilerSingleton()
->GetSession(session_id)
->GetTracer()
->GetHSAApiDataInfo(kind, api_data_id, operation_id);
if (*data == nullptr)
throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_INFORMATION_MISSING);
API_METHOD_SUFFIX
}
ROCPROFILER_API rocprofiler_status_t rocprofiler_query_hip_tracer_api_data_info_size(
rocprofiler_session_id_t session_id, rocprofiler_tracer_hip_api_data_info_t kind,
rocprofiler_tracer_api_data_handle_t api_data_id,
rocprofiler_tracer_operation_id_t operation_id, size_t* data_size) {
API_INIT_CHECKER
// TODO(aelwazir): To be implemented
// if (!rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHIPApiData(api_data_id)) {
// if (rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHSAApiData(api_data_id) ||
// rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindROCTxApiData(api_data_id)) {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_INCORRECT_DOMAIN);
// } else {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_NOT_FOUND);
// }
// }
*data_size = (kind == ROCPROFILER_HIP_FUNCTION_NAME)
? rocprofiler::tracer::GetApiCallFunctionNameSize(ACTIVITY_DOMAIN_HIP_API, operation_id)
: rocprofiler::GetROCProfilerSingleton()
->GetSession(session_id)
->GetTracer()
->GetHIPApiDataInfoSize(kind, api_data_id, operation_id);
// if (*data_size <= 0)
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_INFORMATION_MISSING);
API_METHOD_SUFFIX
}
ROCPROFILER_API rocprofiler_status_t rocprofiler_query_hip_tracer_api_data_info(
rocprofiler_session_id_t session_id, 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** data) {
API_INIT_CHECKER
// TODO(aelwazir): To be implemented
// if (!rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHIPApiData(api_data_id)) {
// if (rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindHSAApiData(api_data_id) ||
// rocprofiler::GetROCProfilerSingleton()
// ->GetSession(session_id)
// ->GetTracer()
// ->FindROCTxApiData(api_data_id)) {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_INCORRECT_DOMAIN);
// } else {
// throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_NOT_FOUND);
// }
// }
// if (!(
*data = (kind == ROCPROFILER_HIP_FUNCTION_NAME)
? rocprofiler::tracer::GetApiCallFunctionName(ACTIVITY_DOMAIN_HIP_API, operation_id)
: rocprofiler::GetROCProfilerSingleton()
->GetSession(session_id)
->GetTracer()
->GetHIPApiDataInfo(kind, api_data_id, operation_id);
// ))
// throw
// rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_TRACER_API_DATA_INFORMATION_MISSING);
if (operation_id == nullptr)
throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_INVALID_ARGUMENTS);
if (!rocprofiler::tracer::GetApiCallOperationID(domain, name, operation_id))
throw rocprofiler::Exception(ROCPROFILER_STATUS_ERROR_INVALID_OPERATION_ID);
return ROCPROFILER_STATUS_SUCCESS;
API_METHOD_SUFFIX
}
@@ -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)
@@ -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}},
@@ -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);
+22 -67
Vedi File
@@ -23,6 +23,7 @@
#include <fcntl.h>
#include <hsa/hsa.h>
#include <hsa/hsa_ext_amd.h>
#include "core/session/tracer/src/roctracer.h"
#include "hsa_prof_str.h"
#include <hip/hip_runtime.h>
#include <hip/amd_detail/hip_prof_str.h>
@@ -110,7 +111,8 @@ class rocprofiler_plugin_t {
if (auto* initialize = reinterpret_cast<decltype(rocprofiler_plugin_initialize)*>(
dlsym(plugin_handle_, "rocprofiler_plugin_initialize"));
initialize != nullptr)
valid_ = initialize(ROCPROFILER_VERSION_MAJOR, ROCPROFILER_VERSION_MINOR, &counter_names) == 0;
valid_ =
initialize(ROCPROFILER_VERSION_MAJOR, ROCPROFILER_VERSION_MINOR, &counter_names) == 0;
}
~rocprofiler_plugin_t() {
@@ -149,9 +151,8 @@ struct hsa_api_trace_entry_t {
: valid(rocprofiler::TRACE_ENTRY_INIT) {
record = tracer_record;
api_data = *data;
record.api_data_handle.handle = &api_data;
record.api_data.hsa = &api_data;
}
~hsa_api_trace_entry_t() {}
};
struct roctx_trace_entry_t {
@@ -162,7 +163,6 @@ struct roctx_trace_entry_t {
: valid(rocprofiler::TRACE_ENTRY_INIT) {
record = tracer_record;
record.name = roctx_message_str ? strdup(roctx_message_str) : nullptr;
record.api_data_handle.handle = record.name;
}
~roctx_trace_entry_t() {
if (record.name != nullptr) free(const_cast<char*>(record.name));
@@ -172,23 +172,15 @@ struct roctx_trace_entry_t {
struct hip_api_trace_entry_t {
std::atomic<uint32_t> valid;
rocprofiler_record_tracer_t record;
union {
hip_api_data_t api_data;
};
hip_api_trace_entry_t(rocprofiler_record_tracer_t tracer_record, const char* kernel_name_str,
const hip_api_data_t* data)
hip_api_trace_entry_t(rocprofiler_record_tracer_t tracer_record, const hip_api_data_t* data)
: valid(rocprofiler::TRACE_ENTRY_INIT) {
record = tracer_record;
api_data = *data;
record.api_data_handle.handle = &api_data;
record.name = kernel_name_str ? strdup(kernel_name_str) : nullptr;
free(const_cast<char*>(kernel_name_str));
}
~hip_api_trace_entry_t() {
if (record.name != nullptr) free(const_cast<char*>(record.name));
record.api_data.hip = &api_data;
}
};
@@ -367,7 +359,7 @@ void plugins_load() {
if (Dl_info dl_info; dladdr((void*)plugins_load, &dl_info) != 0) {
const char* plugin_name = getenv("ROCPROFILER_PLUGIN_LIB");
if (plugin_name == nullptr) {
if(getenv("OUTPUT_PATH"))
if (getenv("OUTPUT_PATH"))
plugin_name = "libfile_plugin.so";
else
plugin_name = "libcli_plugin.so";
@@ -377,92 +369,55 @@ void plugins_load() {
}
}
}
/*
* A callback function for synchronous trace records.
* This function queries the api infoemation and populates the
* This function queries the api information and populates the
* api_trace buffer and adds it to the trace buffer.
*/
void sync_api_trace_callback(rocprofiler_record_tracer_t tracer_record,
rocprofiler_session_id_t session_id) {
if (tracer_record.domain == ACTIVITY_DOMAIN_HIP_API) {
size_t kernel_name_size = 0;
char* kernel_name_c = nullptr;
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info_size(
session_id, ROCPROFILER_HIP_KERNEL_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &kernel_name_size));
if (kernel_name_size > 1) {
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info(
session_id, ROCPROFILER_HIP_KERNEL_NAME, tracer_record.api_data_handle,
tracer_record.operation_id, &kernel_name_c));
}
char* data = nullptr;
size_t size = 0;
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info_size(
session_id, ROCPROFILER_HIP_API_DATA, tracer_record.api_data_handle,
tracer_record.operation_id, &size));
if (size > 0)
CHECK_ROCPROFILER(rocprofiler_query_hip_tracer_api_data_info(
session_id, ROCPROFILER_HIP_API_DATA, tracer_record.api_data_handle,
tracer_record.operation_id, &data));
hip_api_data_t* hip_api_data = reinterpret_cast<hip_api_data_t*>(data);
if (tracer_record.phase == ROCPROFILER_PHASE_ENTER) {
rocprofiler_timestamp_t timestamp;
CHECK_ROCPROFILER(rocprofiler_get_timestamp(&timestamp));
*hip_api_data->phase_data = timestamp.value;
*(const_cast<hip_api_data_t*>(tracer_record.api_data.hip)->phase_data) = timestamp.value;
tracer_record.timestamps = rocprofiler_record_header_timestamp_t{.begin = timestamp};
} else {
rocprofiler_timestamp_t timestamp;
CHECK_ROCPROFILER(rocprofiler_get_timestamp(&timestamp));
tracer_record.timestamps = rocprofiler_record_header_timestamp_t{
.begin = rocprofiler_timestamp_t{*hip_api_data->phase_data}, .end = timestamp};
.begin = rocprofiler_timestamp_t{*tracer_record.api_data.hip->phase_data},
.end = timestamp};
}
hip_api_trace_entry_t& entry = hip_api_buffer.Emplace(
tracer_record, (const char*)kernel_name_c ? strdup(kernel_name_c) : nullptr, hip_api_data);
hip_api_trace_entry_t& entry =
hip_api_buffer.Emplace(tracer_record, tracer_record.api_data.hip);
entry.valid.store(rocprofiler::TRACE_ENTRY_COMPLETE, std::memory_order_release);
free(kernel_name_c);
}
if (tracer_record.domain == ACTIVITY_DOMAIN_HSA_API) {
char* data = nullptr;
size_t size = 0;
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info_size(
session_id, ROCPROFILER_HSA_API_DATA, tracer_record.api_data_handle,
tracer_record.operation_id, &size));
CHECK_ROCPROFILER(rocprofiler_query_hsa_tracer_api_data_info(
session_id, ROCPROFILER_HSA_API_DATA, tracer_record.api_data_handle,
tracer_record.operation_id, &data));
hsa_api_data_t* hsa_api_data = reinterpret_cast<hsa_api_data_t*>(data);
if (tracer_record.phase == ROCPROFILER_PHASE_ENTER) {
rocprofiler_timestamp_t timestamp;
CHECK_ROCPROFILER(rocprofiler_get_timestamp(&timestamp));
*hsa_api_data->phase_data = timestamp.value;
*(const_cast<hsa_api_data_t*>(tracer_record.api_data.hsa)->phase_data) = timestamp.value;
tracer_record.timestamps = rocprofiler_record_header_timestamp_t{.begin = timestamp};
} else {
rocprofiler_timestamp_t timestamp;
CHECK_ROCPROFILER(rocprofiler_get_timestamp(&timestamp));
tracer_record.timestamps = rocprofiler_record_header_timestamp_t{
.begin = rocprofiler_timestamp_t{*hsa_api_data->phase_data}, .end = timestamp};
.begin = rocprofiler_timestamp_t{*(tracer_record.api_data.hsa->phase_data)},
.end = timestamp};
}
hsa_api_trace_entry_t& entry = hsa_api_buffer.Emplace(tracer_record, hsa_api_data);
hsa_api_trace_entry_t& entry =
hsa_api_buffer.Emplace(tracer_record, tracer_record.api_data.hsa);
entry.valid.store(rocprofiler::TRACE_ENTRY_COMPLETE, std::memory_order_release);
}
if (tracer_record.domain == ACTIVITY_DOMAIN_ROCTX) {
size_t roctx_message_size = 0;
char* roctx_message_str = nullptr;
CHECK_ROCPROFILER(rocprofiler_query_roctx_tracer_api_data_info_size(
session_id, ROCPROFILER_ROCTX_MESSAGE, tracer_record.api_data_handle,
tracer_record.operation_id, &roctx_message_size));
if (roctx_message_size > 1) {
roctx_message_str = (char*)malloc(roctx_message_size * sizeof(char));
CHECK_ROCPROFILER(rocprofiler_query_roctx_tracer_api_data_info(
session_id, ROCPROFILER_ROCTX_MESSAGE, tracer_record.api_data_handle,
tracer_record.operation_id, &roctx_message_str));
if (roctx_message_str)
roctx_message_str ? std::string(strdup(roctx_message_str)).c_str() : nullptr;
}
rocprofiler_timestamp_t timestamp;
CHECK_ROCPROFILER(rocprofiler_get_timestamp(&timestamp));
tracer_record.timestamps = rocprofiler_record_header_timestamp_t{.begin = timestamp};
roctx_trace_entry_t& entry = roctx_trace_buffer.Emplace(tracer_record, roctx_message_str);
tracer_record.operation_id.id = tracer_record.api_data.roctx->args.id;
roctx_trace_entry_t& entry =
roctx_trace_buffer.Emplace(tracer_record, tracer_record.api_data.roctx->args.message);
entry.valid.store(rocprofiler::TRACE_ENTRY_COMPLETE, std::memory_order_release);
}
}