| program main |
| use omp_lib |
| use iso_c_binding |
| implicit none (external, type) |
| integer :: d, id, i, j, k, l |
| logical :: err |
| integer, target :: q(0:127) |
| type(c_ptr) :: p |
| |
| 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) |
| integer(kind=c_size_t) :: empty(1:0) |
| |
| err = .false. |
| d = omp_get_default_device () |
| id = omp_get_initial_device () |
| |
| if (d < 0 .or. d >= omp_get_num_devices ()) & |
| d = id |
| |
| q = [(i, i = 0, 127)] |
| p = omp_target_alloc (130 * c_sizeof (q), d) |
| if (.not. c_associated (p)) & |
| stop 0 ! okay |
| |
| if (omp_target_memcpy_rect (C_NULL_PTR, C_NULL_PTR, 0_c_size_t, 0, & |
| empty, empty, empty, empty, empty, d, id) < 3 & |
| .or. omp_target_memcpy_rect (C_NULL_PTR, C_NULL_PTR, 0_c_size_t, 0, & |
| empty, empty, empty, empty, empty, & |
| id, d) < 3 & |
| .or. omp_target_memcpy_rect (C_NULL_PTR, C_NULL_PTR, 0_c_size_t, 0, & |
| empty, empty, empty, empty, empty, & |
| id, id) < 3) & |
| stop 1 |
| |
| if (omp_target_associate_ptr (c_loc (q), p, 128 * c_sizeof (q(0)), & |
| c_sizeof (q(0)), d) == 0) then |
| volume = [ 128, 0, 0 ] |
| dst_offsets = [ 0, 0, 0 ] |
| src_offsets = [ 1, 0, 0 ] |
| dst_dimensions = [ 128, 0, 0 ] |
| src_dimensions = [ 128, 0, 0 ] |
| |
| |
| if (omp_target_associate_ptr (c_loc (q), p, 128 * sizeof (q(0)), & |
| sizeof (q(0)), d) /= 0) & |
| stop 2 |
| |
| if (omp_target_is_present (c_loc (q), d) /= 1 & |
| .or. omp_target_is_present (c_loc (q(32)), d) /= 1 & |
| .or. omp_target_is_present (c_loc (q(127)), d) /= 1) & |
| stop 3 |
| |
| if (omp_target_memcpy (p, c_loc (q), 128 * sizeof (q(0)), sizeof (q(0)), & |
| 0_c_size_t, d, id) /= 0) & |
| stop 4 |
| |
| i = 0 |
| if (d >= 0) i = d |
| !$omp target if (d >= 0) device (i) map(alloc:q(0:31)) map(from:err) |
| err = .false. |
| do j = 0, 127 |
| if (q(j) /= j) then |
| err = .true. |
| else |
| q(j) = q(j) + 4 |
| end if |
| end do |
| !$omp end target |
| |
| if (err) & |
| stop 5 |
| |
| if (omp_target_memcpy_rect (c_loc (q), p, sizeof (q(0)), 1, volume, & |
| dst_offsets, src_offsets, dst_dimensions, & |
| src_dimensions, id, d) /= 0) & |
| stop 6 |
| |
| do i = 0, 127 |
| if (q(i) /= i + 4) & |
| stop 7 |
| end do |
| |
| volume(2) = 2 |
| volume(1) = 3 |
| volume(0) = 6 |
| dst_offsets(2) = 1 |
| dst_offsets(1) = 0 |
| dst_offsets(0) = 0 |
| src_offsets(2) = 1 |
| src_offsets(1) = 0 |
| src_offsets(0) = 3 |
| dst_dimensions(2) = 2 |
| dst_dimensions(1) = 3 |
| dst_dimensions(0) = 6 |
| src_dimensions(2) = 3 |
| src_dimensions(1) = 4 |
| src_dimensions(0) = 6 |
| |
| if (omp_target_memcpy_rect (p, c_loc (q), sizeof (q(0)), 3, volume, & |
| dst_offsets, src_offsets, dst_dimensions, & |
| src_dimensions, d, id) /= 0) & |
| stop 8 |
| |
| i = 0 |
| if (d >= 0) i = d |
| !$omp target if (d >= 0) device (i) map(alloc:q(1:32)) map(from:err) |
| err = .false. |
| do j = 0, 5 |
| do k = 0, 2 |
| do l = 0, 1 |
| if (q(j * 6 + k * 2 + l) /= 3 * 12 + 4 + 1 + l + k * 3 + j * 12) & |
| err = .true. |
| end do |
| end do |
| end do |
| !$omp end target |
| |
| if (err) & |
| stop 9 |
| |
| if (omp_target_memcpy (p, p, 10 * sizeof (q(1)), 51 * sizeof (q(1)), & |
| 111 * sizeof (q(1)), d, d) /= 0) & |
| stop 10 |
| |
| i = 0 |
| if (d >= 0) i = d |
| !$omp target if (d >= 0) device (i) map(alloc:q(0:31)) map(from:err) |
| err = .false. |
| do j = 1, 9 |
| if (q(50+j) /= q(110 + j)) & |
| err = .true. |
| end do |
| !$omp end target |
| |
| if (err) & |
| stop 11 |
| |
| if (omp_target_disassociate_ptr (c_loc (q), d) /= 0) & |
| stop 12 |
| end if |
| |
| call omp_target_free (p, d) |
| end program main |