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