1 #include <openacc.h> 2 3 t1()4void t1 () 5 { 6 int ok = 1; 7 int val = 2; 8 int ary[32]; 9 int ondev = 0; 10 11 for (int i = 0; i < 32; i++) 12 ary[i] = ~0; 13 14 #pragma acc parallel num_gangs (32) copy (ok) firstprivate (val) copy(ary, ondev) 15 { 16 ondev = acc_on_device (acc_device_not_host); 17 #pragma acc loop gang(static:1) 18 for (unsigned i = 0; i < 32; i++) 19 { 20 if (val != 2) 21 ok = 0; 22 val += i; 23 ary[i] = val; 24 } 25 } 26 27 if (ondev) 28 { 29 if (!ok) 30 __builtin_abort (); 31 if (val != 2) 32 __builtin_abort (); 33 34 for (int i = 0; i < 32; i++) 35 if (ary[i] != 2 + i) 36 __builtin_abort (); 37 } 38 } 39 40 t2()41void t2 () 42 { 43 int ok = 1; 44 int val = 2; 45 46 #pragma acc data copy(val) 47 { 48 #pragma acc parallel present (val) 49 { 50 val = 7; 51 } 52 53 #pragma acc parallel firstprivate (val) copy(ok) 54 { 55 ok = val == 7; 56 val = 9; 57 } 58 } 59 60 if (!ok) 61 __builtin_abort (); 62 if (val != 7) 63 __builtin_abort (); 64 } 65 66 67 #define N 100 t3()68void t3 () 69 { 70 int a, b[N], c, d, i; 71 int n = acc_get_device_type () == acc_device_nvidia ? N : 1; 72 73 a = 5; 74 for (i = 0; i < n; i++) 75 b[i] = -1; 76 77 #pragma acc parallel num_gangs (n) firstprivate (a) 78 #pragma acc loop gang 79 for (i = 0; i < n; i++) 80 { 81 a = a + i; 82 b[i] = a; 83 } 84 85 for (i = 0; i < n; i++) 86 if (a + i != b[i]) 87 __builtin_abort (); 88 89 #pragma acc data copy (a) 90 { 91 #pragma acc parallel firstprivate (a) copyout (c) 92 { 93 a = 10; 94 c = a; 95 } 96 97 /* This version of 'a' should still be 5. */ 98 #pragma acc parallel copyout (d) present (a) 99 { 100 d = a; 101 } 102 } 103 104 if (c != 10) 105 __builtin_abort (); 106 if (d != 5) 107 __builtin_abort (); 108 } 109 #undef N 110 111 t4()112void t4 () 113 { 114 int x = 5, i, arr[32]; 115 116 for (i = 0; i < 32; i++) 117 arr[i] = 3; 118 119 #pragma acc parallel firstprivate(x) copy(arr) num_gangs(32) num_workers(8) vector_length(32) 120 { 121 #pragma acc loop gang 122 for (i = 0; i < 32; i++) 123 arr[i] += x; 124 } 125 126 for (i = 0; i < 32; i++) 127 if (arr[i] != 8) 128 __builtin_abort (); 129 } 130 131 132 int main()133main() 134 { 135 t1 (); 136 t2 (); 137 t3 (); 138 t4 (); 139 140 return 0; 141 } 142