1 #include  <openacc.h>
2 
3 
t1()4 void 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()41 void 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()68 void 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()112 void 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()133 main()
134 {
135   t1 ();
136   t2 ();
137   t3 ();
138   t4 ();
139 
140   return 0;
141 }
142