aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/target9.f90
blob: 30adc1bd70afca1e36de0d5e70e3cb7de68517f1 (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
! { dg-do run }
! { dg-require-effective-target offload_device_nonshared_as } */

module target_test
  implicit none (type, external)
  integer, parameter :: N = 40
  integer :: sum
  integer :: var1 = 1
  integer :: var2 = 2

  !$omp declare target to(D)
  integer :: D(N) = 0
contains
  subroutine enter_data (X)
    integer :: X(:)
    !$omp target enter data map(to: var1, var2, X) map(alloc: sum)
  end subroutine enter_data

  subroutine exit_data_0 (D)
    integer :: D(N)
    !$omp target exit data map(delete: D)
  end subroutine exit_data_0

  subroutine exit_data_1 ()
    !$omp target exit data map(from: var1)
  end subroutine exit_data_1

  subroutine exit_data_2 (X)
    integer :: X(N)
    !$omp target exit data map(from: var2) map(release: X, sum)
  end subroutine exit_data_2

  subroutine exit_data_3 (p, idx)
    integer :: p(:)
    integer, value :: idx
    !$omp target exit data map(from: p(idx))
  end subroutine exit_data_3

  subroutine test_nested ()
    integer :: X, Y, Z
    X = 0
    Y = 0
    Z = 0

    !$omp target data map(from: X, Y, Z)
      !$omp target data map(from: X, Y, Z)
        !$omp target map(from: X, Y, Z)
          X = 1337
          Y = 1337
          Z = 1337
        !$omp end target
        if (X /= 0) stop 11
        if (Y /= 0) stop 12
        if (Z /= 0) stop 13

        !$omp target exit data map(from: X) map(release: Y)
        if (X /= 0) stop 14
        if (Y /= 0) stop 15

        !$omp target exit data map(release: Y) map(delete: Z)
        if (Y /= 0) stop 16
        if (Z /= 0) stop 17
      !$omp end target data
      if (X /= 1337) stop 18
      if (Y /= 0) stop 19
      if (Z /= 0) stop 20

      !$omp target map(from: X)
        X = 2448
      !$omp end target
      if (X /= 2448) stop 21
      if (Y /= 0) stop 22
      if (Z /= 0) stop 23

      X = 4896
    !$omp end target data
    if (X /= 4896) stop 24
    if (Y /= 0) stop 25
    if (Z /= 0) stop 26
  end subroutine test_nested
end module target_test

program main
  use target_test
  implicit none (type, external)

  integer, allocatable :: X(:)
  integer, pointer, contiguous :: Y(:)


  allocate(X(N), Y(N))
  X(10) = 10
  Y(20) = 20
  call enter_data (X)

  call exit_data_0 (D)  ! This should have no effect on D.

  !$omp target map(alloc: var1, var2, X) map(to: Y) map(always, from: sum)
    var1 = var1 + X(10)
    var2 = var2 + Y(20)
    sum = var1 + var2
    D(sum) = D(sum) + 1
  !$omp end target

  if (var1 /= 1) stop 1
  if (var2 /= 2) stop 2
  if (sum /= 33) stop 3

  call exit_data_1 ()
  if (var1 /= 11) stop 4
  if (var2 /= 2) stop 5

  ! Increase refcount of already mapped X(1:N).
  !$omp target enter data map(alloc: X(16:17))

  call exit_data_2 (X)
  if (var2 /= 22) stop 6

  call exit_data_3 (X, 5) ! Unmap X(1:N).

  deallocate (X, Y)

  call test_nested ()
end program main