! { dg-do run } ! { dg-additional-options "-cpp" } ! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting ! aspects of that functionality. program reduction implicit none integer, parameter :: n = 100, n2 = 1000, chunksize = 10 integer :: i, gs1, gs2, ws1, ws2, vs1, vs2, cs1, cs2, hs1, hs2 integer :: j, red, vred gs1 = 0 gs2 = 0 ws1 = 0 ws2 = 0 vs1 = 0 vs2 = 0 cs1 = 0 cs2 = 0 hs1 = 0 hs2 = 0 !$acc parallel num_gangs (1000) !$acc loop reduction(+:gs1, gs2) gang do i = 1, n gs1 = gs1 + 1 gs2 = gs2 + 2 end do !$acc end parallel !$acc parallel num_workers (4) vector_length (32) ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-1 } !$acc loop reduction(+:ws1, ws2) worker do i = 1, n ws1 = ws1 + 1 ws2 = ws2 + 2 end do !$acc end parallel !$acc parallel vector_length (32) !$acc loop reduction(+:vs1, vs2) vector do i = 1, n vs1 = vs1 + 1 vs2 = vs2 + 2 end do !$acc end parallel !$acc parallel num_gangs(8) num_workers(4) vector_length(32) !$acc loop reduction(+:cs1, cs2) gang worker vector do i = 1, n cs1 = cs1 + 1 cs2 = cs2 + 2 end do !$acc end parallel ! Verify the results on the host do i = 1, n hs1 = hs1 + 1 hs2 = hs2 + 2 end do if (gs1 .ne. hs1) STOP 1 if (gs2 .ne. hs2) STOP 2 if (ws1 .ne. hs1) STOP 3 if (ws2 .ne. hs2) STOP 4 if (vs1 .ne. hs1) STOP 5 if (vs2 .ne. hs2) STOP 6 if (cs1 .ne. hs1) STOP 7 if (cs2 .ne. hs2) STOP 8 ! Nested reductions. red = 0 vred = 0 !$acc parallel num_gangs(10) vector_length(32) !$acc loop reduction(+:red) gang do i = 1, n/chunksize !$acc loop reduction(+:red) vector do j = 1, chunksize red = red + chunksize end do end do !$acc end parallel do i = 1, n/chunksize do j = 1, chunksize vred = vred + chunksize end do end do if (red .ne. vred) STOP 9 end program reduction