| program main |
| use omp_lib |
| use iso_c_binding |
| implicit none (external, type) |
| integer :: d, id, i, j |
| integer, target :: a, b(1:2), c(1:2), e(0:127) |
| type(c_ptr) :: p1, p2, p3, q, devptrs(0:63) |
| |
| a = 42; |
| q = c_loc (a); |
| e = [(i, i = 0, 127)] |
| |
| d = omp_get_default_device () |
| id = omp_get_initial_device () |
| |
| if (d < 0 .or. d >= omp_get_num_devices ()) & |
| d = id |
| |
| if (d /= id) then |
| !$omp target data map(alloc: a, b, c(2), e(32:95)) device(d) |
| !$omp target map(from: p1, p2, p3, devptrs) map(alloc: a, b, c(2), e(32:95)) device(d) |
| p1 = c_loc (a); |
| p2 = c_loc (b); |
| p3 = c_loc (c(2)) |
| devptrs = [(c_loc (e(i)), i = 32, 95)] |
| !$omp end target |
| |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (a), d), p1) & |
| .or. .not. c_associated (omp_get_mapped_ptr (q, d), p1) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b), d), p2) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b(1)), d), p2) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (c(2)), d), p3) & |
| .or. c_associated (omp_get_mapped_ptr (c_loc (c(1)), d))) & |
| stop 0 |
| |
| do j = 0, 31 |
| if (c_associated (omp_get_mapped_ptr (c_loc (e(j)), d))) & |
| stop 1 |
| end do |
| do j = 32, 95 |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (e(j)), d), devptrs(j-32))) & |
| stop 2 |
| end do |
| do j = 96, 128 |
| if (c_associated (omp_get_mapped_ptr (c_loc (e(j)), d))) & |
| stop 3 |
| end do |
| !$omp end target data |
| |
| if (c_associated (omp_get_mapped_ptr (c_loc (a), d)) & |
| .or. c_associated (omp_get_mapped_ptr (q, d)) & |
| .or. c_associated (omp_get_mapped_ptr (c_loc (b), d)) & |
| .or. c_associated (omp_get_mapped_ptr (c_loc (b(1)), d)) & |
| .or. c_associated (omp_get_mapped_ptr (c_loc (c(2)), d)) & |
| .or. c_associated (omp_get_mapped_ptr (c_loc (c(1)), d))) & |
| stop 4 |
| do j = 0, 127 |
| if (c_associated (omp_get_mapped_ptr (c_loc (e(j)), d))) & |
| stop 5 |
| end do |
| |
| !$omp target enter data map (alloc: a, b, c(2), e(32:95)) device (d) |
| !$omp target map(from: p1, p2, p3, devptrs) map(alloc: a, b, c(2), e(32:95)) device(d) |
| p1 = c_loc (a); |
| p2 = c_loc (b); |
| p3 = c_loc (c(2)) |
| devptrs = [(c_loc (e(i)), i = 32, 95)] |
| !$omp end target |
| |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (a), d), p1) & |
| .or. .not. c_associated (omp_get_mapped_ptr (q, d), p1) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b), d), p2) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (c(2)), d), p3) & |
| .or. c_associated (omp_get_mapped_ptr (c_loc (c(1)), d))) & |
| stop 6 |
| |
| do j = 0, 31 |
| if (c_associated (omp_get_mapped_ptr (c_loc (e(j)), d))) & |
| stop 7 |
| end do |
| do j = 32, 95 |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (e(j)), d), devptrs(j-32))) & |
| stop 8 |
| end do |
| do j = 96, 128 |
| if (c_associated (omp_get_mapped_ptr (c_loc (e(j)), d))) & |
| stop 9 |
| end do |
| !$omp target exit data map (delete: a, b, c(2), e(32:95)) device (d) |
| |
| if (c_associated (omp_get_mapped_ptr (c_loc (a), d)) & |
| .or. c_associated (omp_get_mapped_ptr (q, d)) & |
| .or. c_associated (omp_get_mapped_ptr (c_loc (b), d)) & |
| .or. c_associated (omp_get_mapped_ptr (c_loc (b(1)), d)) & |
| .or. c_associated (omp_get_mapped_ptr (c_loc (c(1)), d)) & |
| .or. c_associated (omp_get_mapped_ptr (c_loc (c(2)), d))) & |
| stop 10 |
| do j = 0, 127 |
| if (c_associated (omp_get_mapped_ptr (c_loc (e(j)), d))) & |
| stop 11 |
| end do |
| |
| else ! d == id |
| |
| !$omp target data map(alloc: a, b, c(2), e(32:95)) device(d) |
| !$omp target map(from: p1, p2, p3, devptrs) map(alloc: a, b, c(2), e(32:95)) device(d) |
| p1 = c_loc (a); |
| p2 = c_loc (b); |
| p3 = c_loc (c(2)) |
| devptrs = [(c_loc (e(i)), i = 32, 95)] |
| !$omp end target |
| |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (a), d), c_loc (a)) & |
| .or. .not. c_associated (omp_get_mapped_ptr (q, d), q) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b), d), c_loc (b)) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b(1)), d), c_loc (b(1))) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (c(2)), d), c_loc (c(2))) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (c(1)), d), c_loc (c(1)))) & |
| stop 12 |
| |
| do j = 0, 127 |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (e(j)), d), c_loc (e(j)))) & |
| stop 13 |
| end do |
| !$omp end target data |
| |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (a), d), c_loc (a)) & |
| .or. .not. c_associated (omp_get_mapped_ptr (q, d), q) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b), d), c_loc (b)) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b(1)), d), c_loc (b(1))) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (c(2)), d), c_loc (c(2))) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (c(1)), d), c_loc (c(1)))) & |
| stop 14 |
| do j = 0, 127 |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (e(j)), d))) & |
| stop 15 |
| end do |
| |
| !$omp target enter data map (alloc: a, b, c(2), e(32:95)) device (d) |
| !$omp target map(from: p1, p2, p3, devptrs) map(alloc: a, b, c(2), e(32:95)) device(d) |
| p1 = c_loc (a); |
| p2 = c_loc (b); |
| p3 = c_loc (c(2)) |
| devptrs = [(c_loc (e(i)), i = 32, 95)] |
| !$omp end target |
| |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (a), d), c_loc (a)) & |
| .or. .not. c_associated (omp_get_mapped_ptr (q, d), q) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b), d), c_loc (b)) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b(1)), d), c_loc (b(1))) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (c(2)), d), c_loc (c(2))) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (c(1)), d), c_loc (c(1)))) & |
| stop 16 |
| |
| do j = 0, 127 |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (e(j)), d), c_loc (e(j)))) & |
| stop 17 |
| end do |
| !$omp target exit data map (delete: a, b, c(2), e(32:95)) device (d) |
| |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (a), d), c_loc (a)) & |
| .or. .not. c_associated (omp_get_mapped_ptr (q, d), q) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b), d), c_loc (b)) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (b(1)), d), c_loc (b(1))) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (c(2)), d), c_loc (c(2))) & |
| .or. .not. c_associated (omp_get_mapped_ptr (c_loc (c(1)), d), c_loc (c(1)))) & |
| stop 18 |
| |
| do j = 0, 127 |
| if (.not. c_associated (omp_get_mapped_ptr (c_loc (e(j)), d), c_loc (e(j)))) & |
| stop 19 |
| end do |
| end if |
| |
| end program main |