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