diff --git a/projects/rocprofiler-systems/external/timemory b/projects/rocprofiler-systems/external/timemory index 24407d37ab8..f3f2b94eada 160000 --- a/projects/rocprofiler-systems/external/timemory +++ b/projects/rocprofiler-systems/external/timemory @@ -1 +1 @@ -Subproject commit 24407d37ab85c46ba6c18fba9498320f825ee4e4 +Subproject commit f3f2b94eada2657d9f8de1bc8c6ee4cd9b10a90a diff --git a/projects/rocprofiler-systems/source/lib/rocprof-sys/library/rocprofiler-sdk/counters.hpp b/projects/rocprofiler-systems/source/lib/rocprof-sys/library/rocprofiler-sdk/counters.hpp index 945445e220e..bff6b14dd00 100644 --- a/projects/rocprofiler-systems/source/lib/rocprof-sys/library/rocprofiler-sdk/counters.hpp +++ b/projects/rocprofiler-systems/source/lib/rocprof-sys/library/rocprofiler-sdk/counters.hpp @@ -23,6 +23,7 @@ #pragma once #include "common/synchronized.hpp" +#include "core/containers/stable_vector.hpp" #include "core/perfetto.hpp" #include "core/timemory.hpp" #include "library/rocprofiler-sdk/fwd.hpp" @@ -121,23 +122,43 @@ namespace operation template <> struct set_storage<::rocprofsys::rocprofiler_sdk::counter_data_tracker> { - static constexpr size_t max_threads = 4096; - using type = ::rocprofsys::rocprofiler_sdk::counter_data_tracker; - using storage_array_t = std::array*, max_threads>; + static constexpr size_t initial_capacity = ROCPROFSYS_MAX_THREADS; + using type = ::rocprofsys::rocprofiler_sdk::counter_data_tracker; + using storage_array_t = + ::rocprofsys::container::stable_vector*, initial_capacity>; friend struct get_storage; ROCPROFSYS_DEFAULT_OBJECT(set_storage) - auto operator()(storage* _v, size_t _idx) const { get().at(_idx) = _v; } + auto operator()(storage* _v, size_t _idx) const + { + ensure_capacity(_idx); + get().at(_idx) = _v; + } + auto operator()(type&, size_t) const {} - auto operator()(storage* _v) const { get().fill(_v); } + + auto operator()(storage* _v) const + { + // Fill all existing elements with the same storage pointer + auto& vec = get(); + for(size_t i = 0; i < vec.size(); ++i) + vec[i] = _v; + } private: static storage_array_t& get() { - static storage_array_t _v = { nullptr }; + static storage_array_t _v(initial_capacity, nullptr); return _v; } + + static void ensure_capacity(size_t _idx) + { + auto& vec = get(); + while(vec.size() <= _idx) + vec.emplace_back(nullptr); + } }; template <> @@ -160,6 +181,7 @@ struct get_storage<::rocprofsys::rocprofiler_sdk::counter_data_tracker> auto operator()(size_t _idx) const { + operation::set_storage::ensure_capacity(_idx); return operation::set_storage::get().at(_idx); }