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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
! Offloading test checking the use of the depend clause on the target construct
! REQUIRES: flang, amdgcn-amd-amdhsa
! UNSUPPORTED: nvptx64-nvidia-cuda
! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
! UNSUPPORTED: aarch64-unknown-linux-gnu
! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
! UNSUPPORTED: x86_64-unknown-linux-gnu
! UNSUPPORTED: x86_64-unknown-linux-gnu-LTO
! RUN: %libomptarget-compile-fortran-run-and-check-generic
subroutine defaultmap_allocatable_present()
implicit none
integer, dimension(:), allocatable :: arr
integer :: N = 16
integer :: i
allocate(arr(N))
!$omp target enter data map(to: arr)
!$omp target defaultmap(present: allocatable)
do i = 1,N
arr(i) = N + 40
end do
!$omp end target
!$omp target exit data map(from: arr)
print *, arr
deallocate(arr)
return
end subroutine
subroutine defaultmap_scalar_tofrom()
implicit none
integer :: scalar_int
scalar_int = 10
!$omp target defaultmap(tofrom: scalar)
scalar_int = 20
!$omp end target
print *, scalar_int
return
end subroutine
subroutine defaultmap_all_default()
implicit none
integer, dimension(:), allocatable :: arr
integer :: aggregate(16)
integer :: N = 16
integer :: i, scalar_int
allocate(arr(N))
scalar_int = 10
aggregate = scalar_int
!$omp target defaultmap(default: all)
scalar_int = 20
do i = 1,N
arr(i) = scalar_int + aggregate(i)
end do
!$omp end target
print *, scalar_int
print *, arr
deallocate(arr)
return
end subroutine
subroutine defaultmap_pointer_to()
implicit none
integer, dimension(:), pointer :: arr_ptr(:)
integer :: scalar_int, i
allocate(arr_ptr(10))
arr_ptr = 10
scalar_int = 20
!$omp target defaultmap(to: pointer)
do i = 1,10
arr_ptr(i) = scalar_int + 20
end do
!$omp end target
print *, arr_ptr
deallocate(arr_ptr)
return
end subroutine
subroutine defaultmap_scalar_from()
implicit none
integer :: scalar_test
scalar_test = 10
!$omp target defaultmap(from: scalar)
scalar_test = 20
!$omp end target
print *, scalar_test
return
end subroutine
subroutine defaultmap_aggregate_to()
implicit none
integer :: aggregate_arr(16)
integer :: i, scalar_test = 0
aggregate_arr = 0
!$omp target map(tofrom: scalar_test) defaultmap(to: aggregate)
do i = 1,16
aggregate_arr(i) = i
scalar_test = scalar_test + aggregate_arr(i)
enddo
!$omp end target
print *, scalar_test
print *, aggregate_arr
return
end subroutine
subroutine defaultmap_dtype_aggregate_to()
implicit none
type :: dtype
real(4) :: i
real(4) :: j
integer(4) :: array_i(10)
integer(4) :: k
integer(4) :: array_j(10)
end type dtype
type(dtype) :: aggregate_type
aggregate_type%k = 20
aggregate_type%array_i = 30
!$omp target defaultmap(to: aggregate)
aggregate_type%k = 40
aggregate_type%array_i(1) = 50
!$omp end target
print *, aggregate_type%k
print *, aggregate_type%array_i(1)
return
end subroutine
program map_present
implicit none
! CHECK: 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56
call defaultmap_allocatable_present()
! CHECK: 20
call defaultmap_scalar_tofrom()
! CHECK: 10
! CHECK: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
call defaultmap_all_default()
! CHECK: 10 10 10 10 10 10 10 10 10 10
call defaultmap_pointer_to()
! CHECK: 20
call defaultmap_scalar_from()
! CHECK: 136
! CHECK: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
call defaultmap_aggregate_to()
! CHECK: 20
! CHECK: 30
call defaultmap_dtype_aggregate_to()
end program
|