]>
Commit | Line | Data |
---|---|---|
2fc5e987 | 1 | #include <openacc.h> |
2 | #include <stdlib.h> | |
2fc5e987 | 3 | |
4 | #define N 8 | |
5 | ||
6 | void | |
7 | subr2 (int *a) | |
8 | { | |
9 | int i; | |
10 | int f[N]; | |
11 | #pragma acc declare copyout (f) | |
12 | ||
13 | #pragma acc parallel copy (a[0:N]) | |
14 | { | |
15 | for (i = 0; i < N; i++) | |
16 | { | |
17 | f[i] = a[i]; | |
18 | a[i] = f[i] + f[i] + f[i]; | |
19 | } | |
20 | } | |
21 | } | |
22 | ||
23 | void | |
24 | subr1 (int *a) | |
25 | { | |
26 | int f[N]; | |
27 | #pragma acc declare copy (f) | |
28 | ||
29 | #pragma acc parallel copy (a[0:N]) | |
30 | { | |
31 | int i; | |
32 | ||
33 | for (i = 0; i < N; i++) | |
34 | { | |
35 | f[i] = a[i]; | |
36 | a[i] = f[i] + f[i]; | |
37 | } | |
38 | } | |
39 | } | |
40 | ||
acb41570 | 41 | int b[N]; |
2fc5e987 | 42 | #pragma acc declare create (b) |
43 | ||
acb41570 | 44 | int d[N] = { 1, 2, 3, 4, 5, 6, 7, 8 }; |
2fc5e987 | 45 | #pragma acc declare copyin (d) |
46 | ||
acb41570 | 47 | static void |
48 | f (void) | |
2fc5e987 | 49 | { |
50 | int a[N]; | |
51 | int e[N]; | |
52 | #pragma acc declare create (e) | |
53 | int i; | |
54 | ||
55 | for (i = 0; i < N; i++) | |
56 | a[i] = i + 1; | |
57 | ||
58 | if (!acc_is_present (&b, sizeof (b))) | |
59 | abort (); | |
60 | ||
61 | if (!acc_is_present (&d, sizeof (d))) | |
62 | abort (); | |
63 | ||
64 | if (!acc_is_present (&e, sizeof (e))) | |
65 | abort (); | |
66 | ||
67 | #pragma acc parallel copyin (a[0:N]) | |
68 | { | |
69 | for (i = 0; i < N; i++) | |
70 | { | |
71 | b[i] = a[i]; | |
72 | a[i] = b[i]; | |
73 | } | |
74 | } | |
75 | ||
76 | for (i = 0; i < N; i++) | |
77 | { | |
78 | if (a[i] != i + 1) | |
79 | abort (); | |
80 | } | |
81 | ||
82 | #pragma acc parallel copy (a[0:N]) | |
83 | { | |
84 | for (i = 0; i < N; i++) | |
85 | { | |
86 | e[i] = a[i] + d[i]; | |
87 | a[i] = e[i]; | |
88 | } | |
89 | } | |
90 | ||
91 | for (i = 0; i < N; i++) | |
92 | { | |
93 | if (a[i] != (i + 1) * 2) | |
94 | abort (); | |
95 | } | |
96 | ||
97 | for (i = 0; i < N; i++) | |
98 | { | |
99 | a[i] = 1234; | |
100 | } | |
101 | ||
102 | subr1 (&a[0]); | |
103 | ||
104 | for (i = 0; i < N; i++) | |
105 | { | |
106 | if (a[i] != 1234 * 2) | |
107 | abort (); | |
108 | } | |
109 | ||
110 | subr2 (&a[0]); | |
111 | ||
acb41570 | 112 | for (i = 0; i < N; i++) |
2fc5e987 | 113 | { |
114 | if (a[i] != 1234 * 6) | |
115 | abort (); | |
116 | } | |
acb41570 | 117 | } |
118 | ||
119 | ||
120 | /* The same as 'f' but everything contained in an OpenACC 'data' construct. */ | |
121 | ||
122 | static void | |
123 | f_data (void) | |
124 | { | |
125 | #pragma acc data | |
126 | { | |
127 | int a[N]; | |
128 | int e[N]; | |
129 | # pragma acc declare create (e) | |
130 | int i; | |
131 | ||
132 | for (i = 0; i < N; i++) | |
133 | a[i] = i + 1; | |
134 | ||
135 | if (!acc_is_present (&b, sizeof (b))) | |
136 | abort (); | |
137 | ||
138 | if (!acc_is_present (&d, sizeof (d))) | |
139 | abort (); | |
140 | ||
141 | if (!acc_is_present (&e, sizeof (e))) | |
142 | abort (); | |
143 | ||
144 | # pragma acc parallel copyin (a[0:N]) | |
145 | { | |
146 | for (i = 0; i < N; i++) | |
147 | { | |
148 | b[i] = a[i]; | |
149 | a[i] = b[i]; | |
150 | } | |
151 | } | |
152 | ||
153 | for (i = 0; i < N; i++) | |
154 | { | |
155 | if (a[i] != i + 1) | |
156 | abort (); | |
157 | } | |
158 | ||
159 | # pragma acc parallel copy (a[0:N]) | |
160 | { | |
161 | for (i = 0; i < N; i++) | |
162 | { | |
163 | e[i] = a[i] + d[i]; | |
164 | a[i] = e[i]; | |
165 | } | |
166 | } | |
167 | ||
168 | for (i = 0; i < N; i++) | |
169 | { | |
170 | if (a[i] != (i + 1) * 2) | |
171 | abort (); | |
172 | } | |
173 | ||
174 | for (i = 0; i < N; i++) | |
175 | { | |
176 | a[i] = 1234; | |
177 | } | |
178 | ||
179 | subr1 (&a[0]); | |
180 | ||
181 | for (i = 0; i < N; i++) | |
182 | { | |
183 | if (a[i] != 1234 * 2) | |
184 | abort (); | |
185 | } | |
186 | ||
187 | subr2 (&a[0]); | |
188 | ||
189 | for (i = 0; i < N; i++) | |
190 | { | |
191 | if (a[i] != 1234 * 6) | |
192 | abort (); | |
193 | } | |
194 | } | |
195 | } | |
196 | ||
197 | ||
198 | int | |
199 | main (int argc, char **argv) | |
200 | { | |
201 | f (); | |
202 | ||
203 | f_data (); | |
2fc5e987 | 204 | |
205 | return 0; | |
206 | } |