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