1 /* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting 2 aspects of that functionality. */ 3 4 #include <assert.h> 5 6 /* Test of reduction on parallel directive. */ 7 8 #define ACTUAL_GANGS 256 9 10 int main(int argc,char * argv[])11main (int argc, char *argv[]) 12 { 13 int res, res1 = 0, res2 = 0; 14 15 #if defined(ACC_DEVICE_TYPE_host) 16 # define GANGS 1 17 #else 18 # define GANGS 256 19 #endif 20 #pragma acc parallel num_gangs(GANGS) num_workers(32) vector_length(32) \ 21 reduction(+:res1) copy(res2, res1) 22 /* { dg-bogus "warning: region is gang partitioned but does not contain gang partitioned code" "TODO 'reduction', 'atomic'" { xfail { ! openacc_host_selected } } .-2 } */ 23 /* { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-3 } */ 24 /* { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-4 } */ 25 { 26 res1 += 5; 27 28 #pragma acc atomic 29 res2 += 5; 30 } 31 res = GANGS * 5; 32 33 assert (res == res1); 34 assert (res == res2); 35 #undef GANGS 36 37 res = res1 = res2 = 1; 38 39 #if defined(ACC_DEVICE_TYPE_host) 40 # define GANGS 1 41 #else 42 # define GANGS 8 43 #endif 44 #pragma acc parallel num_gangs(GANGS) num_workers(32) vector_length(32) \ 45 reduction(*:res1) copy(res1, res2) 46 /* { dg-bogus "warning: region is gang partitioned but does not contain gang partitioned code" "TODO 'reduction', 'atomic'" { xfail { ! openacc_host_selected } } .-2 } */ 47 /* { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-3 } */ 48 /* { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-4 } */ 49 { 50 res1 *= 5; 51 52 #pragma acc atomic 53 res2 *= 5; 54 } 55 for (int i = 0; i < GANGS; ++i) 56 res *= 5; 57 58 assert (res == res1); 59 assert (res == res2); 60 #undef GANGS 61 62 return 0; 63 } 64