aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/target-13.f90
blob: 6aacc7784494746ab27705c8d8b75d2315c726f6 (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
module m
  implicit none
  type t
    integer :: s, a(5)
  end type t

  type t2
    integer :: s, a(5)
    type(t) :: st, at(2:3)
  end type t2

  interface operator(/=)
    procedure ne_compare_t
    procedure ne_compare_t2
  end interface

contains

  logical pure elemental function ne_compare_t (a, b) result(res)
    type(t), intent(in) :: a, b
    res = (a%s /= b%s) .or. any(a%a /= b%a)
  end function

  logical pure elemental function ne_compare_t2 (a, b) result(res)
    type(t2), intent(in) :: a, b
    res = (a%s /= b%s) .or. any(a%a /= b%a)     &
          .or. (a%st /= b%st) .or. any(a%at /= b%at)
  end function
end module m

program p
use m
implicit none

type(t2) :: var1, var2(5), var3(:)
type(t2) :: var1a, var2a(5), var3a(:)
allocatable :: var3, var3a
logical :: shared_memory = .false.

!$omp target map(to: shared_memory)
  shared_memory = .true.
!$omp end target

var1 = T2(1, [1,2,3,4,5], T(11, [11,22,33,44,55]), &
          [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])])

var2 = [T2(101, [201,202,203,204,205], T(2011, [2011,2022,2033,2044,2055]), &
           [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]),       &
        T2(111, [211,212,213,214,215], T(2111, [2111,2122,2133,2144,2155]), &
           [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]),       &
        T2(121, [221,222,223,224,225], T(2211, [2211,2222,2233,2244,2255]), &
           [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]),       &
        T2(131, [231,232,233,234,235], T(2311, [2311,2322,2333,2344,2355]), &
           [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]),       &
        T2(141, [241,242,243,244,245], T(2411, [2411,2422,2433,2444,2455]), &
           [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])])]

var3 = [T2(301, [401,402,403,404,405], T(4011, [4011,4022,4033,4044,4055]), &
           [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]),       &
        T2(311, [411,412,413,414,415], T(4111, [4111,4122,4133,4144,4155]), &
           [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]),       &
        T2(321, [421,422,423,424,425], T(4211, [4211,4222,4233,4244,4255]), &
           [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]),       &
        T2(331, [431,432,433,434,435], T(4311, [4311,4322,4333,4344,4355]), &
           [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]),       &
        T2(341, [441,442,443,444,445], T(4411, [4411,4422,4433,4444,4455]), &
           [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])])]

var1a = var1
var2a = var2
var3a = var3

!$omp target enter data map(to:var1)
!$omp target enter data map(to:var2)
!$omp target enter data map(to:var3)

! ---------------

!$omp target update from(var1%at(2:3))

if (var1a /= var1) error stop
if (any (var2a /= var2)) error stop
if (any (var3a /= var3)) error stop

! ---------------

!$omp target
  var1%st%s = 1243
  var2(3)%at(2) = T(123, [345,64,356,39,13])
  var2(3)%at(3) = T(48, [74,162,572,357,3])
!$omp end target

if (.not. shared_memory) then
  if (var1 /= var1) error stop
  if (any (var2a /= var2)) error stop
  if (any (var3a /= var3)) error stop
endif

!$omp target update from(var1%st) from(var2(3)%at(2:3))

var1a%st%s = 1243
var2a(3)%at(2) = T(123, [345,64,356,39,13])
var2a(3)%at(3) = T(48, [74,162,572,357,3])
if (var1 /= var1) error stop
if (any (var2a /= var2)) error stop
if (any (var3a /= var3)) error stop

! ---------------

var3(1) = var2(1)
var1%at(2)%a = var2(1)%a
var1%at(3)%a = var2(2)%a

var1a = var1
var2a = var2
var3a = var3

!$omp target update to(var3) to(var1%at(2:3))

!$omp target
  var3(1)%s = var3(1)%s + 123
  var1%at(2)%a = var1%at(2)%a * 7
  var1%at(3)%s = var1%at(3)%s * (-3)
!$omp end target

if (.not. shared_memory) then
  if (var1 /= var1) error stop
  if (any (var2a /= var2)) error stop
  if (any (var3a /= var3)) error stop
endif

var3a(1)%s = var3a(1)%s + 123
var1a%at(2)%a = var1a%at(2)%a * 7
var1a%at(3)%s = var1a%at(3)%s * (-3)

block
  integer, volatile :: i1,i2,i3,i4
  i1 = 1
  i2 = 2
  i3 = 1
  i4 = 2
  !$omp target update from(var3(i1:i2)) from(var1%at(i3:i4))
  i1 = 3
  i2 = 3
  i3 = 1
  i4 = 5
  !$omp target update from(var1%at(i1)%s) from(var1%at(i2)%a(i3:i4))
end block

if (var1 /= var1) error stop
if (any (var2a /= var2)) error stop
if (any (var3a /= var3)) error stop

! ---------------

!$omp target exit data map(from:var1)
!$omp target exit data map(from:var2)
!$omp target exit data map(from:var3)
end