[Openmp-commits] [PATCH] D96667: [OpenMP][FIX] Avoid use of stack allocations in asynchronous calls
Johannes Doerfert via Phabricator via Openmp-commits
openmp-commits at lists.llvm.org
Tue Feb 16 13:38:28 PST 2021
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG2518cc65d2a7: [OpenMP][FIX] Avoid use of stack allocations in asynchronous calls (authored by jdoerfert).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D96667/new/
https://reviews.llvm.org/D96667
Files:
openmp/libomptarget/include/omptarget.h
openmp/libomptarget/src/omptarget.cpp
Index: openmp/libomptarget/src/omptarget.cpp
===================================================================
--- openmp/libomptarget/src/omptarget.cpp
+++ openmp/libomptarget/src/omptarget.cpp
@@ -31,6 +31,11 @@
return Result;
}
+void *&AsyncInfoTy::getVoidPtrLocation() {
+ BufferLocations.push_back(nullptr);
+ return BufferLocations.back();
+}
+
/* All begin addresses for partially mapped structs must be 8-aligned in order
* to ensure proper alignment of members. E.g.
*
@@ -432,7 +437,8 @@
DP("Update pointer (" DPxMOD ") -> [" DPxMOD "]\n",
DPxPTR(PointerTgtPtrBegin), DPxPTR(TgtPtrBegin));
uint64_t Delta = (uint64_t)HstPtrBegin - (uint64_t)HstPtrBase;
- void *TgtPtrBase = (void *)((uint64_t)TgtPtrBegin - Delta);
+ void *&TgtPtrBase = AsyncInfo.getVoidPtrLocation();
+ TgtPtrBase = (void *)((uint64_t)TgtPtrBegin - Delta);
int rt = Device.submitData(PointerTgtPtrBegin, &TgtPtrBase,
sizeof(void *), AsyncInfo);
if (rt != OFFLOAD_SUCCESS) {
@@ -1123,8 +1129,9 @@
DP("Parent lambda base " DPxMOD "\n", DPxPTR(TgtPtrBase));
uint64_t Delta = (uint64_t)HstPtrBegin - (uint64_t)HstPtrBase;
void *TgtPtrBegin = (void *)((uintptr_t)TgtPtrBase + Delta);
- void *PointerTgtPtrBegin = Device.getTgtPtrBegin(
- HstPtrVal, ArgSizes[I], IsLast, false, IsHostPtr);
+ void *&PointerTgtPtrBegin = AsyncInfo.getVoidPtrLocation();
+ PointerTgtPtrBegin = Device.getTgtPtrBegin(HstPtrVal, ArgSizes[I],
+ IsLast, false, IsHostPtr);
if (!PointerTgtPtrBegin) {
DP("No lambda captured variable mapped (" DPxMOD ") - ignored\n",
DPxPTR(HstPtrVal));
Index: openmp/libomptarget/include/omptarget.h
===================================================================
--- openmp/libomptarget/include/omptarget.h
+++ openmp/libomptarget/include/omptarget.h
@@ -14,6 +14,7 @@
#ifndef _OMPTARGET_H_
#define _OMPTARGET_H_
+#include <deque>
#include <stddef.h>
#include <stdint.h>
@@ -136,6 +137,10 @@
/// associated with a libomptarget layer device. RAII semantics to avoid
/// mistakes.
class AsyncInfoTy {
+ /// Locations we used in (potentially) asynchronous calls which should live
+ /// as long as this AsyncInfoTy object.
+ std::deque<void *> BufferLocations;
+
__tgt_async_info AsyncInfo;
DeviceTy &Device;
@@ -151,6 +156,10 @@
///
/// \returns OFFLOAD_FAIL or OFFLOAD_SUCCESS appropriately.
int synchronize();
+
+ /// Return a void* reference with a lifetime that is at least as long as this
+ /// AsyncInfoTy object. The location can be used as intermediate buffer.
+ void *&getVoidPtrLocation();
};
/// This struct is a record of non-contiguous information
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D96667.324106.patch
Type: text/x-patch
Size: 2828 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20210216/d21771ee/attachment.bin>
More information about the Openmp-commits
mailing list