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 @@ -411,6 +411,24 @@ return {HSA_STATUS_SUCCESS, KernArgPools[0]}; } +hsa_status_t addMemoryPool(hsa_amd_memory_pool_t MemoryPool, void *Data) { + std::vector *Result = + static_cast *>(Data); + bool IsValid = false; + hsa_status_t Err; + std::tie(Err, IsValid) = isValidMemoryPool(MemoryPool); + if (Err != HSA_STATUS_SUCCESS) { + DP("isValidMemoryPool failed: %s\n", get_error_string(Err)); + return Err; + } + + if (IsValid) { + Result->push_back(MemoryPool); + } + + return HSA_STATUS_SUCCESS; +} + } // namespace } // namespace core @@ -634,41 +652,9 @@ return HSA_STATUS_SUCCESS; } - hsa_status_t addHostMemoryPool(hsa_amd_memory_pool_t MemoryPool, - int DeviceId) { - uint32_t GlobalFlags = 0; - hsa_status_t Err = hsa_amd_memory_pool_get_info( - MemoryPool, HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS, &GlobalFlags); - - if (Err != HSA_STATUS_SUCCESS) { - return Err; - } - - uint32_t Size; - Err = hsa_amd_memory_pool_get_info(MemoryPool, - HSA_AMD_MEMORY_POOL_INFO_SIZE, &Size); - if (Err != HSA_STATUS_SUCCESS) { - return Err; - } - - if (GlobalFlags & HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_FINE_GRAINED && - Size > 0) { - HostFineGrainedMemoryPool = MemoryPool; - } - - return HSA_STATUS_SUCCESS; - } - hsa_status_t setupMemoryPools() { using namespace std::placeholders; hsa_status_t Err; - Err = core::collectMemoryPools( - CPUAgents, std::bind(&RTLDeviceInfoTy::addHostMemoryPool, this, _1, _2)); - if (Err != HSA_STATUS_SUCCESS) { - DP("HSA error in collecting memory pools for CPU: %s\n", - get_error_string(Err)); - return Err; - } Err = core::collectMemoryPools( HSAAgents, std::bind(&RTLDeviceInfoTy::addDeviceMemoryPool, this, _1, _2)); if (Err != HSA_STATUS_SUCCESS) { @@ -679,6 +665,47 @@ return HSA_STATUS_SUCCESS; } + hsa_status_t setupHostMemoryPools(std::vector &Agents) { + std::vector HostPools; + + // collect all the "valid" pools for all the given agents. + for (const auto &Agent : Agents) { + hsa_status_t Err = hsa_amd_agent_iterate_memory_pools( + Agent, core::addMemoryPool, static_cast(&HostPools)); + if (Err != HSA_STATUS_SUCCESS) { + DP("[%s:%d] %s failed: %s\n", __FILE__, __LINE__, + "Iterate all memory pools", get_error_string(Err)); + return Err; + } + } + + for (const auto &MemoryPool : HostPools) { + hsa_status_t Err = HSA_STATUS_SUCCESS; + uint32_t GlobalFlags = 0; + 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) && + Size > 0) { + HostFineGrainedMemoryPool = MemoryPool; + } + } + + return HSA_STATUS_SUCCESS; + } + hsa_amd_memory_pool_t getDeviceMemoryPool(int DeviceId) { assert(DeviceId >= 0 && DeviceId < DeviceCoarseGrainedMemoryPools.size() && "Invalid device Id"); @@ -772,6 +799,11 @@ DP("Error when setting up memory pools"); return; } + err = setupHostMemoryPools(CPUAgents); + if (err != HSA_STATUS_SUCCESS) { + DP("Error when setting up host memory pools"); + return; + } for (int i = 0; i < NumberOfDevices; i++) { HSAQueues[i] = nullptr;