Update 'Q' constraint documentation.
[official-gcc.git] / libgomp / testsuite / libgomp.oacc-c-c++-common / data-2.c
blob2fc4a598e8f6b64e6f3c44f3696a04c1f8d8efa8
1 /* Test asynchronous, unstructed data regions, directives variant. */
2 /* See also data-2-lib.c. */
4 #include <stdlib.h>
5 #undef NDEBUG
6 #include <assert.h>
8 int
9 main (int argc, char **argv)
11 int N = 12345;
12 float *a, *b, *c, *d, *e;
13 int i;
14 int nbytes;
16 nbytes = N * sizeof (float);
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);
24 for (i = 0; i < N; i++)
26 a[i] = 3.0;
27 b[i] = 0.0;
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
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];
39 #pragma acc update self (a[0:N]) async
40 #pragma acc update self (b[0:N]) async
42 #pragma acc wait
44 for (i = 0; i < N; i++)
46 assert (a[i] == 3.0);
47 assert (b[i] == 3.0);
50 for (i = 0; i < N; i++)
52 a[i] = 2.0;
53 b[i] = 0.0;
56 #pragma acc update device (a[0:N]) async (1)
57 #pragma acc update device (b[0:N]) async (1)
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];
64 #pragma acc update self (a[0:N]) async (1)
65 #pragma acc update self (b[0:N]) async (1)
67 #pragma acc wait (1)
68 /* Test unseen async-argument. */
69 #pragma acc wait (10)
71 for (i = 0; i < N; i++)
73 assert (a[i] == 2.0);
74 assert (b[i] == 2.0);
77 for (i = 0; i < N; i++)
79 a[i] = 3.0;
80 b[i] = 0.0;
81 c[i] = 0.0;
82 d[i] = 0.0;
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)
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];
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];
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];
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)
110 #pragma acc wait async (0)
111 #pragma acc wait (0)
113 for (i = 0; i < N; i++)
115 assert (a[i] == 3.0);
116 assert (b[i] == 9.0);
117 assert (c[i] == 4.0);
118 assert (d[i] == 1.0);
121 for (i = 0; i < N; i++)
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;
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)
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];
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];
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];
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];
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
160 for (i = 0; i < N; i++)
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);
169 return 0;