| ! { 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 |