1 // Defaults, if not "#include"d from ../libgomp.oacc-c++/routine-1-*.C.
2 #ifndef TEMPLATE
3 # define TEMPLATE
4 # define TYPE int
5 # define RETURN_1 TYPE
6 # define RETURN_2
7 #endif
8
9 #include <stdlib.h>
10
11 #pragma acc routine
12 TEMPLATE
13 RETURN_1 fact(TYPE n) RETURN_2
14 {
15 if (n == 0 || n == 1)
16 return 1;
17 else
18 return n * fact (n - 1);
19 }
20
21 int main()
22 {
23 int *s, *g, *w, *v, *gw, *gv, *wv, *gwv, i, n = 10;
24
25 s = (int *) malloc (sizeof (int) * n);
26 g = (int *) malloc (sizeof (int) * n);
27 w = (int *) malloc (sizeof (int) * n);
28 v = (int *) malloc (sizeof (int) * n);
29 gw = (int *) malloc (sizeof (int) * n);
30 gv = (int *) malloc (sizeof (int) * n);
31 wv = (int *) malloc (sizeof (int) * n);
32 gwv = (int *) malloc (sizeof (int) * n);
33
34 #pragma acc parallel loop async copyout(s[0:n]) seq
35 for (i = 0; i < n; i++)
36 s[i] = fact (i);
37
38 #pragma acc parallel loop async copyout(g[0:n]) gang
39 for (i = 0; i < n; i++)
40 g[i] = fact (i);
41
42 #pragma acc parallel loop async copyout(w[0:n]) worker
43 for (i = 0; i < n; i++)
44 w[i] = fact (i);
45
46 #pragma acc parallel loop async copyout(v[0:n]) vector
47 for (i = 0; i < n; i++)
48 v[i] = fact (i);
49
50 #pragma acc parallel loop async copyout(gw[0:n]) gang worker
51 for (i = 0; i < n; i++)
52 gw[i] = fact (i);
53
54 #pragma acc parallel loop async copyout(gv[0:n]) gang vector
55 for (i = 0; i < n; i++)
56 gv[i] = fact (i);
57
58 #pragma acc parallel loop async copyout(wv[0:n]) worker vector
59 for (i = 0; i < n; i++)
60 wv[i] = fact (i);
61
62 #pragma acc parallel loop async copyout(gwv[0:n]) gang worker vector
63 for (i = 0; i < n; i++)
64 gwv[i] = fact (i);
65
66 #pragma acc wait
67
68 for (i = 0; i < n; i++)
69 if (s[i] != fact (i))
70 abort ();
71 for (i = 0; i < n; i++)
72 if (g[i] != s[i])
73 abort ();
74 for (i = 0; i < n; i++)
75 if (w[i] != s[i])
76 abort ();
77 for (i = 0; i < n; i++)
78 if (v[i] != s[i])
79 abort ();
80 for (i = 0; i < n; i++)
81 if (gw[i] != s[i])
82 abort ();
83 for (i = 0; i < n; i++)
84 if (gv[i] != s[i])
85 abort ();
86 for (i = 0; i < n; i++)
87 if (wv[i] != s[i])
88 abort ();
89 for (i = 0; i < n; i++)
90 if (gwv[i] != s[i])
91 abort ();
92
93 return 0;
94 }