3 function dotprod_ref (B
, C
, N
) result (sum
)
5 real :: B(N
), C(N
), sum
9 sum
= sum
+ B(i
) * C(i
)
13 function dotprod (B
, C
, N
, block_size
, num_teams
, block_threads
) result (sum
)
15 real :: B(N
), C(N
), sum
16 integer :: N
, block_size
, num_teams
, block_threads
, i
, i0
18 !$omp target map(to: B, C, block_size, num_teams, block_threads) &
19 !$omp& map(tofrom: sum)
20 !$omp teams num_teams(num_teams) thread_limit(block_threads) &
21 !$omp& reduction(+:sum)
23 do i0
= 1, N
, block_size
24 !$omp parallel do reduction(+:sum)
25 do i
= i0
, min (i0
+ block_size
- 1, N
)
26 sum
= sum
+ B(i
) * C(i
)
33 subroutine init (B
, C
, N
)
38 C(i
) = 0.000001 * i
* i
42 subroutine check (a
, b
)
44 real, parameter :: EPS
= 0.0001
47 else if (a
== 0.0) then
52 if (err
> EPS
.or
. err
< -EPS
) STOP 1
58 real, pointer, dimension(:) :: B
, C
62 ref
= dotprod_ref (B
, C
, n
)
63 d
= dotprod (B
, C
, n
, n
/ 8, 2, 8)