Add support for ARMv8-R architecture
[official-gcc.git] / libgomp / testsuite / libgomp.oacc-c++ / template-reduction.C
blobede0aae14c62ea5c87b0d75b5b993a3ec0f2a6a0
1 const int n = 100;
3 // Check explicit template copy map
5 template<typename T> T
6 sum (T array[])
8    T s = 0;
10 #pragma acc parallel loop num_gangs (10) gang reduction (+:s) copy (array[0:n])
11   for (int i = 0; i < n; i++)
12     s += array[i];
14   return s;
17 // Check implicit template copy map
19 template<typename T> T
20 sum ()
22   T s = 0;
23   T array[n];
25   for (int i = 0; i < n; i++)
26     array[i] = i+1;
28 #pragma acc parallel loop num_gangs (10) gang reduction (+:s)
29   for (int i = 0; i < n; i++)
30     s += array[i];
32   return s;
35 // Check template with default (present)
37 template<typename T> T
38 sum_default_present ()
40   T s = 0;
41   T array[n];
43   for (int i = 0; i < n; i++)
44     array[i] = i+1;
46 #pragma acc enter data copyin (array)
48 #pragma acc parallel loop num_gangs (10) gang reduction (+:s) default (present)
49   for (int i = 0; i < n; i++)
50     s += array[i];
52 #pragma acc exit data delete (array)
54   return s;
57 // Check present and async
59 template<typename T> T
60 async_sum (T array[])
62    T s = 0;
64 #pragma acc parallel loop num_gangs (10) gang async (1) present (array[0:n])
65    for (int i = 0; i < n; i++)
66      array[i] = i+1;
68 #pragma acc parallel loop num_gangs (10) gang reduction (+:s) present (array[0:n]) async wait (1)
69   for (int i = 0; i < n; i++)
70     s += array[i];
72 #pragma acc wait
74   return s;
77 // Check present and async and an explicit firstprivate
79 template<typename T> T
80 async_sum (int c)
82    T s = 0;
84 #pragma acc parallel loop num_gangs (10) gang reduction (+:s) firstprivate (c) async wait (1)
85   for (int i = 0; i < n; i++)
86     s += i+c;
88 #pragma acc wait
90   return s;
93 int
94 main()
96   int a[n];
97   int result = 0;
99   for (int i = 0; i < n; i++)
100     {
101       a[i] = i+1;
102       result += i+1;
103     }
105   if (sum (a) != result)
106     __builtin_abort ();
108   if (sum<int> () != result)
109     __builtin_abort ();
111   if (sum_default_present<int> () != result)
112     __builtin_abort ();
114 #pragma acc enter data copyin (a)
115   if (async_sum (a) != result)
116     __builtin_abort ();
118   if (async_sum<int> (1) != result)
119     __builtin_abort ();
120 #pragma acc exit data delete (a)
122   return 0;