Hi Thomas,

I now played also around common blocks with "!$acc declare device_resident (/block/)". [See attached test-case diff.]

Observations:

* !$acc declare has to come after the declaration of the common block. In terms of the spec, it just needs to be in the declaration section, i.e. it could also be before. – Seems as if one needs to split parsing and resolving clauses.

* If I just use '!$acc parallel', the used variables are copied in according to OpenMP 4.0 semantics, i.e. without a defaultmap clause (of OpenMP 4.5+; not yet in gfortran), scalars are firstprivate and arrays are map(fromto:). – Does this behaviour match the spec or should this automatically mapped to, e.g., no_create as the 'device_resident' is known? [Side remark: the module file does contain "OACC_DECLARE_DEVICE_RESIDENT".]

* If I explicitly use '!$acc parallel present(/block/)' that fails because present() does not permit common blocks. (OpenACC 2.7, p36, l.1054: "For all clauses except deviceptr and present, the list argument may include a Fortran common block name enclosed within slashes"). I could use no_create, but that's not yet supported.

Cheers,

Tobias

diff --git a/libgomp/testsuite/libgomp.oacc-fortran/declare-5.f90 b/libgomp/testsuite/libgomp.oacc-fortran/declare-5.f90
index 3ab91147e07..fd46b02abf9 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/declare-5.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/declare-5.f90
@@ -1,29 +1,106 @@
 ! { dg-do run }
 
 module vars
   implicit none
   real b
- !$acc declare device_resident (b)
+  !$acc declare device_resident (b)
+
+  integer :: x, y, z
+  common /block/ x, y, z
+  !$acc declare device_resident (/block/)
 end module vars
 
+subroutine set()
+  use openacc
+  implicit none
+  integer :: a(5), b(1), c, vals(7)
+  common /another/ a, b, c
+  !$acc declare device_resident (/another/)
+  if (.not. acc_is_present (a)) stop 10
+  if (.not. acc_is_present (b)) stop 11
+  if (.not. acc_is_present (c)) stop 12
+
+  vals = 99
+  !$acc parallel copyout(vals) present(a, b, c) ! OK
+                                                ! but w/o 'present', 'c' is firstprivate and a+b are 'map(fromto:'
+                                                ! additionally, OpenACC 2.7 does not permit present(/another/)
+                                                ! and no_create is not yet in the trunk (but submitted)
+    a = [11,12,13,14,15]
+    b = 16
+    c = 47
+    vals(1:5) = a
+    vals(6:6) = b
+    vals(7) = c
+  !$acc end parallel
+
+  if (.not. acc_is_present (a)) stop 13
+  if (.not. acc_is_present (b)) stop 14
+  if (.not. acc_is_present (c)) stop 15
+
+  if (any (vals /= [11,12,13,14,15,16,47])) stop 16
+end subroutine set
+
+subroutine check()
+  use openacc
+  implicit none
+  integer :: g, h(3), i(3)
+  common /another/ g, h, i
+  integer :: val(7)
+  !$acc declare device_resident (/another/)
+  if (.not. acc_is_present (g)) stop 20
+  if (.not. acc_is_present (h)) stop 21
+  if (.not. acc_is_present (i)) stop 22
+
+  val = 99
+  !$acc parallel copyout(val) present(g, h, i)
+    val(5:7) = i
+    val(1) = g
+    val(2:4) = h
+  !$acc end parallel
+
+  if (.not. acc_is_present (g)) stop 23
+  if (.not. acc_is_present (h)) stop 24
+  if (.not. acc_is_present (i)) stop 25
+
+
+  !print *, val
+  if (any (val /= [11,12,13,14,15,16,47])) stop 26
+end subroutine check
+
+
 program test
   use vars
   use openacc
   implicit none
   real a
+  integer :: k
 
-  if (acc_is_present (b) .neqv. .true.) STOP 1
+  call set()
+  call check()
+
+  if (.not. acc_is_present (b)) stop 1
+  if (.not. acc_is_present (x)) stop 2
+  if (.not. acc_is_present (y)) stop 3
+  if (.not. acc_is_present (z)) stop 4
 
   a = 2.0
+  k = 42
 
-  !$acc parallel copy (a)
+  !$acc parallel copy (a, k)
     b = a
     a = 1.0
     a = a + b
+    x = k
+    y = 7*k - 2*x
+    z = 3*y
+    k = k - z + y
    !$acc end parallel
 
-  if (acc_is_present (b) .neqv. .true.) STOP 2
-
-  if (a .ne. 3.0) STOP 3
+  if (.not. acc_is_present (b)) stop 5
+  if (.not. acc_is_present (x)) stop 6
+  if (.not. acc_is_present (y)) stop 7
+  if (.not. acc_is_present (z)) stop 8
 
+  if (a /= 3.0) stop 3
+  if (k /= -378) stop 3
 end program test

Reply via email to