1! { dg-do run } 2 3module e_51_4_mod 4contains 5 subroutine init (v1, v2, N) 6 integer :: i, N 7 real :: v1(N), v2(N) 8 do i = 1, N 9 v1(i) = i + 2.0 10 v2(i) = i - 3.0 11 end do 12 end subroutine 13 14 subroutine check (p, N) 15 integer :: i, N 16 real, parameter :: EPS = 0.00001 17 real :: diff, p(N) 18 do i = 1, N 19 diff = p(i) - (i + 2.0) * (i - 3.0) 20 if (diff > EPS .or. -diff > EPS) call abort 21 end do 22 end subroutine 23 24 subroutine foo (p, v1, v2, N) 25 real, pointer, dimension(:) :: p, v1, v2 26 integer :: N 27 call init (v1, v2, N) 28 !$omp target data map(to: v1, v2) map(from: p) 29 call vec_mult (p, v1, v2, N) 30 !$omp end target data 31 call check (p, N) 32 end subroutine 33 34 subroutine vec_mult (p, v1, v2, N) 35 real, pointer, dimension(:) :: p, v1, v2 36 integer :: i, N 37 !$omp target map(to: v1, v2) map(from: p) 38 !$omp parallel do 39 do i = 1, N 40 p(i) = v1(i) * v2(i) 41 end do 42 !$omp end target 43 end subroutine 44end module 45 46program e_51_4 47 use e_51_4_mod, only : foo 48 integer :: n 49 real, pointer, dimension(:) :: p, v1, v2 50 n = 1000 51 allocate (p(n), v1(n), v2(n)) 52 call foo (p, v1, v2, n) 53 deallocate (p, v1, v2) 54end program 55