[Openmp-commits] [PATCH] D84996: [OpenMP] Fixed the issue that target memory deallocation might be called when they're being used
Shilei Tian via Phabricator via Openmp-commits
openmp-commits at lists.llvm.org
Thu Jul 30 18:00:43 PDT 2020
tianshilei1992 created this revision.
Herald added subscribers: openmp-commits, guansong, yaxunl.
Herald added a project: OpenMP.
tianshilei1992 requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added a subscriber: sstefan1.
This patch fixed the issue that target memory might be deallocated when
they're still being used or before they're used.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D84996
Files:
openmp/libomptarget/src/omptarget.cpp
Index: openmp/libomptarget/src/omptarget.cpp
===================================================================
--- openmp/libomptarget/src/omptarget.cpp
+++ openmp/libomptarget/src/omptarget.cpp
@@ -421,11 +421,25 @@
return OFFLOAD_SUCCESS;
}
+namespace {
+/// This structure contains information to deallocate a target pointer
+struct DeallocTgtPtrInfo {
+ void *HstPtrBegin;
+ int64_t DataSize;
+ bool ForceDelete;
+ bool HasCloseModifier;
+
+ DeallocTgtPtrInfo(void *P, int64_t S, bool F, bool H)
+ : HstPtrBegin(P), DataSize(S), ForceDelete(F), HasCloseModifier(H) {}
+};
+} // namespace
+
/// Internal function to undo the mapping and retrieve the data from the device.
int targetDataEnd(DeviceTy &Device, int32_t ArgNum, void **ArgBases,
void **Args, int64_t *ArgSizes, int64_t *ArgTypes,
void **ArgMappers, __tgt_async_info *AsyncInfo) {
int Ret;
+ std::vector<DeallocTgtPtrInfo> DeallocTgtPtrs;
// process each input.
for (int32_t I = ArgNum - 1; I >= 0; --I) {
// Ignore private variables and arrays - there is no mapping for them.
@@ -574,15 +588,27 @@
}
Device.ShadowMtx.unlock();
- // Deallocate map
- if (DelEntry) {
- Ret = Device.deallocTgtPtr(HstPtrBegin, DataSize, ForceDelete,
- HasCloseModifier);
- if (Ret != OFFLOAD_SUCCESS) {
- DP("Deallocating data from device failed.\n");
- return OFFLOAD_FAIL;
- }
- }
+ // Add pointer to the buffer for later deallocation
+ if (DelEntry)
+ DeallocTgtPtrs.emplace_back(HstPtrBegin, DataSize, ForceDelete,
+ HasCloseModifier);
+ }
+ }
+
+ // We need to synchronize before deallocating data
+ Ret = Device.synchronize(AsyncInfo);
+ if (Ret != OFFLOAD_SUCCESS) {
+ DP("Failed to synchronize device.\n");
+ return OFFLOAD_FAIL;
+ }
+
+ // Deallocate target pointer
+ for (DeallocTgtPtrInfo &Info : DeallocTgtPtrs) {
+ Ret = Device.deallocTgtPtr(Info.HstPtrBegin, Info.DataSize,
+ Info.ForceDelete, Info.HasCloseModifier);
+ if (Ret != OFFLOAD_SUCCESS) {
+ DP("Deallocating data from device failed.\n");
+ return OFFLOAD_FAIL;
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84996.282092.patch
Type: text/x-patch
Size: 2286 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20200731/c9482112/attachment.bin>
More information about the Openmp-commits
mailing list