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
6program 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) STOP 1
35     if (b(i) .ne. 3.0) STOP 2
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) STOP 3
55     if (b(i) .ne. 2.0) STOP 4
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) STOP 5
90     if (b(i) .ne. 9.0) STOP 6
91     if (c(i) .ne. 4.0) STOP 7
92     if (d(i) .ne. 1.0) STOP 8
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) STOP 9
134     if (b(i) .ne. 4.0) STOP 10
135     if (c(i) .ne. 4.0) STOP 11
136     if (d(i) .ne. 1.0) STOP 12
137     if (e(i) .ne. 11.0) STOP 13
138  end do
139end program asyncwait
140