Index: openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp =================================================================== --- openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp +++ openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp @@ -1142,13 +1142,9 @@ Error pushMemoryCopyD2HAsync(void *Dst, const void *Src, void *Inter, uint64_t CopySize, AMDGPUMemoryManagerTy &MemoryManager) { - // TODO: Managers should define a function to retrieve multiple resources - // in a single call. // Retrieve available signals for the operation's outputs. AMDGPUSignalTy *OutputSignals[2] = {nullptr}; - if (auto Err = SignalManager.getResource(OutputSignals[0])) - return Err; - if (auto Err = SignalManager.getResource(OutputSignals[1])) + if (auto Err = SignalManager.getResources(2, OutputSignals)) return Err; OutputSignals[0]->reset(); OutputSignals[1]->reset(); @@ -1216,9 +1212,7 @@ AMDGPUMemoryManagerTy &MemoryManager) { // Retrieve available signals for the operation's outputs. AMDGPUSignalTy *OutputSignals[2] = {nullptr}; - if (auto Err = SignalManager.getResource(OutputSignals[0])) - return Err; - if (auto Err = SignalManager.getResource(OutputSignals[1])) + if (auto Err = SignalManager.getResources(2, OutputSignals)) return Err; OutputSignals[0]->reset(); OutputSignals[1]->reset(); Index: openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h =================================================================== --- openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h +++ openmp/libomptarget/plugins-nextgen/common/PluginInterface/PluginInterface.h @@ -1161,21 +1161,31 @@ return Plugin::success(); } - /// Get resource from the pool or create new resources. If the function - /// succeeeds, the handle to the resource is saved in \p Handle. + /// Get a resource from the pool or create new ones. If the function succeeds, + /// the handle to the resource is saved in \p Handle. Error getResource(ResourceHandleTy &Handle) { + return getResources(1, &Handle); + } + + /// Get multiple resources from the pool or create new ones. If the function + /// succeeeds, the handles to the resources are saved in \p Handles. + Error getResources(uint32_t Num, ResourceHandleTy *Handles) { const std::lock_guard Lock(Mutex); assert(NextAvailable <= ResourcePool.size() && "Resource pool is corrupted"); - if (NextAvailable == ResourcePool.size()) - // By default we double the resource pool every time. - if (auto Err = ResourcePoolTy::resizeResourcePool(NextAvailable * 2)) + if (NextAvailable + Num > ResourcePool.size()) + // Double the resource pool or resize it to provide the requested ones. + if (auto Err = ResourcePoolTy::resizeResourcePool( + std::max(NextAvailable * 2, NextAvailable + Num))) return Err; - // Save the handle in the output parameter. - Handle = ResourcePool[NextAvailable++]; + // Save the handles in the output array parameter. + for (uint32_t r = 0; r < Num; ++r) + Handles[r] = ResourcePool[NextAvailable + r]; + + NextAvailable += Num; return Plugin::success(); }