aboutsummaryrefslogtreecommitdiff
path: root/offload/test/offloading/fortran/target-defaultmap.f90
blob: d7184371129d2663716ab8fc2d4f4c64e212b08f (plain)
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