1 #include <stdio.h> 2 #include <openacc.h> 3 #include <gomp-constants.h> 4 5 #define N (32*32*32+17) main()6int 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