From 80f23e9a9ff4d4adaaf26ee5d8d1684f43e9e7d2 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 10 Jan 2019 03:25:25 -0600 Subject: [PATCH] hcc dynamic loader --- src/core/loader.h | 68 +++++++++++++++++++++--------------------- src/core/roctracer.cpp | 25 +++++++--------- 2 files changed, 45 insertions(+), 48 deletions(-) diff --git a/src/core/loader.h b/src/core/loader.h index cf34781c6b..9ecec2c766 100644 --- a/src/core/loader.h +++ b/src/core/loader.h @@ -8,6 +8,8 @@ namespace roctracer { class Loader { public: + typedef std::mutex mutex_t; + Loader(const char* lib_name) { handle_ = dlopen(lib_name, RTLD_LAZY|RTLD_NODELETE); if (handle_ == NULL) { @@ -23,19 +25,20 @@ class Loader { template fun_t* GetFun(const char* fun_name) { return (fun_t*) dlsym(handle_, fun_name); } + protected: + static mutex_t mutex_; + private: void* handle_; }; class HipLoader : protected Loader { public: - typedef std::mutex mutex_t; - - typedef decltype(hipRegisterApiCallback) hipRegisterApiCallback_t; - typedef decltype(hipRemoveApiCallback) hipRemoveApiCallback_t; - typedef decltype(hipRegisterActivityCallback) hipRegisterActivityCallback_t; - typedef decltype(hipRemoveActivityCallback) hipRemoveActivityCallback_t; - typedef decltype(hipKernelNameRef) hipKernelNameRef_t; + typedef decltype(hipRegisterApiCallback) RegisterApiCallback_t; + typedef decltype(hipRemoveApiCallback) RemoveApiCallback_t; + typedef decltype(hipRegisterActivityCallback) RegisterActivityCallback_t; + typedef decltype(hipRemoveActivityCallback) RemoveActivityCallback_t; + typedef decltype(hipKernelNameRef) KernelNameRef_t; static HipLoader& Instance() { std::lock_guard lck(mutex_); @@ -46,35 +49,30 @@ class HipLoader : protected Loader { } HipLoader() : Loader("libhip_hcc.so") { - hipRegisterApiCallback = GetFun("hipRegisterApiCallback"); - hipRemoveApiCallback = GetFun("hipRemoveApiCallback"); - hipRegisterActivityCallback = GetFun("hipRegisterActivityCallback"); - hipRemoveActivityCallback = GetFun("hipRemoveActivityCallback"); - hipKernelNameRef = GetFun("hipKernelNameRef"); + RegisterApiCallback = GetFun("hipRegisterApiCallback"); + RemoveApiCallback = GetFun("hipRemoveApiCallback"); + RegisterActivityCallback = GetFun("hipRegisterActivityCallback"); + RemoveActivityCallback = GetFun("hipRemoveActivityCallback"); + KernelNameRef = GetFun("hipKernelNameRef"); } - hipRegisterApiCallback_t* hipRegisterApiCallback; - hipRemoveApiCallback_t* hipRemoveApiCallback; - hipRegisterActivityCallback_t* hipRegisterActivityCallback; - hipRemoveActivityCallback_t* hipRemoveActivityCallback; - hipKernelNameRef_t* hipKernelNameRef; + RegisterApiCallback_t* RegisterApiCallback; + RemoveApiCallback_t* RemoveApiCallback; + RegisterActivityCallback_t* RegisterActivityCallback; + RemoveActivityCallback_t* RemoveActivityCallback; + KernelNameRef_t* KernelNameRef; private: static HipLoader* instance_; - static mutex_t mutex_; }; -} // namespace roctracer - -#if 0 -namespace roctracer { class HccLoader : protected Loader { public: typedef std::mutex mutex_t; - typedef decltype(Kalmar::CLAMP::SetActivityCallback) hccSetActivityCallback_t; - typedef decltype(Kalmar::CLAMP::SetActivityIdCallback) hccSetActivityIdCallback_t; - typedef decltype(Kalmar::CLAMP::GetCmdName) hccGetCmdName_t; + typedef decltype(Kalmar::CLAMP::SetActivityCallback) SetActivityCallback_t; + typedef decltype(Kalmar::CLAMP::SetActivityIdCallback) SetActivityIdCallback_t; + typedef decltype(Kalmar::CLAMP::GetCmdName) GetCmdName_t; static HccLoader& Instance() { std::lock_guard lck(mutex_); @@ -85,26 +83,28 @@ class HccLoader : protected Loader { } HccLoader() : Loader("libmcwamp.so") { + // Kalmar::CLAMP::SetActivityCallback // _ZN6Kalmar5CLAMP19SetActivityCallbackEjPvS1_ - hccSetActivityCallback = GetFun("Kalmar::CLAMP::SetActivityCallback"); + SetActivityCallback = GetFun("_ZN6Kalmar5CLAMP19SetActivityCallbackEjPvS1_"); + // Kalmar::CLAMP::SetActivityIdCallback // _ZN6Kalmar5CLAMP21SetActivityIdCallbackEPv - hccSetActivityIdCallback = GetFun("Kalmar::CLAMP::SetActivityIdCallback"); + SetActivityIdCallback = GetFun("_ZN6Kalmar5CLAMP21SetActivityIdCallbackEPv"); + // Kalmar::CLAMP::GetCmdName // _ZN6Kalmar5CLAMP10GetCmdNameEj - hccGetCmdName = GetFun("Kalmar::CLAMP::GetCmdName"); - - printf("HccLoader hccSetActivityCallback %p\n", hccSetActivityCallback); + GetCmdName = GetFun("_ZN6Kalmar5CLAMP10GetCmdNameEj"); } - hccSetActivityCallback_t* hccSetActivityCallback; - hccSetActivityIdCallback_t* hccSetActivityIdCallback; - hccGetCmdName_t* hccGetCmdName; + SetActivityCallback_t* SetActivityCallback; + SetActivityIdCallback_t* SetActivityIdCallback; + GetCmdName_t* GetCmdName; private: static HccLoader* instance_; - static mutex_t mutex_; }; + } // namespace roctracer +#if 0 namespace Kalmar { namespace CLAMP { extern bool SetActivityCallback(unsigned, void*, void*) __attribute__((weak_import)); diff --git a/src/core/roctracer.cpp b/src/core/roctracer.cpp index b135b70276..be46f2b392 100644 --- a/src/core/roctracer.cpp +++ b/src/core/roctracer.cpp @@ -362,8 +362,9 @@ MemoryPool* memory_pool = NULL; typedef std::recursive_mutex memory_pool_mutex_t; memory_pool_mutex_t memory_pool_mutex; +Loader::mutex_t Loader::mutex_; HipLoader* HipLoader::instance_; -HipLoader::mutex_t HipLoader::mutex_; +HccLoader* HccLoader::instance_; namespace hsa_support { // callbacks table @@ -402,8 +403,7 @@ PUBLIC_API const char* roctracer_id_string(const uint32_t& domain, const uint32_ } case ACTIVITY_DOMAIN_HCC_OPS: { #ifdef HCC_ENABLED - return Kalmar::CLAMP::GetCmdName(kind); -// return roctracer::HccLoader::Instance().hccGetCmdName(kind); + return roctracer::HccLoader::Instance().GetCmdName(kind); #endif break; } @@ -443,7 +443,7 @@ PUBLIC_API roctracer_status_t roctracer_enable_callback( break; } case ACTIVITY_DOMAIN_HIP_API: { - hipError_t hip_err = roctracer::HipLoader::Instance().hipRegisterApiCallback(id, (void*)callback, user_data); + hipError_t hip_err = roctracer::HipLoader::Instance().RegisterApiCallback(id, (void*)callback, user_data); if (hip_err != hipSuccess) HIP_EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "hipRegisterApiCallback error(" << hip_err << ")"); break; } @@ -464,7 +464,7 @@ PUBLIC_API roctracer_status_t roctracer_disable_callback( if (id != 0) HIP_EXC_RAISING(ROCTRACER_STATUS_BAD_PARAMETER, "DOMAIN_ANY: id != 0"); id = HIP_API_ID_ANY; case ACTIVITY_DOMAIN_HIP_API: { - hipError_t hip_err = roctracer::HipLoader::Instance().hipRemoveApiCallback(id); + hipError_t hip_err = roctracer::HipLoader::Instance().RemoveApiCallback(id); if (hip_err != hipSuccess) HIP_EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "hipRemoveApiCallback error(" << hip_err << ")"); break; } @@ -529,16 +529,14 @@ PUBLIC_API roctracer_status_t roctracer_enable_activity( break; case ACTIVITY_DOMAIN_HCC_OPS: { #ifdef HCC_ENABLED - Kalmar::CLAMP::SetActivityIdCallback((void*)roctracer::HCC_ActivityIdCallback); - const bool err = Kalmar::CLAMP::SetActivityCallback(id, (void*)roctracer::HCC_AsyncActivityCallback, (void*)pool); -// roctracer::HccLoader::Instance().hccSetActivityIdCallback((void*)roctracer::HCC_ActivityIdCallback); -// const bool err = roctracer::HccLoader::Instance().hccSetActivityCallback(id, (void*)roctracer::HCC_AsyncActivityCallback, (void*)pool); + roctracer::HccLoader::Instance().SetActivityIdCallback((void*)roctracer::HCC_ActivityIdCallback); + const bool err = roctracer::HccLoader::Instance().SetActivityCallback(id, (void*)roctracer::HCC_AsyncActivityCallback, (void*)pool); if (err == true) HCC_EXC_RAISING(ROCTRACER_STATUS_HCC_OPS_ERR, "HCC::SetActivityCallback error"); #endif break; } case ACTIVITY_DOMAIN_HIP_API: { - const hipError_t hip_err = roctracer::HipLoader::Instance().hipRegisterActivityCallback(id, (void*)roctracer::HIP_SyncActivityCallback, (void*)pool); + const hipError_t hip_err = roctracer::HipLoader::Instance().RegisterActivityCallback(id, (void*)roctracer::HIP_SyncActivityCallback, (void*)pool); if (hip_err != hipSuccess) HIP_EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "hipRegisterActivityCallback error(" << hip_err << ")"); break; } @@ -564,14 +562,13 @@ PUBLIC_API roctracer_status_t roctracer_disable_activity( break; case ACTIVITY_DOMAIN_HCC_OPS: { #ifdef HCC_ENABLED - const bool err = Kalmar::CLAMP::SetActivityCallback(id, NULL, NULL); -// const bool err = roctracer::HccLoader::Instance().hccSetActivityCallback(id, NULL, NULL); - if (err == true) HCC_EXC_RAISING(ROCTRACER_STATUS_HCC_OPS_ERR, "Kalmar::CLAMP::SetActivityCallback(NULL) error"); + const bool err = roctracer::HccLoader::Instance().SetActivityCallback(id, NULL, NULL); + if (err == true) HCC_EXC_RAISING(ROCTRACER_STATUS_HCC_OPS_ERR, "HCC::SetActivityCallback(NULL) error"); #endif break; } case ACTIVITY_DOMAIN_HIP_API: { - const hipError_t hip_err = roctracer::HipLoader::Instance().hipRemoveActivityCallback(id); + const hipError_t hip_err = roctracer::HipLoader::Instance().RemoveActivityCallback(id); if (hip_err != hipSuccess) HIP_EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "hipRemoveActivityCallback error(" << hip_err << ")"); break; }