]>
Commit | Line | Data |
---|---|---|
122d7303 AT |
1 | ! { dg-do run } |
2 | ||
3 | module e_51_2_mod | |
4 | contains | |
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 init_again (v1, v2, N) | |
15 | integer :: i, N | |
16 | real :: v1(N), v2(N) | |
17 | do i = 1, N | |
18 | v1(i) = i - 3.0 | |
19 | v2(i) = i + 2.0 | |
20 | end do | |
21 | end subroutine | |
22 | ||
23 | subroutine check (p, N) | |
24 | integer :: i, N | |
25 | real, parameter :: EPS = 0.00001 | |
26 | real :: diff, p(N) | |
27 | do i = 1, N | |
28 | diff = p(i) - 2 * (i + 2.0) * (i - 3.0) | |
29 | if (diff > EPS .or. -diff > EPS) call abort | |
30 | end do | |
31 | end subroutine | |
32 | ||
33 | subroutine vec_mult (N) | |
34 | real :: p(N), v1(N), v2(N) | |
35 | integer :: i, N | |
36 | call init (v1, v2, N) | |
37 | !$omp target data map(from: p) | |
38 | !$omp target map(to: v1, v2 ) | |
39 | !$omp parallel do | |
40 | do i = 1, N | |
41 | p(i) = v1(i) * v2(i) | |
42 | end do | |
43 | !$omp end target | |
44 | call init_again (v1, v2, N) | |
45 | !$omp target map(to: v1, v2 ) | |
46 | !$omp parallel do | |
47 | do i = 1, N | |
48 | p(i) = p(i) + v1(i) * v2(i) | |
49 | end do | |
50 | !$omp end target | |
51 | !$omp end target data | |
52 | call check (p, N) | |
53 | end subroutine | |
54 | end module | |
55 | ||
56 | program e_51_2 | |
57 | use e_51_2_mod, only : vec_mult | |
58 | integer :: n | |
59 | n = 1000 | |
60 | call vec_mult (n) | |
61 | end program |