| ! 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. |