OpenACC documentation updates.
[official-gcc.git] / libgomp / testsuite / libgomp.oacc-c / reduction-3.c
blob58b49ffa4be9bf40803a57d6e1e705b20afa0995
1 /* { dg-do run } */
3 /* double reductions. */
5 #include <stdlib.h>
6 #include <stdbool.h>
7 #include <math.h>
9 #define vl 32
11 int
12 main(void)
14 const int n = 1000;
15 int i;
16 double vresult, result, array[n];
17 bool lvresult, lresult;
19 for (i = 0; i < n; i++)
20 array[i] = i;
22 result = 0;
23 vresult = 0;
25 /* '+' reductions. */
26 #pragma acc parallel vector_length (vl)
27 #pragma acc loop reduction (+:result)
28 for (i = 0; i < n; i++)
29 result += array[i];
31 /* Verify the reduction. */
32 for (i = 0; i < n; i++)
33 vresult += array[i];
35 if (result != vresult)
36 abort ();
38 result = 0;
39 vresult = 0;
41 /* '*' reductions. */
42 #pragma acc parallel vector_length (vl)
43 #pragma acc loop reduction (*:result)
44 for (i = 0; i < n; i++)
45 result *= array[i];
47 /* Verify the reduction. */
48 for (i = 0; i < n; i++)
49 vresult *= array[i];
51 if (fabs(result - vresult) > .0001)
52 abort ();
53 // result = 0;
54 // vresult = 0;
55 //
56 // /* 'max' reductions. */
57 // #pragma acc parallel vector_length (vl)
58 // #pragma acc loop reduction (+:result)
59 // for (i = 0; i < n; i++)
60 // result = result > array[i] ? result : array[i];
61 //
62 // /* Verify the reduction. */
63 // for (i = 0; i < n; i++)
64 // vresult = vresult > array[i] ? vresult : array[i];
65 //
66 // printf("%d != %d\n", result, vresult);
67 // if (result != vresult)
68 // abort ();
69 //
70 // result = 0;
71 // vresult = 0;
72 //
73 // /* 'min' reductions. */
74 // #pragma acc parallel vector_length (vl)
75 // #pragma acc loop reduction (+:result)
76 // for (i = 0; i < n; i++)
77 // result = result < array[i] ? result : array[i];
78 //
79 // /* Verify the reduction. */
80 // for (i = 0; i < n; i++)
81 // vresult = vresult < array[i] ? vresult : array[i];
82 //
83 // printf("%d != %d\n", result, vresult);
84 // if (result != vresult)
85 // abort ();
87 result = 5;
88 vresult = 5;
90 lresult = false;
91 lvresult = false;
93 /* '&&' reductions. */
94 #pragma acc parallel vector_length (vl)
95 #pragma acc loop reduction (&&:lresult)
96 for (i = 0; i < n; i++)
97 lresult = lresult && (result > array[i]);
99 /* Verify the reduction. */
100 for (i = 0; i < n; i++)
101 lvresult = lresult && (result > array[i]);
103 if (lresult != lvresult)
104 abort ();
106 result = 5;
107 vresult = 5;
109 lresult = false;
110 lvresult = false;
112 /* '||' reductions. */
113 #pragma acc parallel vector_length (vl)
114 #pragma acc loop reduction (||:lresult)
115 for (i = 0; i < n; i++)
116 lresult = lresult || (result > array[i]);
118 /* Verify the reduction. */
119 for (i = 0; i < n; i++)
120 lvresult = lresult || (result > array[i]);
122 if (lresult != lvresult)
123 abort ();
125 return 0;