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])) + llvm::SmallVector OutputSignals; + if (auto Err = SignalManager.getResources(2, OutputSignals)) return Err; OutputSignals[0]->reset(); OutputSignals[1]->reset(); @@ -1215,10 +1211,8 @@ uint64_t CopySize, 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])) + llvm::SmallVector OutputSignals; + 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,8 +1161,8 @@ 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) { const std::lock_guard Lock(Mutex); @@ -1180,6 +1180,32 @@ return Plugin::success(); } + /// 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, + llvm::SmallVectorImpl &Handles) { + Handles.resize(Num); + + const std::lock_guard Lock(Mutex); + + assert(NextAvailable <= ResourcePool.size() && + "Resource pool is corrupted"); + + 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 handles in the output array parameter. + for (uint32_t r = 0; r < Num; ++r) + Handles[r] = ResourcePool[NextAvailable + r]; + + NextAvailable += Num; + + return Plugin::success(); + } + /// Return resource to the pool. Error returnResource(ResourceHandleTy Handle) { const std::lock_guard Lock(Mutex);