[committed,OG12] libgomp: no need to attach USM pointers
Checks
Commit Message
This patch fixes a bug in which libgomp doesn't know what to do with
attached pointers in fortran derived types when using Unified Shared
Memory instead of explicit mappings.
I've committed it to the devel/omp/gcc-12 branch (OG12) and will fold it
into the next rebase/repost of the USM patches.
Andrew
libgomp: no need to attach USM pointers
Fix a bug in which Fortran pointers inside derived types caused a runtime
error when Unified Shared Memory was active.
libgomp/ChangeLog:
* target.c (gomp_attach_pointer): Check for USM.
* testsuite/libgomp.fortran/usm-3.f90: New test.
@@ -836,6 +836,11 @@ gomp_attach_pointer (struct gomp_device_descr *devicep,
gomp_fatal ("attempt to attach null pointer");
}
+ if (devicep->is_usm_ptr_func
+ && devicep->is_usm_ptr_func ((void*)(target + bias)))
+ /* Nothing to do here. */
+ return;
+
s.host_start = target + bias;
s.host_end = s.host_start + 1;
tn = splay_tree_lookup (mem_map, &s);
new file mode 100644
@@ -0,0 +1,33 @@
+! { dg-do run }
+! { dg-require-effective-target omp_usm }
+
+! Ensure that derived types containing allocated values work
+! with Unified Shared Memory.
+
+program usm
+!$omp requires unified_shared_memory
+ use iso_fortran_env
+ implicit none
+
+ type :: struct
+ real(real64), allocatable :: v(:)
+ end type struct
+
+ integer :: index
+ type(struct) :: s
+
+ real(real64), allocatable :: expected(:)
+
+ allocate(s%v(100))
+ do index = 1, size(s%v)
+ s%v(index) = index
+ end do
+ allocate(expected, mold=s%v)
+ expected = s%v - 1._real64
+
+ !$omp target
+ s%v = s%v - 1._real64
+ !$omp end target
+
+ if (any(s%v /= expected)) STOP 1
+end program usm