From 26be00aafe89ab4dad38f5af14b1a2c7df1125c8 Mon Sep 17 00:00:00 2001 From: Giovanni LB Date: Sat, 26 Aug 2023 03:04:24 -0300 Subject: [PATCH] Reduced overhead of codeobj track Change-Id: If2b2c1fd110793b92964a55e5dcb4c449eaed4a2 --- src/core/isa_capture/code_object_track.cpp | 59 ++++++++++------------ src/core/isa_capture/code_object_track.hpp | 8 +-- 2 files changed, 28 insertions(+), 39 deletions(-) diff --git a/src/core/isa_capture/code_object_track.cpp b/src/core/isa_capture/code_object_track.cpp index 8357b5bfbb..1b3165dbee 100644 --- a/src/core/isa_capture/code_object_track.cpp +++ b/src/core/isa_capture/code_object_track.cpp @@ -44,19 +44,22 @@ #include "src/core/isa_capture/code_object_track.hpp" #include -std::mutex codeobj_capture_instance::mutex; std::mutex codeobj_record::mutex; -std::unordered_map codeobj_capture_instance::codeobjs{}; +std::unordered_map codeobj_record::codeobjs{}; std::unordered_map codeobj_record::record_id_map{}; std::unordered_set codeobj_record::listeners; // Codeobj Record codeobj_record::codeobj_record(rocprofiler_codeobj_capture_mode_t mode) : capture_mode(mode){}; +static uint64_t timestamp() { + return rocprofiler::ROCProfiler_Singleton::GetInstance().timestamp_ns().value; +} + void codeobj_record::start_capture() { listeners.insert(this); - for (auto& [addr, capture] : codeobj_capture_instance::codeobjs) this->addcapture(capture); + for (auto& [addr, capture] : codeobjs) this->addcapture(capture); } void codeobj_record::addcapture(CodeobjPtr& capture) { @@ -66,29 +69,25 @@ void codeobj_record::addcapture(CodeobjPtr& capture) { } void codeobj_record::stop_capture() { - try { - listeners.erase(this); - } catch (...) { - }; + listeners.erase(this); } // Codeobj Capture void codeobj_capture_instance::Load(uint64_t addr, const std::string& URI, uint64_t mem_addr, - uint64_t mem_size) { - std::lock_guard lock(mutex); - codeobjs[addr] = std::make_shared( - addr, URI, mem_addr, mem_size, rocprofiler::ROCProfiler_Singleton::GetInstance().timestamp_ns().value); - std::atomic_thread_fence(std::memory_order_release); // Fencing the state of the map - { - std::lock_guard lock(codeobj_record::mutex); - for (auto* listen : codeobj_record::listeners) listen->addcapture(codeobjs.at(addr)); - } + uint64_t size) { + std::lock_guard lock(codeobj_record::mutex); + auto inst = std::make_shared(addr, URI, mem_addr, size, timestamp()); + codeobj_record::codeobjs[addr] = inst; + for (auto* listen : codeobj_record::listeners) listen->addcapture(inst); } void codeobj_capture_instance::Unload(uint64_t addr) { - std::lock_guard lock(mutex); - codeobjs.at(addr)->end_time = rocprofiler::ROCProfiler_Singleton::GetInstance().timestamp_ns().value; - codeobjs.erase(addr); + std::lock_guard lock(codeobj_record::mutex); + + if (codeobj_record::codeobjs.find(addr) == codeobj_record::codeobjs.end()) return; + + codeobj_record::codeobjs.at(addr)->end_time = timestamp(); + codeobj_record::codeobjs.erase(addr); } void codeobj_capture_instance::copyCodeobjFromFile(uint64_t offset, uint64_t size, @@ -184,38 +183,32 @@ std::pair codeobj_capture_instance::parse_uri() { codeobj_capture_instance::codeobj_capture_instance(uint64_t _addr, const std::string& _uri, uint64_t mem_addr, uint64_t mem_size, uint64_t start_time) - : addr(_addr), start_time(start_time), URI(_uri), mem_addr(mem_addr), mem_size(mem_size) { - reset(ROCPROFILER_CAPTURE_SYMBOLS_ONLY); -}; + : addr(_addr), start_time(start_time), URI(_uri), mem_addr(mem_addr), mem_size(mem_size) {}; void codeobj_capture_instance::setmode(rocprofiler_codeobj_capture_mode_t mode) { // Only reset when needed & check if codeobj was not unloaded - if (end_time == 0 && static_cast(mode) > static_cast(capture_mode)) - reset(mode); + if (static_cast(mode) > capture_mode) reset(mode); } void codeobj_capture_instance::reset(rocprofiler_codeobj_capture_mode_t mode) { - capture_mode = mode; + capture_mode = static_cast(mode); + if (!buffer.empty()) return; size_t offset, size; try { std::tie(offset, size) = parse_uri(); } catch (...) { + rocprofiler::warning("Error parsing URI %s", URI.c_str()); return; } - - buffer = std::vector{}; - - if (mode == ROCPROFILER_CAPTURE_SYMBOLS_ONLY) return; - if (protocol == "file") { if (mode == ROCPROFILER_CAPTURE_COPY_FILE_AND_MEMORY) copyCodeobjFromFile(offset, size, decoded_path); } else if (protocol == "memory") { - copyCodeobjFromMemory(mem_addr, mem_size); + if (mode != ROCPROFILER_CAPTURE_SYMBOLS_ONLY && end_time == 0) + copyCodeobjFromMemory(mem_addr, mem_size); } else { printf("\"%s\" protocol not supported\n", protocol.c_str()); - return; } } @@ -242,7 +235,7 @@ void codeobj_record::stop_capture(rocprofiler_record_id_t id) { } rocprofiler_codeobj_symbols_t codeobj_record::get_capture(rocprofiler_record_id_t id) { - std::lock_guard lock(mutex); // Fencing the state of the map + std::lock_guard lock(mutex); auto& pair = record_id_map.at(id.handle); return pair.second->get(pair.first); } diff --git a/src/core/isa_capture/code_object_track.hpp b/src/core/isa_capture/code_object_track.hpp index 339de2bf20..9adb703ce8 100644 --- a/src/core/isa_capture/code_object_track.hpp +++ b/src/core/isa_capture/code_object_track.hpp @@ -50,8 +50,6 @@ class codeobj_capture_instance { static void Load(uint64_t addr, const std::string& URI, uint64_t mem_addr, uint64_t mem_size); static void Unload(uint64_t addr); - static std::unordered_map> codeobjs; - private: void reset(rocprofiler_codeobj_capture_mode_t mode); @@ -68,10 +66,7 @@ class codeobj_capture_instance { uint64_t mem_addr; uint64_t mem_size; uint64_t end_time = 0; - rocprofiler_codeobj_capture_mode_t capture_mode; - - // Address -> codeobj - static std::mutex mutex; + int capture_mode = -1; }; typedef std::shared_ptr CodeobjPtr; @@ -112,6 +107,7 @@ class codeobj_record { static std::unordered_set listeners; static std::mutex mutex; + static std::unordered_map codeobjs; private: rocprofiler_codeobj_symbols_t get(uint64_t userdata) {