dispatch data th-id, queue-id, kernel-object

Change-Id: Ic5593603c6587cad17be33618d011a9aefc648ab
This commit is contained in:
Evgeny
2018-10-16 19:33:48 -05:00
parent 13fe0f9f69
commit c05bded17c
11 changed files with 523 additions and 23 deletions
+18 -4
View File
@@ -26,6 +26,7 @@ THE SOFTWARE.
#include <amd_hsa_kernel_code.h>
#include <cxxabi.h>
#include <dlfcn.h>
#include <sys/syscall.h>
#include <atomic>
#include <iostream>
@@ -49,6 +50,7 @@ class InterceptQueue {
typedef std::map<uint64_t, InterceptQueue*> obj_map_t;
typedef hsa_status_t (*queue_callback_t)(hsa_queue_t*, void* data);
typedef void (*queue_event_callback_t)(hsa_status_t status, hsa_queue_t *queue, void *arg);
typedef uint32_t queue_id_t;
static void HsaIntercept(HsaApiTable* table);
@@ -79,6 +81,8 @@ class InterceptQueue {
(*obj_map_)[(uint64_t)(*queue)] = obj;
status = proxy->SetInterceptCB(OnSubmitCB, obj);
obj->queue_event_callback_ = callback;
obj->queue_id = current_queue_id;
++current_queue_id;
in_constr_call_ = false;
return status;
@@ -139,13 +143,17 @@ class InterceptQueue {
}
// Prepareing dispatch callback data
const char* kernel_name = GetKernelName(dispatch_packet);
uint64_t kernel_symbol = GetKernelSymbol(dispatch_packet);
const char* kernel_name = GetKernelName(kernel_symbol);
rocprofiler_callback_data_t data = {obj->agent_info_->dev_id,
obj->agent_info_->dev_index,
obj->queue_,
user_que_idx,
obj->queue_id,
dispatch_packet,
kernel_name,
kernel_symbol,
syscall(__NR_gettid),
(tracker_entry) ? tracker_entry->record : NULL};
// Calling dispatch callback
@@ -222,7 +230,7 @@ class InterceptQueue {
return static_cast<hsa_packet_type_t>((*header >> HSA_PACKET_HEADER_TYPE) & header_type_mask);
}
static const char* GetKernelName(const hsa_kernel_dispatch_packet_t* dispatch_packet) {
static uint64_t GetKernelSymbol(const hsa_kernel_dispatch_packet_t* dispatch_packet) {
const amd_kernel_code_t* kernel_code = NULL;
hsa_status_t status =
util::HsaRsrcFactory::Instance().LoaderApi()->hsa_ven_amd_loader_query_host_address(
@@ -231,8 +239,12 @@ class InterceptQueue {
if (HSA_STATUS_SUCCESS != status) {
kernel_code = reinterpret_cast<amd_kernel_code_t*>(dispatch_packet->kernel_object);
}
amd_runtime_loader_debug_info_t* dbg_info = reinterpret_cast<amd_runtime_loader_debug_info_t*>(
kernel_code->runtime_loader_kernel_symbol);
return kernel_code->runtime_loader_kernel_symbol;
}
static const char* GetKernelName(const uint64_t kernel_symbol) {
amd_runtime_loader_debug_info_t* dbg_info =
reinterpret_cast<amd_runtime_loader_debug_info_t*>(kernel_symbol);
const char* kernel_name = (dbg_info != NULL) ? dbg_info->kernel_name : NULL;
// Kernel name is mangled name
@@ -298,11 +310,13 @@ class InterceptQueue {
static Tracker* tracker_;
static bool tracker_on_;
static bool in_constr_call_;
static queue_id_t current_queue_id;
hsa_queue_t* const queue_;
ProxyQueue* const proxy_;
const util::AgentInfo* agent_info_;
queue_event_callback_t queue_event_callback_;
queue_id_t queue_id;
};
} // namespace rocprofiler