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 @@ -339,30 +339,6 @@ return HSA_STATUS_SUCCESS; } -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; - if ((Err = isValidMemoryPool(MemoryPool)) != HSA_STATUS_SUCCESS) { - DP("Skipping memory pool: %s\n", get_error_string(Err)); - } else - Func(MemoryPool, DeviceId); - return HSA_STATUS_SUCCESS; - }); - - if (Err != HSA_STATUS_SUCCESS) { - DP("[%s:%d] %s failed: %s\n", __FILE__, __LINE__, - "Iterate all memory pools", get_error_string(Err)); - return Err; - } - } - - return HSA_STATUS_SUCCESS; -} - std::pair FindKernargPool(const std::vector &HSAAgents) { std::vector KernArgPools; @@ -630,37 +606,50 @@ 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) { + if (GlobalFlags & HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_FINE_GRAINED) { 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; + hsa_status_t setupDevicePools(const std::vector &Agents) { + 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 ValidStatus = core::isValidMemoryPool(MemoryPool); + if (ValidStatus != HSA_STATUS_SUCCESS) { + DP("Alloc allowed in memory pool check failed: %s\n", + get_error_string(ValidStatus)); + return HSA_STATUS_SUCCESS; + } + return addDeviceMemoryPool(MemoryPool, DeviceId); + }); + + if (Err != HSA_STATUS_SUCCESS) { + DP("[%s:%d] %s failed: %s\n", __FILE__, __LINE__, + "Iterate all memory pools", get_error_string(Err)); + return Err; + } } - Err = core::collectMemoryPools( - HSAAgents, std::bind(&RTLDeviceInfoTy::addDeviceMemoryPool, this, _1, _2)); - if (Err != HSA_STATUS_SUCCESS) { - DP("HSA error in collecting memory pools for offload devices: %s\n", - get_error_string(Err)); - return Err; + return HSA_STATUS_SUCCESS; + } + + hsa_status_t setupHostPools(const std::vector &Agents) { + 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 = core::isValidMemoryPool(MemoryPool); + if (Err != HSA_STATUS_SUCCESS) { + DP("isValidMemoryPool returned: %s\n", get_error_string(Err)); + return HSA_STATUS_SUCCESS; + } + return addHostMemoryPool(MemoryPool, DeviceId); + }); + if (Err != HSA_STATUS_SUCCESS) { + DP("[%s:%d] %s failed: %s\n", __FILE__, __LINE__, + "Iterate all memory pools", get_error_string(Err)); + return Err; + } } return HSA_STATUS_SUCCESS; } @@ -753,9 +742,15 @@ DeviceCoarseGrainedMemoryPools.resize(NumberOfDevices); DeviceFineGrainedMemoryPools.resize(NumberOfDevices); - err = setupMemoryPools(); + err = setupHostPools(CPUAgents); + if (err != HSA_STATUS_SUCCESS) { + DP("Error when setting up host memory pools"); + return; + } + + err = setupDevicePools(HSAAgents); if (err != HSA_STATUS_SUCCESS) { - DP("Error when setting up memory pools"); + DP("Error when setting up device memory pools"); return; }