123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- ! { dg-do run }
- module target6
- contains
- subroutine foo (p, v, w, n)
- double precision, pointer :: p(:), v(:), w(:)
- double precision :: q(n)
- integer :: i, n
- !$omp target data if (n > 256) map (to: v(1:n), w(:n)) map (from: p(1:n), q)
- !$omp target if (n > 256)
- !$omp parallel do simd
- do i = 1, n
- p(i) = v(i) * w(i)
- q(i) = p(i)
- end do
- !$omp end target
- !$omp target update if (n > 256) from (p)
- do i = 1, n
- if (p(i) /= i * iand (i, 63)) call abort
- v(i) = v(i) + 1
- end do
- !$omp target update if (n > 256) to (v(1:n))
- !$omp target if (n > 256)
- !$omp parallel do simd
- do i = 1, n
- p(i) = v(i) * w(i)
- end do
- !$omp end target
- !$omp end target data
- do i = 1, n
- if (q(i) /= (v(i) - 1) * w(i)) call abort
- if (p(i) /= q(i) + w(i)) call abort
- end do
- end subroutine
- end module target6
- use target6, only : foo
- integer :: n, i
- double precision, pointer :: p(:), v(:), w(:)
- n = 10000
- allocate (p(n), v(n), w(n))
- do i = 1, n
- v(i) = i
- w(i) = iand (i, 63)
- end do
- call foo (p, v, w, n)
- do i = 1, n
- if (p(i) /= (i + 1) * iand (i, 63)) call abort
- end do
- deallocate (p, v, w)
- end
|