1 /* Exercise nested function decomposition, gcc/tree-nested.c. */ 2 /* See gcc/testsuite/gfortran.dg/goacc/nested-function-1.f90 for the Fortran 3 version. */ 4 main()5int main () 6 { 7 #define N 100 8 int nonlocal_arg; 9 int nonlocal_a[N]; 10 int nonlocal_i; 11 int nonlocal_j; 12 13 for (int i = 0; i < N; ++i) 14 nonlocal_a[i] = 5; 15 nonlocal_arg = 5; 16 17 void local () 18 { 19 int local_i; 20 int local_arg; 21 int local_a[N]; 22 int local_j; 23 24 for (int i = 0; i < N; ++i) 25 local_a[i] = 5; 26 local_arg = 5; 27 28 #pragma acc kernels loop \ 29 gang(num:local_arg) worker(local_arg) vector(local_arg) \ 30 wait async(local_arg) 31 for (local_i = 0; local_i < N; ++local_i) 32 { 33 #pragma acc cache (local_a[local_i:5]) 34 local_a[local_i] = 100; 35 #pragma acc loop seq tile(*) 36 for (local_j = 0; local_j < N; ++local_j) 37 ; 38 #pragma acc loop auto independent tile(1) 39 for (local_j = 0; local_j < N; ++local_j) 40 ; 41 } 42 43 #pragma acc kernels loop \ 44 gang(static:local_arg) worker(local_arg) vector(local_arg) \ 45 wait(local_arg, local_arg + 1, local_arg + 2) async 46 for (local_i = 0; local_i < N; ++local_i) 47 { 48 #pragma acc cache (local_a[local_i:4]) 49 local_a[local_i] = 100; 50 #pragma acc loop seq tile(1) 51 for (local_j = 0; local_j < N; ++local_j) 52 ; 53 #pragma acc loop auto independent tile(*) 54 for (local_j = 0; local_j < N; ++local_j) 55 ; 56 } 57 } 58 59 void nonlocal () 60 { 61 for (int i = 0; i < N; ++i) 62 nonlocal_a[i] = 5; 63 nonlocal_arg = 5; 64 65 #pragma acc kernels loop \ 66 gang(num:nonlocal_arg) worker(nonlocal_arg) vector(nonlocal_arg) \ 67 wait async(nonlocal_arg) 68 for (nonlocal_i = 0; nonlocal_i < N; ++nonlocal_i) 69 { 70 #pragma acc cache (nonlocal_a[nonlocal_i:3]) 71 nonlocal_a[nonlocal_i] = 100; 72 #pragma acc loop seq tile(2) 73 for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j) 74 ; 75 #pragma acc loop auto independent tile(3) 76 for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j) 77 ; 78 } 79 80 #pragma acc kernels loop \ 81 gang(static:nonlocal_arg) worker(nonlocal_arg) vector(nonlocal_arg) \ 82 wait(nonlocal_arg, nonlocal_arg + 1, nonlocal_arg + 2) async 83 for (nonlocal_i = 0; nonlocal_i < N; ++nonlocal_i) 84 { 85 #pragma acc cache (nonlocal_a[nonlocal_i:2]) 86 nonlocal_a[nonlocal_i] = 100; 87 #pragma acc loop seq tile(*) 88 for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j) 89 ; 90 #pragma acc loop auto independent tile(*) 91 for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j) 92 ; 93 } 94 } 95 96 local (); 97 nonlocal (); 98 99 return 0; 100 } 101