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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
! { dg-additional-options "-foffload-options=nvptx-none=-misa=sm_35" { target { offload_target_nvptx } } }
implicit none
!$omp requires reverse_offload
type t2
integer :: a, b, c
end type t2
type t
integer :: A(5), B(5), C(5)
integer, pointer :: P(:), P2 !Just some padding
type(t2) :: tt !Just some padding
end type t
type(t) :: S1, S2
logical :: shared_mem
shared_mem = .false.
!$omp target map(to: shared_mem)
shared_mem = .true.
!$omp end target
s1%A = [1,2,3,4,5]
s1%B = [10,20,30,40,50]
s1%C = [11,22,33,44,55]
s2%A = 2*s1%A
s2%B = 2*s1%B
s2%C = 2*s1%C
!$omp target &
!$omp& map(to: s1%b, s1%c) &
!$omp& map(to: s2%b, s2%c)
block
type(t) :: si1, si2, si3, si4
s1%B = -10 * s1%B
s1%C = -10 * s1%C
s2%B = -15 * s2%B
s2%C = -15 * s2%C
si1%A = -1 * [1,2,3,4,5]
si1%B = -1 * [10,20,30,40,50]
si1%C = -1 * [11,22,33,44,55]
si2%A = -23 * [1,2,3,4,5]
si2%B = -23 * [10,20,30,40,50]
si2%C = -23 * [11,22,33,44,55]
!$omp target device (ancestor:1) &
!$omp& map(to: si1%C, si1%B) &
!$omp& map(tofrom: si2%C, si2%B) &
!$omp& map(always, to: s1%B) &
!$omp& map( to: s2%B)
if (any (s1%A /= [1,2,3,4,5])) stop 1
if (any (s1%B /= -10 * [10,20,30,40,50])) stop 2
if (shared_mem) then
if (any (s1%C /= -10 * [11,22,33,44,55])) stop 4
else
if (any (s1%C /= [11,22,33,44,55])) stop 3
endif
if (any (s2%A /= 2 * [1,2,3,4,5])) stop 4
if (shared_mem) then
if (any (s2%B /= -15 * 2 * [10,20,30,40,50])) stop 5
if (any (s2%C /= -15 * 2 * [11,22,33,44,55])) stop 6
else
if (any (s2%B /= 2 * [10,20,30,40,50])) stop 7
if (any (s2%C /= 2 * [11,22,33,44,55])) stop 8
endif
if (any (si1%B /= -1 * [10,20,30,40,50])) stop 9
if (any (si1%C /= -1 * [11,22,33,44,55])) stop 10
if (any (si2%B /= -23 * [10,20,30,40,50])) stop 10
if (any (si2%C /= -23 * [11,22,33,44,55])) stop 11
s1%A = 5 * s1%A
s1%B = 7 * s1%B
s1%C = 13 * s1%C
s2%A = 9 * s2%A
s2%B = 21 * s2%B
s2%C = 31 * s2%C
si1%B = -11 * si1%B
si1%C = -13 * si1%C
si2%B = -27 * si2%B
si2%C = -29 * si2%C
!$omp end target
if (shared_mem) then
if (any (s1%B /= -10 * 7 * [10,20,30,40,50])) stop 20
if (any (s1%C /= -10 * 13 * [11,22,33,44,55])) stop 21
else
if (any (s1%B /= -10 * [10,20,30,40,50])) stop 22
if (any (s1%C /= -10 * [11,22,33,44,55])) stop 23
endif
if (shared_mem) then
if (any (s2%B /= -15 * 2 * 21 * [10,20,30,40,50])) stop 24
if (any (s2%C /= -15 * 2 * 31 * [11,22,33,44,55])) stop 25
else
if (any (s2%B /= -15 * 2 * [10,20,30,40,50])) stop 26
if (any (s2%C /= -15 * 2 * [11,22,33,44,55])) stop 27
endif
if (any (si1%A /= -1 * [1,2,3,4,5])) stop 28
if (shared_mem) then
if (any (si1%B /= -1 * (-11) * [10,20,30,40,50])) stop 29
if (any (si1%C /= -1 * (-13) * [11,22,33,44,55])) stop 30
else
if (any (si1%B /= -1 * [10,20,30,40,50])) stop 31
if (any (si1%C /= -1 * [11,22,33,44,55])) stop 32
endif
if (any (si2%A /= -23 * [1,2,3,4,5])) stop 33
if (any (si2%B /= -23 * (-27) * [10,20,30,40,50])) stop 34
if (any (si2%C /= -23 * (-29) * [11,22,33,44,55])) stop 35
end block
if (any (s1%A /= 5 * [1,2,3,4,5])) stop 40
if (any (s1%B /= -10 * 7 * [10,20,30,40,50])) stop 41
if (shared_mem) then
if (any (s1%C /= -10 * 13 * [11,22,33,44,55])) stop 42
else
if (any (s1%C /= 13 * [11,22,33,44,55])) stop 43
endif
if (any (s2%A /= 2 * 9 * [1,2,3,4,5])) stop 44
if (shared_mem) then
if (any (s2%B /= -15 * 2 * 21 * [10,20,30,40,50])) stop 45
if (any (s2%C /= -15 * 2 * 31 * [11,22,33,44,55])) stop 46
else
if (any (s2%B /= 2 * 21 * [10,20,30,40,50])) stop 47
if (any (s2%C /= 2 * 31 * [11,22,33,44,55])) stop 48
endif
end
|