blob: d0bc5ffa062afb0f47815f311609dd4b6e389951 [file] [log] [blame]
! Test for omp_target_memcpy_rect_async considering dependence objects.
program main
use omp_lib
use iso_c_binding
implicit none (external, type)
integer :: d, id, i, j
integer, target :: a(0:127), b(0:63), c(0:127), e(0:15), q(0:127)
type(c_ptr) :: p
integer(omp_depend_kind) :: obj(0:2)
integer(kind=c_size_t) :: volume(0:2)
integer(kind=c_size_t) :: dst_offsets(0:2)
integer(kind=c_size_t) :: src_offsets(0:2)
integer(kind=c_size_t) :: dst_dimensions(0:2)
integer(kind=c_size_t) :: src_dimensions(0:2)
d = omp_get_default_device ()
id = omp_get_initial_device ()
if (d < 0 .or. d >= omp_get_num_devices ()) &
d = id
p = omp_target_alloc (130 * c_sizeof (q), d)
if (.not. c_associated (p)) &
stop 0 ! okay
a = [(42, i = 0, 127)]
b = [(24, i = 0, 63)]
c = [(0, i = 0, 127)]
e = [(77, i = 0, 15)]
volume(2) = 3
volume(1) = 2
volume(0) = 2
dst_offsets(2) = 0
dst_offsets(1) = 0
dst_offsets(0) = 0
src_offsets(2) = 0
src_offsets(1) = 0
src_offsets(0) = 0
dst_dimensions(2) = 5
dst_dimensions(1) = 4
dst_dimensions(0) = 3
src_dimensions(2) = 4
src_dimensions(1) = 3
src_dimensions(0) = 2
!$omp parallel num_threads(5)
!$omp single
!$omp task depend(out: p)
if (omp_target_memcpy (p, c_loc (a), 128 * sizeof (a(0)), 0_c_size_t, &
0_c_size_t, d, id) /= 0) &
stop 1
!$omp end task
!$omp task depend(inout: p)
if (omp_target_memcpy (p, c_loc (b), 64 * sizeof (b(0)), 0_c_size_t, &
0_c_size_t, d, id) /= 0) &
stop 2
!$omp end task
!$omp task depend(out: c)
do j = 0, 127
c(j) = j + 1
end do
!$omp end task
!$omp depobj(obj(0)) depend(inout: p)
!$omp depobj(obj(1)) depend(in: c)
! This produces: 1 2 3 - - 5 6 7 - - at positions 0..9 and
! 13 14 15 - - 17 18 19 - - at positions 20..29.
if (omp_target_memcpy_rect_async (p, c_loc (c), sizeof (c(0)), 3, volume, &
dst_offsets, src_offsets, &
dst_dimensions, src_dimensions, d, id, &
2, obj) /= 0) &
stop 3
!$omp task depend(in: p)
if (omp_target_memcpy (p, c_loc (e), 16 * sizeof (e(0)), 0_c_size_t, &
0_c_size_t, d, id) /= 0) &
stop 4
!$omp end task
!$omp end single
!$omp end parallel
!$omp taskwait
q = [(0, i = 0, 127)]
if (omp_target_memcpy (c_loc (q), p, 128 * sizeof (q(0)), 0_c_size_t, &
0_c_size_t, id, d) /= 0) &
stop 5
do j = 0, 15
if (q(j) /= 77) &
stop 6
end do
if (q(20) /= 13 .or. q(21) /= 14 .or. q(22) /= 15 .or. q(25) /= 17 &
.or. q(26) /= 18 .or. q(27) /= 19) &
stop 7
do j = 28, 63
if (q(j) /= 24) &
stop 8
end do
do j = 64, 127
if (q(j) /= 42) &
stop 9
end do
call omp_target_free (p, d)
end program main