2015-07-04 Marc Glisse <marc.glisse@inria.fr>
[official-gcc.git] / libgomp / testsuite / libgomp.oacc-fortran / reduction-3.f90
blob2b8005dac150e59ae12939e0dba4b13d22ca0e8a
1 ! { dg-do run }
3 ! double precision reductions
5 program reduction_3
6 implicit none
8 integer, parameter :: n = 10, vl = 2
9 integer :: i
10 double precision, parameter :: e = .001
11 double precision :: vresult, result
12 logical :: lresult, lvresult
13 double precision, dimension (n) :: array
15 do i = 1, n
16 array(i) = i
17 end do
19 result = 0
20 vresult = 0
22 ! '+' reductions
24 !$acc parallel vector_length(vl) num_gangs(1)
25 !$acc loop reduction(+:result)
26 do i = 1, n
27 result = result + array(i)
28 end do
29 !$acc end parallel
31 ! Verify the results
32 do i = 1, n
33 vresult = vresult + array(i)
34 end do
36 if (abs (result - vresult) .ge. e) call abort
38 result = 1
39 vresult = 1
41 ! '*' reductions
43 !$acc parallel vector_length(vl) num_gangs(1)
44 !$acc loop reduction(*:result)
45 do i = 1, n
46 result = result * array(i)
47 end do
48 !$acc end parallel
50 ! Verify the results
51 do i = 1, n
52 vresult = vresult * array(i)
53 end do
55 if (result.ne.vresult) call abort
57 result = 0
58 vresult = 0
60 ! 'max' reductions
62 !$acc parallel vector_length(vl) num_gangs(1)
63 !$acc loop reduction(max:result)
64 do i = 1, n
65 result = max (result, array(i))
66 end do
67 !$acc end parallel
69 ! Verify the results
70 do i = 1, n
71 vresult = max (vresult, array(i))
72 end do
74 if (result.ne.vresult) call abort
76 result = 1
77 vresult = 1
79 ! 'min' reductions
81 !$acc parallel vector_length(vl) num_gangs(1)
82 !$acc loop reduction(min:result)
83 do i = 1, n
84 result = min (result, array(i))
85 end do
86 !$acc end parallel
88 ! Verify the results
89 do i = 1, n
90 vresult = min (vresult, array(i))
91 end do
93 if (result.ne.vresult) call abort
95 result = 1
96 vresult = 1
98 ! '.and.' reductions
100 !$acc parallel vector_length(vl) num_gangs(1)
101 !$acc loop reduction(.and.:lresult)
102 do i = 1, n
103 lresult = lresult .and. (array(i) .ge. 5)
104 end do
105 !$acc end parallel
107 ! Verify the results
108 do i = 1, n
109 lvresult = lvresult .and. (array(i) .ge. 5)
110 end do
112 if (result.ne.vresult) call abort
114 lresult = .false.
115 lvresult = .false.
117 ! '.or.' reductions
119 !$acc parallel vector_length(vl) num_gangs(1)
120 !$acc loop reduction(.or.:lresult)
121 do i = 1, n
122 lresult = lresult .or. (array(i) .ge. 5)
123 end do
124 !$acc end parallel
126 ! Verify the results
127 do i = 1, n
128 lvresult = lvresult .or. (array(i) .ge. 5)
129 end do
131 if (result.ne.vresult) call abort
133 lresult = .false.
134 lvresult = .false.
136 ! '.eqv.' reductions
138 !$acc parallel vector_length(vl) num_gangs(1)
139 !$acc loop reduction(.eqv.:lresult)
140 do i = 1, n
141 lresult = lresult .eqv. (array(i) .ge. 5)
142 end do
143 !$acc end parallel
145 ! Verify the results
146 do i = 1, n
147 lvresult = lvresult .eqv. (array(i) .ge. 5)
148 end do
150 if (result.ne.vresult) call abort
152 lresult = .false.
153 lvresult = .false.
155 ! '.neqv.' reductions
157 !$acc parallel vector_length(vl) num_gangs(1)
158 !$acc loop reduction(.neqv.:lresult)
159 do i = 1, n
160 lresult = lresult .neqv. (array(i) .ge. 5)
161 end do
162 !$acc end parallel
164 ! Verify the results
165 do i = 1, n
166 lvresult = lvresult .neqv. (array(i) .ge. 5)
167 end do
169 if (result.ne.vresult) call abort
170 end program reduction_3