1 /* Test asynchronous, unstructed data regions, directives variant. */
2 /* See also data-2-lib.c. */
3
4 #include <stdlib.h>
5 #undef NDEBUG
6 #include <assert.h>
7
8 int
9 main (int argc, char **argv)
10 {
11 int N = 12345;
12 float *a, *b, *c, *d, *e;
13 int i;
14 int nbytes;
15
16 nbytes = N * sizeof (float);
17
18 a = (float *) malloc (nbytes);
19 b = (float *) malloc (nbytes);
20 c = (float *) malloc (nbytes);
21 d = (float *) malloc (nbytes);
22 e = (float *) malloc (nbytes);
23
24 for (i = 0; i < N; i++)
25 {
26 a[i] = 3.0;
27 b[i] = 0.0;
28 }
29
30 #pragma acc enter data copyin (a[0:N]) async
31 #pragma acc enter data copyin (b[0:N]) async
32 #pragma acc enter data copyin (N) async
33
34 #pragma acc parallel present (a[0:N], b[0:N], N) async
35 #pragma acc loop
36 for (i = 0; i < N; i++)
37 b[i] = a[i];
38
39 #pragma acc update self (a[0:N]) async
40 #pragma acc update self (b[0:N]) async
41
42 #pragma acc wait
43
44 for (i = 0; i < N; i++)
45 {
46 assert (a[i] == 3.0);
47 assert (b[i] == 3.0);
48 }
49
50 for (i = 0; i < N; i++)
51 {
52 a[i] = 2.0;
53 b[i] = 0.0;
54 }
55
56 #pragma acc update device (a[0:N]) async (1)
57 #pragma acc update device (b[0:N]) async (1)
58
59 #pragma acc parallel present (a[0:N], b[0:N], N) async (1)
60 #pragma acc loop
61 for (i = 0; i < N; i++)
62 b[i] = a[i];
63
64 #pragma acc update self (a[0:N]) async (1)
65 #pragma acc update self (b[0:N]) async (1)
66
67 #pragma acc wait (1)
68 /* Test unseen async-argument. */
69 #pragma acc wait (10)
70
71 for (i = 0; i < N; i++)
72 {
73 assert (a[i] == 2.0);
74 assert (b[i] == 2.0);
75 }
76
77 for (i = 0; i < N; i++)
78 {
79 a[i] = 3.0;
80 b[i] = 0.0;
81 c[i] = 0.0;
82 d[i] = 0.0;
83 }
84
85 #pragma acc update device (a[0:N]) async (0)
86 #pragma acc update device (b[0:N]) async (1)
87 #pragma acc enter data copyin (c[0:N]) async (2)
88 #pragma acc enter data copyin (d[0:N]) async (3)
89
90 #pragma acc parallel present (a[0:N], b[0:N], N) wait (0) async (1)
91 #pragma acc loop
92 for (i = 0; i < N; i++)
93 b[i] = (a[i] * a[i] * a[i]) / a[i];
94
95 #pragma acc parallel present (a[0:N], c[0:N], N) wait (0) async (2)
96 #pragma acc loop
97 for (i = 0; i < N; i++)
98 c[i] = (a[i] + a[i] + a[i] + a[i]) / a[i];
99
100 #pragma acc parallel present (a[0:N], d[0:N], N) wait (0) async (3)
101 #pragma acc loop
102 for (i = 0; i < N; i++)
103 d[i] = ((a[i] * a[i] + a[i]) / a[i]) - a[i];
104
105 #pragma acc update self (a[0:N]) async (0)
106 #pragma acc update self (b[0:N]) async (1)
107 #pragma acc update self (c[0:N]) async (2)
108 #pragma acc update self (d[0:N]) async (3)
109
110 #pragma acc wait async (0)
111 #pragma acc wait (0)
112
113 for (i = 0; i < N; i++)
114 {
115 assert (a[i] == 3.0);
116 assert (b[i] == 9.0);
117 assert (c[i] == 4.0);
118 assert (d[i] == 1.0);
119 }
120
121 for (i = 0; i < N; i++)
122 {
123 a[i] = 2.0;
124 b[i] = 0.0;
125 c[i] = 0.0;
126 d[i] = 0.0;
127 e[i] = 0.0;
128 }
129
130 #pragma acc update device (a[0:N]) async (10)
131 #pragma acc update device (b[0:N]) async (11)
132 #pragma acc update device (c[0:N]) async (12)
133 #pragma acc update device (d[0:N]) async (13)
134 #pragma acc enter data copyin (e[0:N]) async (14)
135
136 #pragma acc parallel present (a[0:N], b[0:N], N) wait (10) async (11)
137 for (int ii = 0; ii < N; ii++)
138 b[ii] = (a[ii] * a[ii] * a[ii]) / a[ii];
139
140 #pragma acc parallel present (a[0:N], c[0:N], N) wait (10) async (12)
141 for (int ii = 0; ii < N; ii++)
142 c[ii] = (a[ii] + a[ii] + a[ii] + a[ii]) / a[ii];
143
144 #pragma acc parallel present (a[0:N], d[0:N], N) wait (10) async (13)
145 for (int ii = 0; ii < N; ii++)
146 d[ii] = ((a[ii] * a[ii] + a[ii]) / a[ii]) - a[ii];
147
148 #pragma acc parallel present (a[0:N], b[0:N], c[0:N], d[0:N], e[0:N], N) wait (11) wait (12) wait (13) async (14)
149 for (int ii = 0; ii < N; ii++)
150 e[ii] = a[ii] + b[ii] + c[ii] + d[ii];
151
152 #pragma acc exit data copyout (a[0:N]) async (10)
153 #pragma acc exit data copyout (b[0:N]) async (11)
154 #pragma acc exit data copyout (c[0:N]) async (12)
155 #pragma acc exit data copyout (d[0:N]) async (13)
156 #pragma acc exit data copyout (e[0:N]) async (14)
157 #pragma acc exit data delete (N) async (15)
158 #pragma acc wait
159
160 for (i = 0; i < N; i++)
161 {
162 assert (a[i] == 2.0);
163 assert (b[i] == 4.0);
164 assert (c[i] == 4.0);
165 assert (d[i] == 1.0);
166 assert (e[i] == 11.0);
167 }
168
169 return 0;
170 }