|
41 | 41 | //////////////////////////////////////////////////////////////////////////////// |
42 | 42 |
|
43 | 43 | #include "core/inc/isa.h" |
| 44 | +#include "core/util/utils.h" |
44 | 45 |
|
45 | 46 | #include <algorithm> |
46 | 47 | #include <cstring> |
@@ -95,6 +96,11 @@ std::string Isa::GetProcessorName() const { |
95 | 96 | return processor.substr(0, processor.find(':')); |
96 | 97 | } |
97 | 98 |
|
| 99 | +static __forceinline std::string prepend_isa_prefix(const std::string &isa_name) { |
| 100 | + constexpr char hsa_isa_name_prefix[] = "amdgcn-amd-amdhsa--"; |
| 101 | + return hsa_isa_name_prefix + isa_name; |
| 102 | +} |
| 103 | + |
98 | 104 | std::string Isa::GetIsaName() const { |
99 | 105 | constexpr char hsa_isa_name_prefix[] = "amdgcn-amd-amdhsa--"; |
100 | 106 | return std::string(hsa_isa_name_prefix) + targetid_; |
@@ -221,27 +227,27 @@ const Isa *IsaRegistry::GetIsa(const Isa::Version &version, IsaFeature sramecc, |
221 | 227 |
|
222 | 228 | const IsaRegistry::IsaMap& IsaRegistry::GetSupportedIsas() { |
223 | 229 |
|
224 | | -// agent, and vendor name length limit excluding terminating nul character. |
225 | | -constexpr size_t hsa_name_size = 63; |
| 230 | + // agent, and vendor name length limit excluding terminating nul character. |
| 231 | + constexpr size_t hsa_name_size = 63; |
| 232 | + // This allocation is meant to last until the last thread has exited. |
| 233 | + // It is intentionally not freed. |
| 234 | + static IsaMap* supported_isas = new IsaMap(); |
| 235 | + |
| 236 | + if (supported_isas->size() > 0) { |
| 237 | + return *supported_isas; |
| 238 | + } |
226 | 239 |
|
227 | 240 | // FIXME: Use static_assert when C++17 used. |
228 | 241 | #define ISAREG_ENTRY_GEN(name, maj, min, stp, sramecc, xnack, wavefrontsize) \ |
229 | | - assert(std::char_traits<char>::length(name) <= hsa_name_size); \ |
230 | | - Isa amd_amdgpu_##maj##min##stp##_SRAMECC_##sramecc##_XNACK_##xnack##_WAVEFRONTSIZE_##wavefrontsize; \ |
231 | | - amd_amdgpu_##maj##min##stp##_SRAMECC_##sramecc##_XNACK_##xnack##_WAVEFRONTSIZE_##wavefrontsize.targetid_ = name; \ |
232 | | - amd_amdgpu_##maj##min##stp##_SRAMECC_##sramecc##_XNACK_##xnack##_WAVEFRONTSIZE_##wavefrontsize.version_ = Isa::Version(maj, min, stp); \ |
233 | | - amd_amdgpu_##maj##min##stp##_SRAMECC_##sramecc##_XNACK_##xnack##_WAVEFRONTSIZE_##wavefrontsize.sramecc_ = sramecc; \ |
234 | | - amd_amdgpu_##maj##min##stp##_SRAMECC_##sramecc##_XNACK_##xnack##_WAVEFRONTSIZE_##wavefrontsize.xnack_ = xnack; \ |
235 | | - amd_amdgpu_##maj##min##stp##_SRAMECC_##sramecc##_XNACK_##xnack##_WAVEFRONTSIZE_##wavefrontsize.wavefront_.num_threads_ = wavefrontsize; \ |
236 | | - supported_isas.insert(std::make_pair( \ |
237 | | - amd_amdgpu_##maj##min##stp##_SRAMECC_##sramecc##_XNACK_##xnack##_WAVEFRONTSIZE_##wavefrontsize.GetIsaName(), \ |
238 | | - amd_amdgpu_##maj##min##stp##_SRAMECC_##sramecc##_XNACK_##xnack##_WAVEFRONTSIZE_##wavefrontsize)); \ |
239 | | - |
240 | | - static IsaMap supported_isas; |
241 | | - |
242 | | - if (supported_isas.size() > 0) { |
243 | | - return supported_isas; |
244 | | - } |
| 242 | + { \ |
| 243 | + assert(std::char_traits<char>::length(name) <= hsa_name_size); \ |
| 244 | + std::string isa_name = prepend_isa_prefix(name); \ |
| 245 | + (*supported_isas)[isa_name].targetid_ = name; \ |
| 246 | + (*supported_isas)[isa_name].version_ = Isa::Version(maj, min, stp); \ |
| 247 | + (*supported_isas)[isa_name].sramecc_ = sramecc; \ |
| 248 | + (*supported_isas)[isa_name].xnack_ = xnack; \ |
| 249 | + (*supported_isas)[isa_name].wavefront_.num_threads_ = wavefrontsize; \ |
| 250 | + } |
245 | 251 |
|
246 | 252 | const IsaFeature unsupported = IsaFeature::Unsupported; |
247 | 253 | const IsaFeature any = IsaFeature::Any; |
@@ -359,7 +365,7 @@ constexpr size_t hsa_name_size = 63; |
359 | 365 | ISAREG_ENTRY_GEN("gfx1200", 12, 0, 0, unsupported, unsupported, 32) |
360 | 366 | ISAREG_ENTRY_GEN("gfx1201", 12, 0, 1, unsupported, unsupported, 32) |
361 | 367 | #undef ISAREG_ENTRY_GEN |
362 | | - return supported_isas; |
| 368 | + return *supported_isas; |
363 | 369 | } |
364 | 370 |
|
365 | 371 | } // namespace core |
|
0 commit comments