diff --git a/openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp b/openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp index 7b4ea794fe7f0..66a25e29d0162 100644 --- a/openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp +++ b/openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp @@ -1055,7 +1055,7 @@ struct AMDGPUStreamTy { return false; } - // Callback for host-to-host memory copies. + // Callback for host-to-host memory copies. This is an asynchronous action. static Error memcpyAction(void *Data) { MemcpyArgsTy *Args = reinterpret_cast(Data); assert(Args && "Invalid arguments"); @@ -1067,7 +1067,19 @@ struct AMDGPUStreamTy { return Plugin::success(); } - // Callback for releasing a memory buffer to a memory manager. + /// Releasing a memory buffer to a memory manager. This is a post completion + /// action. There are two kinds of memory buffers: + /// 1. For kernel arguments. This buffer can be freed after receiving the + /// kernel completion signal. + /// 2. For H2D tranfers that need pinned memory space for staging. This + /// buffer can be freed after receiving the transfer completion signal. + /// 3. For D2H tranfers that need pinned memory space for staging. This + /// buffer cannot be freed after receiving the transfer completion signal + /// because of the following asynchronous H2H callback. + /// For this reason, This action can only be taken at + /// AMDGPUStreamTy::complete() + /// Because of the case 3, all releaseBufferActions are taken at + /// AMDGPUStreamTy::complete() in the current implementation. static Error releaseBufferAction(void *Data) { ReleaseBufferArgsTy *Args = reinterpret_cast(Data); assert(Args && "Invalid arguments"); @@ -1078,6 +1090,8 @@ struct AMDGPUStreamTy { return Args->MemoryManager->deallocate(Args->Buffer); } + /// Releasing a signal object back to SignalManager. This is a post completion + /// action. This action can only be taken at AMDGPUStreamTy::complete() static Error releaseSignalAction(void *Data) { ReleaseSignalArgsTy *Args = reinterpret_cast(Data); assert(Args && "Invalid arguments");