[Openmp-commits] [PATCH] D72525: [LIBOMPTARGET] Do not increment/decrement the refcount for "declare target" objects

George Rokos via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Fri Jan 10 10:31:55 PST 2020


grokos created this revision.
grokos added reviewers: jdoerfert, ABataev, Hahnfeld.
grokos added a project: OpenMP.

The reference counter for global objects marked with `declare target` is INF. This patch prevents the runtime from incrementing /decrementing INF refcounts. Without it, the `map(delete: global_object)` directive actually deallocates the global on the device. With this patch, such a directive becomes a no-op.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D72525

Files:
  openmp/libomptarget/src/device.cpp
  openmp/libomptarget/test/mapping/delete_inf_refcount.c


Index: openmp/libomptarget/test/mapping/delete_inf_refcount.c
===================================================================
--- /dev/null
+++ openmp/libomptarget/test/mapping/delete_inf_refcount.c
@@ -0,0 +1,32 @@
+// RUN: %libomptarget-compile-run-and-check-aarch64-unknown-linux-gnu
+// RUN: %libomptarget-compile-run-and-check-powerpc64-ibm-linux-gnu
+// RUN: %libomptarget-compile-run-and-check-powerpc64le-ibm-linux-gnu
+// RUN: %libomptarget-compile-run-and-check-x86_64-pc-linux-gnu
+
+#include <stdio.h>
+#include <omp.h>
+
+#pragma omp declare target
+int isHost;
+#pragma omp end declare target
+
+int main(void) {
+  isHost = -1;
+
+#pragma omp target enter data map(to: isHost)
+
+#pragma omp target
+  { isHost = omp_is_initial_device(); }
+#pragma omp target update from(isHost)
+
+  if (isHost < 0) {
+    printf("Runtime error, isHost=%d\n", isHost);
+  }
+
+#pragma omp target exit data map(delete: isHost)
+
+  // CHECK: Target region executed on the device
+  printf("Target region executed on the %s\n", isHost ? "host" : "device");
+
+  return isHost;
+}
Index: openmp/libomptarget/src/device.cpp
===================================================================
--- openmp/libomptarget/src/device.cpp
+++ openmp/libomptarget/src/device.cpp
@@ -173,7 +173,7 @@
     auto &HT = *lr.Entry;
     IsNew = false;
 
-    if (UpdateRefCount)
+    if (!CONSIDERED_INF(HT.RefCount) && UpdateRefCount)
       ++HT.RefCount;
 
     uintptr_t tp = HT.TgtPtrBegin + ((uintptr_t)HstPtrBegin - HT.HstPtrBegin);
@@ -231,7 +231,7 @@
     auto &HT = *lr.Entry;
     IsLast = !(HT.RefCount > 1);
 
-    if (HT.RefCount > 1 && UpdateRefCount)
+    if (!CONSIDERED_INF(HT.RefCount) && HT.RefCount > 1 && UpdateRefCount)
       --HT.RefCount;
 
     uintptr_t tp = HT.TgtPtrBegin + ((uintptr_t)HstPtrBegin - HT.HstPtrBegin);
@@ -279,9 +279,9 @@
   LookupResult lr = lookupMapping(HstPtrBegin, Size);
   if (lr.Flags.IsContained || lr.Flags.ExtendsBefore || lr.Flags.ExtendsAfter) {
     auto &HT = *lr.Entry;
-    if (ForceDelete)
+    if (ForceDelete && !CONSIDERED_INF(HT.RefCount))
       HT.RefCount = 1;
-    if (--HT.RefCount <= 0) {
+    if (!CONSIDERED_INF(HT.RefCount) && --HT.RefCount <= 0) {
       assert(HT.RefCount == 0 && "did not expect a negative ref count");
       DP("Deleting tgt data " DPxMOD " of size %ld\n",
           DPxPTR(HT.TgtPtrBegin), Size);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D72525.237380.patch
Type: text/x-patch
Size: 2382 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20200110/ea2fb2e0/attachment.bin>


More information about the Openmp-commits mailing list