133 lines
3.1 KiB
Fortran
133 lines
3.1 KiB
Fortran
! { 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
|