]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libgomp/testsuite/libgomp.oacc-c-c++-common/loop-auto-1.c
1 /* { dg-additional-options "-fopenacc-dim=32" } */
5 #include <gomp-constants.h>
7 int check (const int *ary
, int size
, int gp
, int wp
, int vp
)
11 int gangs
[32], workers
[32], vectors
[32];
13 for (ix
= 0; ix
< 32; ix
++)
14 gangs
[ix
] = workers
[ix
] = vectors
[ix
] = 0;
16 for (ix
= 0; ix
< size
; ix
++)
18 vectors
[ary
[ix
] & 0xff]++;
19 workers
[(ary
[ix
] >> 8) & 0xff]++;
20 gangs
[(ary
[ix
] >> 16) & 0xff]++;
23 for (ix
= 0; ix
< 32; ix
++)
27 int expect
= gangs
[0];
28 if (gangs
[ix
] != expect
)
31 printf ("gang %d not used %d times\n", ix
, expect
);
34 else if (ix
&& gangs
[ix
])
37 printf ("gang %d unexpectedly used\n", ix
);
42 int expect
= workers
[0];
43 if (workers
[ix
] != expect
)
46 printf ("worker %d not used %d times\n", ix
, expect
);
49 else if (ix
&& workers
[ix
])
52 printf ("worker %d unexpectedly used\n", ix
);
57 int expect
= vectors
[0];
58 if (vectors
[ix
] != expect
)
61 printf ("vector %d not used %d times\n", ix
, expect
);
64 else if (ix
&& vectors
[ix
])
67 printf ("vector %d unexpectedly used\n", ix
);
74 #pragma acc routine seq
75 static int __attribute__((noinline
)) place ()
79 int g
= 0, w
= 0, v
= 0;
80 g
= __builtin_goacc_parlevel_id (GOMP_DIM_GANG
);
81 w
= __builtin_goacc_parlevel_id (GOMP_DIM_WORKER
);
82 v
= __builtin_goacc_parlevel_id (GOMP_DIM_VECTOR
);
83 r
= (g
<< 16) | (w
<< 8) | v
;
88 static void clear (int *ary
, int size
)
92 for (ix
= 0; ix
< size
; ix
++)
96 int vector_1 (int *ary
, int size
)
100 #pragma acc parallel num_workers (32) vector_length(32) copy(ary[0:size]) firstprivate (size)
102 #pragma acc loop gang
103 for (int jx
= 0; jx
< 1; jx
++)
104 #pragma acc loop auto
105 for (int ix
= 0; ix
< size
; ix
++)
109 return check (ary
, size
, 0, 1, 1);
112 int vector_2 (int *ary
, int size
)
116 #pragma acc parallel num_workers (32) vector_length(32) copy(ary[0:size]) firstprivate (size)
118 #pragma acc loop worker
119 for (int jx
= 0; jx
< size
/ 64; jx
++)
120 #pragma acc loop auto
121 for (int ix
= 0; ix
< 64; ix
++)
122 ary
[ix
+ jx
* 64] = place ();
125 return check (ary
, size
, 0, 1, 1);
128 int worker_1 (int *ary
, int size
)
132 #pragma acc parallel num_workers (32) vector_length(32) copy(ary[0:size]) firstprivate (size)
134 #pragma acc loop gang
135 for (int kx
= 0; kx
< 1; kx
++)
136 #pragma acc loop auto
137 for (int jx
= 0; jx
< size
/ 64; jx
++)
138 #pragma acc loop vector
139 for (int ix
= 0; ix
< 64; ix
++)
140 ary
[ix
+ jx
* 64] = place ();
143 return check (ary
, size
, 0, 1, 1);
146 int gang_1 (int *ary
, int size
)
150 #pragma acc parallel num_gangs (32) num_workers (32) vector_length(32) copy(ary[0:size]) firstprivate (size)
152 #pragma acc loop auto
153 for (int jx
= 0; jx
< size
/ 64; jx
++)
154 #pragma acc loop worker
155 for (int ix
= 0; ix
< 64; ix
++)
156 ary
[ix
+ jx
* 64] = place ();
159 return check (ary
, size
, 1, 1, 0);
162 int gang_2 (int *ary
, int size
)
166 #pragma acc parallel num_gangs (32) num_workers (32) vector_length(32) copy(ary[0:size]) firstprivate (size)
168 #pragma acc loop auto
169 for (int kx
= 0; kx
< size
/ (32 * 32); kx
++)
170 #pragma acc loop auto
171 for (int jx
= 0; jx
< 32; jx
++)
172 #pragma acc loop auto
173 for (int ix
= 0; ix
< 32; ix
++)
174 ary
[ix
+ jx
* 32 + kx
* 32 * 32] = place ();
177 return check (ary
, size
, 1, 1, 1);
180 int gang_3 (int *ary
, int size
)
184 #pragma acc parallel num_workers (32) vector_length(32) copy(ary[0:size]) firstprivate (size)
186 #pragma acc loop auto
187 for (int jx
= 0; jx
< size
/ 64; jx
++)
188 #pragma acc loop auto
189 for (int ix
= 0; ix
< 64; ix
++)
190 ary
[ix
+ jx
* 64] = place ();
193 return check (ary
, size
, 1, 1, 1);
196 int gang_4 (int *ary
, int size
)
200 #pragma acc parallel vector_length(32) copy(ary[0:size]) firstprivate (size)
202 #pragma acc loop auto
203 for (int jx
= 0; jx
< size
; jx
++)
207 return check (ary
, size
, 1, 0, 1);
210 #define N (32*32*32*2)
215 #pragma acc parallel copy(ondev)
217 ondev
= acc_on_device (acc_device_not_host
);
224 if (vector_1 (ary
, N
))
226 if (vector_2 (ary
, N
))
229 if (worker_1 (ary
, N
))