diff --git a/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp b/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp --- a/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp +++ b/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp @@ -304,77 +304,59 @@ return header; } -hsa_status_t addKernArgPool(hsa_amd_memory_pool_t MemoryPool, void *Data) { - std::vector *Result = - static_cast *>(Data); +bool isValidMemoryPool(hsa_amd_memory_pool_t MemoryPool) { bool AllocAllowed = false; - hsa_status_t err = hsa_amd_memory_pool_get_info( + hsa_status_t Err = hsa_amd_memory_pool_get_info( MemoryPool, HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_ALLOWED, &AllocAllowed); - if (err != HSA_STATUS_SUCCESS) { + if (Err != HSA_STATUS_SUCCESS) { DP("Alloc allowed in memory pool check failed: %s\n", - get_error_string(err)); - return err; + get_error_string(Err)); + exit(1); } - if (!AllocAllowed) { - // nothing needs to be done here. - return HSA_STATUS_SUCCESS; + size_t Size = 0; + Err = hsa_amd_memory_pool_get_info(MemoryPool, HSA_AMD_MEMORY_POOL_INFO_SIZE, + &Size); + if (Err != HSA_STATUS_SUCCESS) { + DP("Get memory pool size failed: %s\n", get_error_string(Err)); + exit(1); + } + + return AllocAllowed && Size > 0; +} + +hsa_status_t addKernArgPool(hsa_amd_memory_pool_t MemoryPool, void *Data) { + std::vector *Result = + static_cast *>(Data); + + if (!isValidMemoryPool(MemoryPool)) { + return HSA_STATUS_ERROR; } uint32_t GlobalFlags = 0; - err = hsa_amd_memory_pool_get_info( + hsa_status_t err = hsa_amd_memory_pool_get_info( MemoryPool, HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS, &GlobalFlags); if (err != HSA_STATUS_SUCCESS) { DP("Get memory pool info failed: %s\n", get_error_string(err)); return err; } - size_t size = 0; - err = hsa_amd_memory_pool_get_info(MemoryPool, HSA_AMD_MEMORY_POOL_INFO_SIZE, - &size); - if (err != HSA_STATUS_SUCCESS) { - DP("Get memory pool size failed: %s\n", get_error_string(err)); - return err; - } - if ((GlobalFlags & HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_FINE_GRAINED) && - (GlobalFlags & HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT) && - size > 0) { + (GlobalFlags & HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT)) { Result->push_back(MemoryPool); } return HSA_STATUS_SUCCESS; } -std::pair -isValidMemoryPool(hsa_amd_memory_pool_t MemoryPool) { - bool AllocAllowed = false; - hsa_status_t Err = hsa_amd_memory_pool_get_info( - MemoryPool, HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_ALLOWED, - &AllocAllowed); - if (Err != HSA_STATUS_SUCCESS) { - DP("Alloc allowed in memory pool check failed: %s\n", - get_error_string(Err)); - return {Err, false}; - } - - return {HSA_STATUS_SUCCESS, AllocAllowed}; -} - template hsa_status_t collectMemoryPools(const std::vector &Agents, AccumulatorFunc Func) { for (int DeviceId = 0; DeviceId < Agents.size(); DeviceId++) { hsa_status_t Err = hsa::amd_agent_iterate_memory_pools( Agents[DeviceId], [&](hsa_amd_memory_pool_t MemoryPool) { - hsa_status_t Err; - bool Valid = false; - std::tie(Err, Valid) = isValidMemoryPool(MemoryPool); - if (Err != HSA_STATUS_SUCCESS) { - return Err; - } - if (Valid) + if (isValidMemoryPool(MemoryPool)) Func(MemoryPool, DeviceId); return HSA_STATUS_SUCCESS; });