OpenACC 2.5 default (present) clause
[gcc.git] / libgomp / testsuite / libgomp.oacc-fortran / data-4-2.f90
1 ! Copy of data-4.f90 with self exchanged with host for !acc update, and with
2 ! default (present) clauses added.
3
4 ! { dg-do run }
5
6 program asyncwait
7 real, allocatable :: a(:), b(:), c(:), d(:), e(:)
8 integer i, N
9
10 N = 64
11
12 allocate (a(N))
13 allocate (b(N))
14 allocate (c(N))
15 allocate (d(N))
16 allocate (e(N))
17
18 a(:) = 3.0
19 b(:) = 0.0
20
21 !$acc enter data copyin (a(1:N)) copyin (b(1:N)) copyin (N) async
22
23 !$acc parallel default (present) async wait
24 !$acc loop
25 do i = 1, N
26 b(i) = a(i)
27 end do
28 !$acc end parallel
29
30 !$acc update self (a(1:N), b(1:N)) async wait
31 !$acc wait
32
33 do i = 1, N
34 if (a(i) .ne. 3.0) call abort
35 if (b(i) .ne. 3.0) call abort
36 end do
37
38 a(:) = 2.0
39 b(:) = 0.0
40
41 !$acc update device (a(1:N), b(1:N)) async (1)
42
43 !$acc parallel default (present) async (1) wait (1)
44 !$acc loop
45 do i = 1, N
46 b(i) = a(i)
47 end do
48 !$acc end parallel
49
50 !$acc update host (a(1:N), b(1:N)) async (1) wait (1)
51 !$acc wait (1)
52
53 do i = 1, N
54 if (a(i) .ne. 2.0) call abort
55 if (b(i) .ne. 2.0) call abort
56 end do
57
58 a(:) = 3.0
59 b(:) = 0.0
60 c(:) = 0.0
61 d(:) = 0.0
62
63 !$acc enter data copyin (c(1:N), d(1:N)) async (1)
64 !$acc update device (a(1:N), b(1:N)) async (1)
65
66 !$acc parallel default (present) async (1)
67 do i = 1, N
68 b(i) = (a(i) * a(i) * a(i)) / a(i)
69 end do
70 !$acc end parallel
71
72 !$acc parallel default (present) async (1)
73 do i = 1, N
74 c(i) = (a(i) * 4) / a(i)
75 end do
76 !$acc end parallel
77
78 !$acc parallel default (present) async (1)
79 do i = 1, N
80 d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i)
81 end do
82 !$acc end parallel
83
84 !$acc update self (a(1:N), b(1:N), c(1:N), d(1:N)) async (1) wait (1)
85
86 !$acc wait (1)
87
88 do i = 1, N
89 if (a(i) .ne. 3.0) call abort
90 if (b(i) .ne. 9.0) call abort
91 if (c(i) .ne. 4.0) call abort
92 if (d(i) .ne. 1.0) call abort
93 end do
94
95 a(:) = 2.0
96 b(:) = 0.0
97 c(:) = 0.0
98 d(:) = 0.0
99 e(:) = 0.0
100
101 !$acc enter data copyin (e(1:N)) async (1)
102 !$acc update device (a(1:N), b(1:N), c(1:N), d(1:N)) async (1)
103
104 !$acc parallel default (present) async (1)
105 do i = 1, N
106 b(i) = (a(i) * a(i) * a(i)) / a(i)
107 end do
108 !$acc end parallel
109
110 !$acc parallel default (present) async (1)
111 do i = 1, N
112 c(i) = (a(i) * 4) / a(i)
113 end do
114 !$acc end parallel
115
116 !$acc parallel default (present) async (1)
117 do i = 1, N
118 d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i)
119 end do
120 !$acc end parallel
121
122 !$acc parallel default (present) wait (1) async (1)
123 do i = 1, N
124 e(i) = a(i) + b(i) + c(i) + d(i)
125 end do
126 !$acc end parallel
127
128 !$acc update self (a(1:N), b(1:N), c(1:N), d(1:N), e(1:N)) async (1) wait (1)
129 !$acc wait (1)
130 !$acc exit data delete (N, a(1:N), b(1:N), c(1:N), d(1:N), e(1:N))
131
132 do i = 1, N
133 if (a(i) .ne. 2.0) call abort
134 if (b(i) .ne. 4.0) call abort
135 if (c(i) .ne. 4.0) call abort
136 if (d(i) .ne. 1.0) call abort
137 if (e(i) .ne. 11.0) call abort
138 end do
139 end program asyncwait