1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
! { dg-do run }
module mymod
type G
integer :: x, y
integer, pointer :: arr(:)
integer :: z
end type G
end module mymod
program myprog
use mymod
integer, target :: arr1(10)
integer, target :: arr2(10)
integer, target :: arr3(10)
type(G), dimension(3) :: gvar
integer :: i, j
gvar(1)%arr => arr1
gvar(2)%arr => arr2
gvar(3)%arr => arr3
gvar(1)%arr = 0
gvar(2)%arr = 0
gvar(3)%arr = 0
i = 1
j = 1
! Here 'gvar(i)' and 'gvar(j)' are the same element, so this should work.
! This generates a whole-array mapping for gvar(i)%arr, but with the
! "runtime implicit" bit set so the smaller subarray gvar(j)%arr(1:5) takes
! precedence.
!$omp target map(gvar(i)%arr, gvar(j)%arr(1:5))
gvar(i)%arr(1) = gvar(i)%arr(1) + 1
gvar(j)%arr(1) = gvar(j)%arr(1) + 2
!$omp end target
!$omp target map(gvar(i)%arr(1:5), gvar(j)%arr)
gvar(i)%arr(1) = gvar(i)%arr(1) + 3
gvar(j)%arr(1) = gvar(j)%arr(1) + 4
!$omp end target
! For these ones, we know the array index is the same, so we can just
! drop the whole-array mapping.
!$omp target map(gvar(i)%arr, gvar(i)%arr(1:5))
gvar(i)%arr(1) = gvar(i)%arr(1) + 1
gvar(i)%arr(1) = gvar(j)%arr(1) + 2
!$omp end target
!$omp target map(gvar(i)%arr(1:5), gvar(i)%arr)
gvar(i)%arr(1) = gvar(i)%arr(1) + 3
gvar(i)%arr(1) = gvar(j)%arr(1) + 4
!$omp end target
if (gvar(1)%arr(1).ne.20) stop 1
end program myprog
|