SWDEV-403068 & SWDEV-403069: Memory Leaks fix for tracer
Change-Id: I57ce10ae616dda9529d22d4cee15556864760d6c
[ROCm/rocprofiler commit: 3ac57e167e]
This commit is contained in:
1 parent
bf471ed17b
commit
4a3ce16d54
17 files changed
+296
-1401
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(×tamp));
|
||||
*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(×tamp));
|
||||
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(×tamp));
|
||||
*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(×tamp));
|
||||
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(×tamp));
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user