diff --git a/projects/rocprofiler/Readme.txt b/projects/rocprofiler/Readme.txt index 3b33d8a996..cc4a772d22 100644 --- a/projects/rocprofiler/Readme.txt +++ b/projects/rocprofiler/Readme.txt @@ -17,7 +17,7 @@ The library source tree: Build environment: -$ export CMAKE_PREFIX_PATH=";" +$ export CMAKE_PREFIX_PATH=: $ export CMAKE_BUILD_TYPE= # release by default $ export CMAKE_DEBUG_TRACE=1 # 1 to enable debug tracing diff --git a/projects/rocprofiler/cmake_modules/env.cmake b/projects/rocprofiler/cmake_modules/env.cmake index 58e9dc5fbc..b7f96420dd 100644 --- a/projects/rocprofiler/cmake_modules/env.cmake +++ b/projects/rocprofiler/cmake_modules/env.cmake @@ -34,7 +34,7 @@ set ( CMAKE_SKIP_BUILD_RPATH TRUE ) ## CLANG options if ( "$ENV{CXX}" STREQUAL "/usr/bin/clang++" ) -set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ferror-limit=1000000" ) + set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ferror-limit=1000000" ) endif() ## Enable debug trace @@ -52,7 +52,12 @@ if ( NOT "$ENV{CMAKE_HSA_PROXY}" STREQUAL "no" ) add_definitions ( -DROCP_HSA_PROXY=1 ) endif() -## Check env vars +## Enable direct loading of AQL-profile HSA extension +if ( DEFINED ENV{CMAKE_LD_AQLPROFILE} ) + add_definitions ( -DROCP_LD_AQLPROFILE=1 ) +endif() + +## Make env vars if ( NOT DEFINED CMAKE_BUILD_TYPE OR "${CMAKE_BUILD_TYPE}" STREQUAL "" ) if ( DEFINED ENV{CMAKE_BUILD_TYPE} ) set ( CMAKE_BUILD_TYPE $ENV{CMAKE_BUILD_TYPE} ) @@ -83,19 +88,15 @@ elseif ( ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86" ) endif () ## Find hsa-runtime headers/lib -find_file ( HSA_RUNTIME_INC "hsa/hsa.h" ) -get_filename_component ( HSA_RUNTIME_INC_PATH ${HSA_RUNTIME_INC} DIRECTORY ) +find_file ( HSA_RUNTIME_INC "hsa.h" ) if ( "${HSA_RUNTIME_INC_PATH}" STREQUAL "" ) - find_file ( HSA_RUNTIME_INC "hsa.h" ) - get_filename_component ( HSA_RUNTIME_INC_PATH ${HSA_RUNTIME_INC} DIRECTORY ) + find_file ( HSA_RUNTIME_INC "hsa/hsa.h" ) endif() - -set ( HSA_RUNTIME_NAME "hsa-runtime64" ) -find_library ( HSA_RUNTIME_LIB "lib${HSA_RUNTIME_NAME}.so" ) +find_library ( HSA_RUNTIME_LIB "libhsa-runtime${NBIT}.so" ) +get_filename_component ( HSA_RUNTIME_INC_PATH ${HSA_RUNTIME_INC} DIRECTORY ) get_filename_component ( HSA_RUNTIME_LIB_PATH ${HSA_RUNTIME_LIB} DIRECTORY ) -set ( HSA_KMT_NAME "hsakmt" ) -find_library ( HSA_KMT_LIB "lib${HSA_KMT_NAME}.so" ) +find_library ( HSA_KMT_LIB "libhsakmt.so" ) get_filename_component ( HSA_KMT_LIB_PATH ${HSA_KMT_LIB} DIRECTORY ) set ( API_PATH ${HSA_RUNTIME_INC_PATH} ) diff --git a/projects/rocprofiler/src/core/metrics.h b/projects/rocprofiler/src/core/metrics.h index 415dae86ee..ae27fcaf82 100644 --- a/projects/rocprofiler/src/core/metrics.h +++ b/projects/rocprofiler/src/core/metrics.h @@ -27,6 +27,7 @@ typedef std::vector counters_vec_t; class Metric { public: Metric(const std::string& name) : name_(name) {} + virtual ~Metric() {} std::string GetName() const { return name_; } virtual void GetCounters(counters_vec_t& vec) const = 0; counters_vec_t GetCounters() const { @@ -64,7 +65,6 @@ class ExprMetric : public Metric { const xml::Expr* expr_; }; - class MetricsDict { public: typedef std::map cache_t; @@ -99,6 +99,12 @@ class MetricsDict { return ret.first->second; } + static void Destroy() { + for (auto& entry : *map_) delete entry.second; + delete map_; + map_ = NULL; + } + const Metric* Get(const std::string& name) const { const Metric* metric = NULL; auto it = cache_.find(name); @@ -106,6 +112,10 @@ class MetricsDict { return metric; } + uint32_t Size() const { return cache_.size(); } + const_iterator_t Begin() const { return cache_.begin(); } + const_iterator_t End() const { return cache_.end(); } + private: MetricsDict(const util::AgentInfo* agent_info) : xml_(NULL) { const char* xml_name = getenv("ROCP_METRICS"); @@ -120,6 +130,7 @@ class MetricsDict { ~MetricsDict() { xml::Xml::Destroy(xml_); + for (auto& entry : cache_) delete entry.second; } void ImportMetrics(const util::AgentInfo* agent_info, const char* scope) { @@ -163,7 +174,6 @@ class MetricsDict { << "'"); } else { xml::Expr* expr_obj = new xml::Expr(expr_str, new ExprCache(&cache_)); - //std::cout << " " << name << " = " << expr_obj->String() << std::endl; counters_vec_t counters_vec; for (const std::string var : expr_obj->GetVars()) { auto it = cache_.find(var); @@ -175,18 +185,18 @@ class MetricsDict { cache_[name] = new ExprMetric(name, counters_vec, expr_obj); } } + } + } -#if 0 - for (auto& v : cache_) { - const Metric* metric = v.second; - counters_vec_t counters_vec; - printf("> Metric '%s'\n", metric->GetName().c_str()); - metric->GetCounters(counters_vec); - for (auto c : counters_vec) { - printf(" counter %s, b(%u), i (%u), e (%u)\n", c->name.c_str(), c->event.block_name, c->event.block_index, c->event.counter_id); - } + void Print() { + for (auto& v : cache_) { + const Metric* metric = v.second; + counters_vec_t counters_vec; + printf("> Metric '%s'\n", metric->GetName().c_str()); + metric->GetCounters(counters_vec); + for (auto c : counters_vec) { + printf(" counter %s, b(%u), i (%u), e (%u)\n", c->name.c_str(), c->event.block_name, c->event.block_index, c->event.counter_id); } -#endif } } diff --git a/projects/rocprofiler/test/ctrl/test_hsa.cpp b/projects/rocprofiler/test/ctrl/test_hsa.cpp index cec8842f2d..5398d97fae 100644 --- a/projects/rocprofiler/test/ctrl/test_hsa.cpp +++ b/projects/rocprofiler/test/ctrl/test_hsa.cpp @@ -79,8 +79,7 @@ bool TestHsa::Initialize(int arg_cnt, char** arg_list) { setup_timer_idx_ = hsa_timer_.CreateTimer(); dispatch_timer_idx_ = hsa_timer_.CreateTimer(); - hsa_rsrc_ = HsaInstantiate(agent_id_); - if (hsa_rsrc_ == NULL) { + if (HsaInstantiate(agent_id_) == NULL) { TEST_ASSERT(false); return false; } diff --git a/projects/rocprofiler/test/util/hsa_rsrc_factory.cpp b/projects/rocprofiler/test/util/hsa_rsrc_factory.cpp index c1080ba887..24c1a4ac3d 100644 --- a/projects/rocprofiler/test/util/hsa_rsrc_factory.cpp +++ b/projects/rocprofiler/test/util/hsa_rsrc_factory.cpp @@ -120,8 +120,11 @@ HsaRsrcFactory::HsaRsrcFactory() { // Get AqlProfile API table aqlprofile_api_ = {0}; +#ifdef ROCP_LD_AQLPROFILE + status = LoadAqlProfileLib(&aqlprofile_api_); +#else status = hsa_system_get_extension_table(HSA_EXTENSION_AMD_AQLPROFILE, 1, 0, &aqlprofile_api_); - if (status != HSA_STATUS_SUCCESS) status = LoadAqlProfileLib(&aqlprofile_api_); +#endif CHECK_STATUS("aqlprofile API table load failed", status); }