1! { dg-do run } 2! { dg-additional-options "-cpp -w" } 3 4program reduction 5 implicit none 6 7 integer, parameter :: n = 100, n2 = 1000, chunksize = 10 8 integer :: i, gs1, gs2, ws1, ws2, vs1, vs2, cs1, cs2, hs1, hs2 9 integer :: j, red, vred 10 11 gs1 = 0 12 gs2 = 0 13 ws1 = 0 14 ws2 = 0 15 vs1 = 0 16 vs2 = 0 17 cs1 = 0 18 cs2 = 0 19 hs1 = 0 20 hs2 = 0 21 22 !$acc parallel num_gangs (1000) 23 !$acc loop reduction(+:gs1, gs2) gang 24 do i = 1, n 25 gs1 = gs1 + 1 26 gs2 = gs2 + 2 27 end do 28 !$acc end parallel 29 30 !$acc parallel num_workers (4) vector_length (32) 31 !$acc loop reduction(+:ws1, ws2) worker 32 do i = 1, n 33 ws1 = ws1 + 1 34 ws2 = ws2 + 2 35 end do 36 !$acc end parallel 37 38 !$acc parallel vector_length (32) 39 !$acc loop reduction(+:vs1, vs2) vector 40 do i = 1, n 41 vs1 = vs1 + 1 42 vs2 = vs2 + 2 43 end do 44 !$acc end parallel 45 46 !$acc parallel num_gangs(8) num_workers(4) vector_length(32) 47 !$acc loop reduction(+:cs1, cs2) gang worker vector 48 do i = 1, n 49 cs1 = cs1 + 1 50 cs2 = cs2 + 2 51 end do 52 !$acc end parallel 53 54 ! Verify the results on the host 55 do i = 1, n 56 hs1 = hs1 + 1 57 hs2 = hs2 + 2 58 end do 59 60 if (gs1 .ne. hs1) STOP 1 61 if (gs2 .ne. hs2) STOP 2 62 63 if (ws1 .ne. hs1) STOP 3 64 if (ws2 .ne. hs2) STOP 4 65 66 if (vs1 .ne. hs1) STOP 5 67 if (vs2 .ne. hs2) STOP 6 68 69 if (cs1 .ne. hs1) STOP 7 70 if (cs2 .ne. hs2) STOP 8 71 72 ! Nested reductions. 73 74 red = 0 75 vred = 0 76 77 !$acc parallel num_gangs(10) vector_length(32) 78 !$acc loop reduction(+:red) gang 79 do i = 1, n/chunksize 80 !$acc loop reduction(+:red) vector 81 do j = 1, chunksize 82 red = red + chunksize 83 end do 84 end do 85 !$acc end parallel 86 87 do i = 1, n/chunksize 88 do j = 1, chunksize 89 vred = vred + chunksize 90 end do 91 end do 92 93 if (red .ne. vred) STOP 9 94end program reduction 95