PC sampling initial bringup

This commit is contained in:
Evgeny
2020-01-23 20:55:49 -06:00
parent b4f2aa1a1c
commit 8b63135ced
8 changed files with 107 additions and 30 deletions
+5
View File
@@ -80,6 +80,11 @@ typedef struct activity_record_s {
struct {
activity_correlation_id_t external_id; // external correlatino id
};
struct {
uint32_t se; // sampled SE
uint64_t cycle; // sample cycle
uint64_t pc; // sample PC
} ps_sample;
};
size_t bytes; // data size bytes
} activity_record_t;
+1
View File
@@ -67,6 +67,7 @@ typedef enum {
ROCTRACER_STATUS_BAD_PARAMETER = 5,
ROCTRACER_STATUS_HIP_API_ERR = 6,
ROCTRACER_STATUS_HCC_OPS_ERR = 7,
ROCTRACER_STATUS_HSA_ERR = 7,
ROCTRACER_STATUS_ROCTX_ERR = 8,
} roctracer_status_t;
+9
View File
@@ -28,6 +28,15 @@ THE SOFTWARE.
#include "roctracer.h"
// HSA OP ID enumeration
enum hsa_op_id_t {
HSA_OP_ID_DISPATCH = 0,
HSA_OP_ID_COPY = 1,
HSA_OP_ID_BARRIER = 2,
HSA_OP_ID_PCSAMPLE = 3,
HSA_OP_ID_NUMBER = 4
};
#ifdef __cplusplus
#include <iostream>
#include <hsa_api_trace.h>
+2 -2
View File
@@ -342,8 +342,8 @@ class API_DescrParser:
self.content += ' ' + self.api_id[call] + ' = ' + str(n) + ',\n'
else:
self.content += '\n'
self.content += ' HSA_API_ID_NUMBER = ' + str(n) + ',\n'
self.content += ' HSA_API_ID_ANY = ' + str(n + 1) + ',\n'
self.content += ' HSA_API_ID_DISPATCH = ' + str(n) + ',\n'
self.content += ' HSA_API_ID_NUMBER = ' + str(n + 1) + ',\n'
self.content += '};\n'
# generate API args structure
+30
View File
@@ -70,6 +70,33 @@ class BaseLoader : public T {
void* handle_;
};
// 'rocprofiler' library loader class
class RocpApi {
public:
typedef BaseLoader<RocpApi> Loader;
typedef bool (RegisterCallback_t)(uint32_t op, void* callback, void* arg);
typedef bool (OperateCallback_t)(uint32_t op);
typedef bool (InitCallback_t)(void* callback, void* arg);
typedef bool (EnableCallback_t)(uint32_t op, bool enable);
typedef const char* (NameCallback_t)(uint32_t op);
RegisterCallback_t* RegisterApiCallback;
OperateCallback_t* RemoveApiCallback;
InitCallback_t* InitActivityCallback;
EnableCallback_t* EnableActivityCallback;
NameCallback_t* GetOpName;
protected:
void init(Loader* loader) {
RegisterApiCallback = loader->GetFun<RegisterCallback_t>("RegisterApiCallback");
RemoveApiCallback = loader->GetFun<OperateCallback_t>("RemoveApiCallback");
InitActivityCallback = loader->GetFun<InitCallback_t>("InitActivityCallback");
EnableActivityCallback = loader->GetFun<EnableCallback_t>("EnableActivityCallback");
GetOpName = loader->GetFun<NameCallback_t>("GetOpName");
}
};
// HIP runtime library loader class
class HipApi {
public:
@@ -164,6 +191,7 @@ class RocTxApi {
}
};
typedef BaseLoader<RocpApi> RocpLoader;
typedef BaseLoader<HipApi> HipLoader;
typedef BaseLoader<HccApi> HccLoader;
typedef BaseLoader<KfdApi> KfdLoader;
@@ -176,6 +204,8 @@ typedef BaseLoader<RocTxApi> RocTxLoader;
template<class T> std::atomic<roctracer::BaseLoader<T>*> roctracer::BaseLoader<T>::instance_{}; \
template<class T> bool roctracer::BaseLoader<T>::to_load_ = false; \
template<class T> bool roctracer::BaseLoader<T>::to_check_ = true; \
template<> const char* roctracer::RocpLoader::lib_name_ = "librocprofiler64.so"; \
template<> bool roctracer::RocpLoader::to_load_ = true; \
template<> const char* roctracer::HipLoader::lib_name_ = "libhip_hcc.so"; \
template<> bool roctracer::HipLoader::to_check_ = false; \
template<> const char* roctracer::HccLoader::lib_name_ = "libmcwamp.so"; \
+51 -27
View File
@@ -394,8 +394,6 @@ void HCC_ActivityIdCallback(activity_correlation_id_t correlation_id) {
}
void HCC_AsyncActivityCallback(uint32_t op_id, void* record, void* arg) {
static hsa_rt_utils::Timer timer;
MemoryPool* pool = reinterpret_cast<MemoryPool*>(arg);
roctracer_record_t* record_ptr = reinterpret_cast<roctracer_record_t*>(record);
record_ptr->domain = ACTIVITY_DOMAIN_HCC_OPS;
@@ -526,6 +524,13 @@ hsa_status_t hsa_amd_memory_async_copy_rect_interceptor(
return status;
}
void HSA_AsyncActivityCallback(uint32_t op_id, void* record, void* arg) {
MemoryPool* pool = reinterpret_cast<MemoryPool*>(arg);
roctracer_record_t* record_ptr = reinterpret_cast<roctracer_record_t*>(record);
record_ptr->domain = ACTIVITY_DOMAIN_HSA_OPS;
pool->Write(*record_ptr);
}
// Logger routines and primitives
util::Logger::mutex_t util::Logger::mutex_;
std::atomic<util::Logger*> util::Logger::instance_{};
@@ -573,22 +578,16 @@ PUBLIC_API const char* roctracer_op_string(
{
API_METHOD_PREFIX
switch (domain) {
case ACTIVITY_DOMAIN_HSA_API: {
case ACTIVITY_DOMAIN_HSA_API:
return roctracer::hsa_support::GetApiName(op);
break;
}
case ACTIVITY_DOMAIN_HCC_OPS: {
case ACTIVITY_DOMAIN_HSA_OPS:
return roctracer::RocpLoader::Instance().GetOpName(op);
case ACTIVITY_DOMAIN_HCC_OPS:
return roctracer::HccLoader::Instance().GetOpName(kind);
break;
}
case ACTIVITY_DOMAIN_HIP_API: {
case ACTIVITY_DOMAIN_HIP_API:
return roctracer::HipLoader::Instance().ApiName(op);
break;
}
case ACTIVITY_DOMAIN_KFD_API: {
case ACTIVITY_DOMAIN_KFD_API:
return roctracer::kfd_support::GetApiName(op);
break;
}
default:
EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")");
}
@@ -622,7 +621,7 @@ PUBLIC_API roctracer_status_t roctracer_op_code(
static inline uint32_t get_op_num(const uint32_t& domain) {
switch (domain) {
case ACTIVITY_DOMAIN_HSA_OPS: return 1;
case ACTIVITY_DOMAIN_HSA_OPS: return HSA_OP_ID_NUMBER;
case ACTIVITY_DOMAIN_HSA_API: return HSA_API_ID_NUMBER;
case ACTIVITY_DOMAIN_HCC_OPS: return HIP_OP_ID_NUMBER;
case ACTIVITY_DOMAIN_HIP_API: return HIP_API_ID_NUMBER;
@@ -645,11 +644,16 @@ static roctracer_status_t roctracer_enable_callback_fun(
switch (domain) {
case ACTIVITY_DOMAIN_KFD_API: {
const bool succ = roctracer::KfdLoader::Instance().RegisterApiCallback(op, (void*)callback, user_data);
if (succ == false) EXC_RAISING(ROCTRACER_STATUS_ERROR, "KFD RegisterApiCallback error");
if (succ == false) EXC_RAISING(ROCTRACER_STATUS_ERROR, "KFD RegisterApiCallback error(" << op << ") failed");
break;
}
case ACTIVITY_DOMAIN_HSA_OPS: break;
case ACTIVITY_DOMAIN_HSA_API: {
if (op == HSA_API_ID_DISPATCH) {
const bool succ = roctracer::RocpLoader::Instance().RegisterApiCallback(op, (void*)callback, user_data);
if (succ == false) HCC_EXC_RAISING(ROCTRACER_STATUS_HSA_ERR, "HSA::EnableActivityCallback error(" << op << ") failed");
break;
}
roctracer::hsa_support::cb_table.set(op, callback, user_data);
break;
}
@@ -658,13 +662,13 @@ static roctracer_status_t roctracer_enable_callback_fun(
if (roctracer::HipLoader::Instance().Enabled() == false) break;
hipError_t hip_err = roctracer::HipLoader::Instance().RegisterApiCallback(op, (void*)callback, user_data);
if (hip_err != hipSuccess) HIP_EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "hipRegisterApiCallback(" << op << ") error(" << hip_err << ")");
if (hip_err != hipSuccess) HIP_EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "HIP::RegisterApiCallback(" << op << ") error(" << hip_err << ")");
break;
}
case ACTIVITY_DOMAIN_ROCTX: {
if (roctracer::RocTxLoader::Instance().Enabled()) {
const bool suc = roctracer::RocTxLoader::Instance().RegisterApiCallback(op, (void*)callback, user_data);
if (suc == false) EXC_RAISING(ROCTRACER_STATUS_ROCTX_ERR, "roctxRegisterApiCallback(" << op << ") failed");
if (suc == false) EXC_RAISING(ROCTRACER_STATUS_ROCTX_ERR, "ROCTX::RegisterApiCallback(" << op << ") failed");
}
break;
}
@@ -730,19 +734,26 @@ static roctracer_status_t roctracer_disable_callback_fun(
break;
}
case ACTIVITY_DOMAIN_HSA_OPS: break;
case ACTIVITY_DOMAIN_HSA_API: break;
case ACTIVITY_DOMAIN_HSA_API: {
if (op == HSA_API_ID_DISPATCH) {
const bool succ = roctracer::RocpLoader::Instance().RemoveApiCallback(op);
if (succ == false) HCC_EXC_RAISING(ROCTRACER_STATUS_HSA_ERR, "HSA::RemoveActivityCallback error(" << op << ") failed");
break;
}
break;
}
case ACTIVITY_DOMAIN_HCC_OPS: break;
case ACTIVITY_DOMAIN_HIP_API: {
if (roctracer::HipLoader::Instance().Enabled() == false) break;
hipError_t hip_err = roctracer::HipLoader::Instance().RemoveApiCallback(op);
if (hip_err != hipSuccess) HIP_EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "hipRemoveApiCallback error(" << hip_err << ")");
if (hip_err != hipSuccess) HIP_EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "HIP::RemoveApiCallback(" << op << "), error(" << hip_err << ")");
break;
}
case ACTIVITY_DOMAIN_ROCTX: {
if (roctracer::RocTxLoader::Instance().Enabled()) {
const bool suc = roctracer::RocTxLoader::Instance().RemoveApiCallback(op);
if (suc == false) EXC_RAISING(ROCTRACER_STATUS_ROCTX_ERR, "roctxRemoveApiCallback(" << op << ") failed");
if (suc == false) EXC_RAISING(ROCTRACER_STATUS_ROCTX_ERR, "ROCTX::RemoveApiCallback(" << op << ") failed");
}
break;
}
@@ -833,8 +844,17 @@ static roctracer_status_t roctracer_enable_activity_fun(
if (pool == NULL) pool = roctracer_default_pool();
switch (domain) {
case ACTIVITY_DOMAIN_HSA_OPS: {
roctracer::hsa_support::async_copy_callback_enabled = true;
rocprofiler::InterceptQueue::Enable(true);
if (op == HSA_OP_ID_DISPATCH) {
const bool init_phase = (roctracer::RocpLoader::GetRef() == NULL);
if (init_phase == true) {
roctracer::RocpLoader::Instance().InitActivityCallback((void*)roctracer::HSA_AsyncActivityCallback,
(void*)pool);
}
const bool succ = roctracer::RocpLoader::Instance().EnableActivityCallback(op, true);
if (succ == false) HCC_EXC_RAISING(ROCTRACER_STATUS_HSA_ERR, "HSA::EnableActivityCallback error");
} else if (op == HSA_OP_ID_COPY) {
roctracer::hsa_support::async_copy_callback_enabled = true;
}
break;
}
case ACTIVITY_DOMAIN_HSA_API: break;
@@ -921,8 +941,12 @@ static roctracer_status_t roctracer_disable_activity_fun(
{
switch (domain) {
case ACTIVITY_DOMAIN_HSA_OPS: {
roctracer::hsa_support::async_copy_callback_enabled = false;
rocprofiler::InterceptQueue::Enable(false);
if (op == HSA_OP_ID_DISPATCH) {
const bool succ = roctracer::RocpLoader::Instance().EnableActivityCallback(op, false);
if (succ == false) HCC_EXC_RAISING(ROCTRACER_STATUS_HSA_ERR, "HSA::EnableActivityCallback(false) error, op(" << op << ")");
} else if (op == HSA_OP_ID_COPY) {
roctracer::hsa_support::async_copy_callback_enabled = true;
}
break;
}
case ACTIVITY_DOMAIN_HSA_API: break;
@@ -931,14 +955,14 @@ static roctracer_status_t roctracer_disable_activity_fun(
if (roctracer::HccLoader::Instance().Enabled() == false) break;
const bool succ = roctracer::HccLoader::Instance().EnableActivityCallback(op, false);
if (succ == false) HCC_EXC_RAISING(ROCTRACER_STATUS_HCC_OPS_ERR, "HCC::EnableActivityCallback(NULL) error domain(" << domain << ") op(" << op << ")");
if (succ == false) HCC_EXC_RAISING(ROCTRACER_STATUS_HCC_OPS_ERR, "HCC::EnableActivityCallback(NULL) error, op(" << op << ")");
break;
}
case ACTIVITY_DOMAIN_HIP_API: {
if (roctracer::HipLoader::Instance().Enabled() == false) break;
const hipError_t hip_err = roctracer::HipLoader::Instance().RemoveActivityCallback(op);
if (hip_err != hipSuccess) HIP_EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "hipRemoveActivityCallback error(" << hip_err << ")");
if (hip_err != hipSuccess) HIP_EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "HIP::RemoveActivityCallback op(" << op << "), error(" << hip_err << ")");
break;
}
case ACTIVITY_DOMAIN_ROCTX: break;
+1 -1
View File
@@ -41,7 +41,7 @@ $(EXECUTABLE): $(OBJECTS)
$(HIPCC) $(OBJECTS) -o $@ $(ROC_LIBS)
test: $(EXECUTABLE)
LD_PRELOAD=$(LIB_PATH)/libkfdwrapper64.so $(EXECUTABLE)
LD_PRELOAD="$(LIB_PATH)/libkfdwrapper64.so librocprofiler64.so" $(EXECUTABLE)
clean:
rm -f $(EXECUTABLE)
@@ -310,6 +310,12 @@ void activity_callback(const char* begin, const char* end, void* arg) {
record->queue_id
);
if (record->op == HIP_OP_ID_COPY) fprintf(stdout, " bytes(0x%zx)", record->bytes);
} else if (record->domain == ACTIVITY_DOMAIN_HSA_OPS) {
fprintf(stdout, " se(%u) cycle(%lu) pc(%lx)",
record->ps_sample.se,
record->ps_sample.cycle,
record->ps_sample.pc
);
} else if (record->domain == ACTIVITY_DOMAIN_EXT_API) {
fprintf(stdout, " external_id(%lu)",
record->external_id
@@ -340,6 +346,8 @@ void init_tracing() {
// Enable HIP activity tracing
ROCTRACER_CALL(roctracer_enable_domain_activity(ACTIVITY_DOMAIN_HIP_API));
ROCTRACER_CALL(roctracer_enable_domain_activity(ACTIVITY_DOMAIN_HCC_OPS));
// Enable PC sampling
ROCTRACER_CALL(roctracer_enable_op_activity(ACTIVITY_DOMAIN_HSA_OPS, HSA_OP_ID_PCSAMPLE));
// Enable KFD API tracing
ROCTRACER_CALL(roctracer_enable_domain_callback(ACTIVITY_DOMAIN_KFD_API, api_callback, NULL));
ROCTRACER_CALL(roctracer_enable_domain_activity(ACTIVITY_DOMAIN_KFD_API));