1 #include <stdio.h>
2 #include <openacc.h>
3 #include <gomp-constants.h>
4 
5 #define N (32*32*32+17)
main()6 int main ()
7 {
8   int ix;
9   int ondev = 0;
10   int q = 0,  h = 0;
11   int workersize;
12 
13 #pragma acc parallel num_workers(32) vector_length(32) copy(q) copy(ondev) \
14 	    copyout(workersize)
15   {
16     int t = q;
17 
18 #pragma acc loop worker reduction(+:t)
19     for (unsigned ix = 0; ix < N; ix++)
20       {
21 	int val = ix;
22 
23 	if (acc_on_device (acc_device_not_host))
24 	  {
25 	    int g, w, v;
26 
27 	    g = __builtin_goacc_parlevel_id (GOMP_DIM_GANG);
28 	    w = __builtin_goacc_parlevel_id (GOMP_DIM_WORKER);
29 	    v = __builtin_goacc_parlevel_id (GOMP_DIM_VECTOR);
30 	    val = (g << 16) | (w << 8) | v;
31 	    ondev = 1;
32 	  }
33 	t += val;
34       }
35     q = t;
36     workersize = __builtin_goacc_parlevel_size (GOMP_DIM_WORKER);
37   }
38 
39   for (ix = 0; ix < N; ix++)
40     {
41       int val = ix;
42       if(ondev)
43 	{
44 	  int g = 0;
45 	  int w = ix % workersize;
46 	  int v = 0;
47 
48 	  val = (g << 16) | (w << 8) | v;
49 	}
50       h += val;
51     }
52   if (q != h)
53     {
54       printf ("t=%x expected %x\n", q, h);
55       return 1;
56     }
57 
58   return 0;
59 }
60