Add support for ARMv8-R architecture
[official-gcc.git] / libgomp / testsuite / libgomp.fortran / examples-4 / async_target-2.f90
bloba94db899cc89203730ce284e8240dc99bc03c9b8
1 ! { dg-do run }
2 ! { dg-require-effective-target offload_device_nonshared_as }
4 subroutine init (v1, v2, N)
5 !$omp declare target
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
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
24 subroutine vec_mult (p, N)
25 use omp_lib, only: omp_is_initial_device
26 real :: p(N)
27 real, allocatable :: v1(:), v2(:)
28 integer :: i
29 !$omp declare target (init)
30 !$omp target data map(to: v1, v2, N) map(from: p)
31 !$omp task shared(v1, v2, p) depend(out: v1, v2)
32 !$omp target map(to: v1, v2, N)
33 if (omp_is_initial_device ()) call abort
34 allocate (v1(N), v2(N))
35 call init (v1, v2, N)
36 !$omp end target
37 !$omp end task
38 !$omp task shared(v1, v2, p) depend(in: v1, v2)
39 !$omp target map(to: v1, v2, N) map(from: p)
40 if (omp_is_initial_device ()) call abort
41 !$omp parallel do
42 do i = 1, N
43 p(i) = v1(i) * v2(i)
44 end do
45 deallocate (v1, v2)
46 !$omp end target
47 !$omp end task
48 !$omp end target data
50 !$omp taskwait
51 call check (p, N)
52 end subroutine
54 program e_55_2
55 integer, parameter :: N = 1000
56 real :: p(N)
57 call vec_mult (p, N)
58 end program