1/* double reductions.  */
2
3#define vl 32
4
5int
6main(void)
7{
8  const int n = 1000;
9  int i;
10  double result, array[n];
11  int lresult;
12
13  /* '+' reductions.  */
14#pragma acc parallel vector_length (vl)
15#pragma acc loop reduction (+:result)
16  for (i = 0; i < n; i++)
17    result += array[i];
18
19  /* '*' reductions.  */
20#pragma acc parallel vector_length (vl)
21#pragma acc loop reduction (*:result)
22  for (i = 0; i < n; i++)
23    result *= array[i];
24
25//   /* 'max' reductions.  */
26// #pragma acc parallel vector_length (vl)
27// #pragma acc loop reduction (+:result)
28//   for (i = 0; i < n; i++)
29//       result = result > array[i] ? result : array[i];
30//
31//   /* 'min' reductions.  */
32// #pragma acc parallel vector_length (vl)
33// #pragma acc loop reduction (+:result)
34//   for (i = 0; i < n; i++)
35//       result = result < array[i] ? result : array[i];
36
37  /* '&&' reductions.  */
38#pragma acc parallel vector_length (vl)
39#pragma acc loop reduction (&&:lresult)
40  for (i = 0; i < n; i++)
41    lresult = lresult && (result > array[i]);
42
43  /* '||' reductions.  */
44#pragma acc parallel vector_length (vl)
45#pragma acc loop reduction (||:lresult)
46  for (i = 0; i < n; i++)
47    lresult = lresult || (result > array[i]);
48
49  return 0;
50}
51