From ed575729bd1df633e4d20c9eba71da63b88febf5 Mon Sep 17 00:00:00 2001 From: Chris Freehill Date: Tue, 26 Nov 2024 12:11:18 -0600 Subject: [PATCH] rocr: Dynamically allocate supported_isas map This was missing from a previous commit regarding dynamically allocated static data structures. Change-Id: Iae1c674e762f85e3aebf338210ba96942ba80278 [ROCm/ROCR-Runtime commit: eec2130443c5205c41d8386eb1fd35081bcc5c0b] --- .../runtime/hsa-runtime/core/runtime/isa.cpp | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/isa.cpp b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/isa.cpp index f6a8f754b7..0b4f2db36b 100755 --- a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/isa.cpp +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/isa.cpp @@ -271,12 +271,14 @@ IsaRegistry::GetSupportedGenericVersions() { const IsaRegistry::IsaMap& IsaRegistry::GetSupportedIsas() { // agent, and vendor name length limit excluding terminating nul character. constexpr size_t hsa_name_size = 63; - static IsaMap supported_isas; + // This allocation is meant to last until the last thread has exited. + // It is intentionally not freed. + static IsaMap* supported_isas = new IsaMap(); - if (supported_isas.size() > 0) { - return supported_isas; + if (supported_isas->size() > 0) { + return *supported_isas; } - + auto parse_out_minor_ver = [&](const std::string& generic_name) -> int32_t { size_t dot_pos = generic_name.find('.'); int32_t min; @@ -298,21 +300,21 @@ const IsaRegistry::IsaMap& IsaRegistry::GetSupportedIsas() { { \ assert(std::char_traits::length(name) <= hsa_name_size); \ std::string isa_name = prepend_isa_prefix(name); \ - supported_isas[isa_name].targetid_ = name; \ - supported_isas[isa_name].version_ = Isa::Version(maj, min, stp); \ - supported_isas[isa_name].sramecc_ = sramecc; \ - supported_isas[isa_name].xnack_ = xnack; \ - supported_isas[isa_name].wavefront_.num_threads_ = wavefrontsize; \ + (*supported_isas)[isa_name].targetid_ = name; \ + (*supported_isas)[isa_name].version_ = Isa::Version(maj, min, stp); \ + (*supported_isas)[isa_name].sramecc_ = sramecc; \ + (*supported_isas)[isa_name].xnack_ = xnack; \ + (*supported_isas)[isa_name].wavefront_.num_threads_ = wavefrontsize; \ std::string genericname(gen_name); \ if (genericname.size() != 0) { \ std::string gen_isa_name = prepend_isa_prefix(genericname); \ - supported_isas[isa_name].generic_ = gen_isa_name; \ - if (supported_isas.find(gen_isa_name) == supported_isas.end()) { \ - supported_isas[gen_isa_name].targetid_ = genericname; \ - supported_isas[gen_isa_name].version_ = Isa::Version(maj, parse_out_minor_ver(genericname), 0xFF); \ - supported_isas[gen_isa_name].sramecc_ = sramecc; \ - supported_isas[gen_isa_name].xnack_ = xnack; \ - supported_isas[gen_isa_name].wavefront_.num_threads_ = wavefrontsize; \ + (*supported_isas)[isa_name].generic_ = gen_isa_name; \ + if ((*supported_isas).find(gen_isa_name) == (*supported_isas).end()) { \ + (*supported_isas)[gen_isa_name].targetid_ = genericname; \ + (*supported_isas)[gen_isa_name].version_ = Isa::Version(maj, parse_out_minor_ver(genericname), 0xFF); \ + (*supported_isas)[gen_isa_name].sramecc_ = sramecc; \ + (*supported_isas)[gen_isa_name].xnack_ = xnack; \ + (*supported_isas)[gen_isa_name].wavefront_.num_threads_ = wavefrontsize; \ } \ } \ } @@ -434,7 +436,7 @@ const IsaRegistry::IsaMap& IsaRegistry::GetSupportedIsas() { ISAREG_ENTRY_GEN("gfx1201", 12, 0, 1, unsupported, unsupported, 32, "gfx12-generic") #undef ISAREG_ENTRY_GEN - return supported_isas; + return *supported_isas; } } // namespace core