| ! Offloading test which aims to test that an allocatable/descriptor type map |
| ! will allow the appropriate slicing behaviour. |
| ! REQUIRES: flang, amdgpu |
| |
| subroutine slice_writer(n, a, b, c) |
| implicit none |
| integer, intent(in) :: n |
| real(8), intent(in) :: a(n) |
| real(8), intent(in) :: b(n) |
| real(8), intent(out) :: c(n) |
| integer :: i |
| |
| !$omp target teams distribute parallel do |
| do i=1,n |
| c(i) = b(i) + a(i) |
| end do |
| end subroutine slice_writer |
| |
| ! RUN: %libomptarget-compile-fortran-run-and-check-generic |
| program main |
| implicit none |
| real(kind=8), allocatable :: a(:,:,:) |
| integer :: i, j, k, idx, idx1, idx2, idx3 |
| |
| i=50 |
| j=100 |
| k=2 |
| |
| allocate(a(1:i,1:j,1:k)) |
| |
| do idx1=1, i |
| do idx2=1, j |
| do idx3=1, k |
| a(idx1,idx2,idx3) = idx2 |
| end do |
| end do |
| end do |
| |
| do idx=1,k |
| !$omp target enter data map(alloc: a(1:i,:, idx)) |
| |
| !$omp target update to(a(1:i, 1:30, idx), & |
| !$omp& a(1:i, 61:100, idx)) |
| |
| call slice_writer(i, a(:, 1, idx), a(:, 61, idx), a(:, 31, idx)) |
| call slice_writer(i, a(:, 30, idx), a(:, 100, idx), a(:, 60, idx)) |
| |
| !$omp target update from(a(1:i, 31:60, idx)) |
| !$omp target exit data map(delete: a(1:i, :, idx)) |
| |
| print *, a(1, 31, idx), a(2, 31, idx), a(i, 31, idx) |
| print *, a(1, 60, idx), a(2, 60, idx), a(i, 60, idx) |
| enddo |
| |
| deallocate(a) |
| end program |
| |
| ! CHECK: 62. 62. 62. |
| ! CHECK: 130. 130. 130. |
| ! CHECK: 62. 62. 62. |
| ! CHECK: 130. 130. 130. |