| ! { dg-options "-O2" } | |
| ! { dg-additional-options "-msse2" { target sse2_runtime } } | |
| ! { dg-additional-options "-mavx" { target avx_runtime } } | |
| integer, save :: u(1024), v(1024), w(1024), m | |
| integer :: i | |
| v = (/ (i, i = 1, 1024) /) | |
| w = (/ (i + 1, i = 1, 1024) /) | |
| !$omp parallel | |
| !$omp single | |
| call f1 (1, 1024) | |
| !$omp end single | |
| !$omp end parallel | |
| do i = 1, 1024 | |
| if (u(i) .ne. 2 * i + 1) stop 1 | |
| v(i) = 1024 - i | |
| w(i) = 512 - i | |
| end do | |
| !$omp parallel | |
| !$omp single | |
| call f2 (2, 1022, 17) | |
| !$omp end single | |
| !$omp end parallel | |
| do i = 1, 1024 | |
| if (i .lt. 2 .or. i .gt. 1022) then | |
| if (u(i) .ne. 2 * i + 1) stop 2 | |
| else | |
| if (u(i) .ne. 1536 - 2 * i) stop 3 | |
| end if | |
| v(i) = i | |
| w(i) = i + 1 | |
| end do | |
| if (m .ne. (1023 + 2 * (1021 * 5 + 17) + 9)) stop 4 | |
| !$omp parallel | |
| !$omp single | |
| call f3 (1, 1024) | |
| !$omp end single | |
| !$omp end parallel | |
| do i = 1, 1024 | |
| if (u(i) .ne. 2 * i + 1) stop 5 | |
| v(i) = 1024 - i | |
| w(i) = 512 - i | |
| end do | |
| if (m .ne. 1025) stop 6 | |
| !$omp parallel | |
| !$omp single | |
| call f4 (0, 31, 1, 32) | |
| !$omp end single | |
| !$omp end parallel | |
| do i = 1, 1024 | |
| if (u(i) .ne. 1536 - 2 * i) stop 7 | |
| v(i) = i | |
| w(i) = i + 1 | |
| end do | |
| if (m .ne. 32 + 33 + 1024) stop 8 | |
| !$omp parallel | |
| !$omp single | |
| call f5 (0, 31, 1, 32) | |
| !$omp end single | |
| !$omp end parallel | |
| do i = 1, 1024 | |
| if (u(i) .ne. 2 * i + 1) stop 9 | |
| end do | |
| if (m .ne. 32 + 33) stop 10 | |
| contains | |
| subroutine f1 (a, b) | |
| integer, intent(in) :: a, b | |
| integer :: d | |
| !$omp taskloop simd default(none) shared(u, v, w) nogroup | |
| do d = a, b | |
| u(d) = v(d) + w(d) | |
| end do | |
| ! d is predetermined linear, so we can't let the tasks continue past | |
| ! end of this function. | |
| !$omp taskwait | |
| end subroutine f1 | |
| subroutine f2 (a, b, cx) | |
| integer, intent(in) :: a, b, cx | |
| integer :: c, d, e | |
| c = cx | |
| !$omp taskloop simd default(none) shared(u, v, w) linear(d:1) linear(c:5) lastprivate(e) | |
| do d = a, b | |
| u(d) = v(d) + w(d) | |
| c = c + 5 | |
| e = c + 9 | |
| end do | |
| !$omp end taskloop simd | |
| m = d + c + e | |
| end subroutine f2 | |
| subroutine f3 (a, b) | |
| integer, intent(in) :: a, b | |
| integer, target :: d | |
| integer, pointer :: p | |
| !$omp taskloop simd default(none) shared(u, v, w) private (p) | |
| do d = a, b | |
| p => d | |
| u(d) = v(d) + w(d) | |
| p => null() | |
| end do | |
| m = d | |
| end subroutine f3 | |
| subroutine f4 (a, b, c, d) | |
| integer, intent(in) :: a, b, c, d | |
| integer, target :: e, f | |
| integer, pointer :: p, q | |
| integer :: g, r | |
| !$omp taskloop simd default(none) shared(u, v, w) lastprivate(g) collapse(2) private (r, p, q) | |
| do e = a, b | |
| do f = c, d | |
| p => e | |
| q => f | |
| r = 32 * e + f | |
| u(r) = v(r) + w(r) | |
| g = r | |
| p => null() | |
| q => null() | |
| end do | |
| end do | |
| m = e + f + g | |
| end subroutine f4 | |
| subroutine f5 (a, b, c, d) | |
| integer, intent(in) :: a, b, c, d | |
| integer :: e, f, r | |
| !$omp taskloop simd default(none) shared(u, v, w) collapse(2) private (r) | |
| do e = a, b | |
| do f = c, d | |
| r = 32 * e + f | |
| u(r) = v(r) + w(r) | |
| end do | |
| end do | |
| m = e + f | |
| end subroutine f5 | |
| end |