1! { dg-do run } 2 3! complex reductions 4 5program reduction_4 6 implicit none 7 8 integer, parameter :: n = 10, ng = 8, nw = 4, vl = 32 9 integer :: i 10 real :: vresult, rg, rw, rv, rc 11 complex, dimension (n) :: array 12 13 do i = 1, n 14 array(i) = i 15 end do 16 17 ! 18 ! '+' reductions 19 ! 20 21 rg = 0 22 rw = 0 23 rv = 0 24 rc = 0 25 vresult = 0 26 27 !$acc parallel num_gangs(ng) copy(rg) 28 !$acc loop reduction(+:rg) gang 29 do i = 1, n 30 rg = rg + REAL(array(i)) 31 end do 32 !$acc end parallel 33 34 !$acc parallel num_workers(nw) copy(rw) 35 !$acc loop reduction(+:rw) worker 36 do i = 1, n 37 rw = rw + REAL(array(i)) 38 end do 39 !$acc end parallel 40 41 !$acc parallel vector_length(vl) copy(rv) 42 !$acc loop reduction(+:rv) vector 43 do i = 1, n 44 rv = rv + REAL(array(i)) 45 end do 46 !$acc end parallel 47 48 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc) 49 !$acc loop reduction(+:rc) gang worker vector 50 do i = 1, n 51 rc = rc + REAL(array(i)) 52 end do 53 !$acc end parallel 54 55 ! Verify the results 56 do i = 1, n 57 vresult = vresult + REAL(array(i)) 58 end do 59 60 if (rg .ne. vresult) STOP 1 61 if (rw .ne. vresult) STOP 2 62 if (rv .ne. vresult) STOP 3 63 if (rc .ne. vresult) STOP 4 64 65 ! 66 ! '*' reductions 67 ! 68 69 rg = 1 70 rw = 1 71 rv = 1 72 rc = 1 73 vresult = 1 74 75 !$acc parallel num_gangs(ng) copy(rg) 76 !$acc loop reduction(*:rg) gang 77 do i = 1, n 78 rg = rg * REAL(array(i)) 79 end do 80 !$acc end parallel 81 82 !$acc parallel num_workers(nw) copy(rw) 83 !$acc loop reduction(*:rw) worker 84 do i = 1, n 85 rw = rw * REAL(array(i)) 86 end do 87 !$acc end parallel 88 89 !$acc parallel vector_length(vl) copy(rv) 90 !$acc loop reduction(*:rv) vector 91 do i = 1, n 92 rv = rv * REAL(array(i)) 93 end do 94 !$acc end parallel 95 96 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc) 97 !$acc loop reduction(*:rc) gang worker vector 98 do i = 1, n 99 rc = rc * REAL(array(i)) 100 end do 101 !$acc end parallel 102 103 ! Verify the results 104 do i = 1, n 105 vresult = vresult * REAL(array(i)) 106 end do 107 108 if (rg .ne. vresult) STOP 5 109 if (rw .ne. vresult) STOP 6 110 if (rv .ne. vresult) STOP 7 111 if (rc .ne. vresult) STOP 8 112end program reduction_4 113