Files
clang-p2996/openmp/libomptarget/test/offloading/fortran/target-map-allocatable-map-scopes.f90
agozillon 95fe47ca7e [Flang][OpenMP] Initial mapping of Fortran pointers and allocatables for target devices (#71766)
This patch seeks to add an initial lowering for pointers and allocatable variables 
captured by implicit and explicit map in Flang OpenMP for Target operations that 
take map clauses e.g. Target, Target Update. Target Exit/Enter etc.

Currently this is done by treating the type that lowers to a descriptor 
(allocatable/pointer/assumed shape) as a map of a record type (e.g. a structure) as that's
effectively what descriptor types lower to in LLVM-IR and what they're represented as
in the Fortran runtime (written in C/C++). The descriptor effectively lowers to a structure
containing scalar and array elements that represent various aspects of the underlying
data being mapped (lower bound, upper bound, extent being the main ones of interest
in most cases) and a pointer to the allocated data. In this current iteration of the mapping
we map the structure in it's entirety and then attach the underlying data pointer and map
the data to the device, this allows most of the required data to be resident on the device
for use. Currently we do not support the addendum (another block of pointer data), but
it shouldn't be too difficult to extend this to support it.

The MapInfoOp generation for descriptor types is primarily handled in an optimization
pass, where it expands BoxType (descriptor types) map captures into two maps, one for
the structure (scalar elements) and the other for the pointer data (base address) and
links them in a Parent <-> Child relationship. The later lowering processes will then treat
them as a conjoined structure with a pointer member map.
2024-02-05 18:45:07 +01:00

67 lines
1.4 KiB
Fortran

! Offloading test checking interaction of allocatables
! with target in different scopes
! REQUIRES: flang, amdgcn-amd-amdhsa
! UNSUPPORTED: nvptx64-nvidia-cuda
! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
! UNSUPPORTED: aarch64-unknown-linux-gnu
! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
! UNSUPPORTED: x86_64-pc-linux-gnu
! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
! RUN: %libomptarget-compile-fortran-run-and-check-generic
module test
contains
subroutine func_arg(arg_alloc)
integer, allocatable, intent (inout) :: arg_alloc(:)
!$omp target map(tofrom: arg_alloc)
do index = 1, 10
arg_alloc(index) = arg_alloc(index) + index
end do
!$omp end target
print *, arg_alloc
end subroutine func_arg
end module
subroutine func
integer, allocatable :: local_alloc(:)
allocate(local_alloc(10))
!$omp target map(tofrom: local_alloc)
do index = 1, 10
local_alloc(index) = index
end do
!$omp end target
print *, local_alloc
deallocate(local_alloc)
end subroutine func
program main
use test
integer, allocatable :: map_ptr(:)
allocate(map_ptr(10))
!$omp target map(tofrom: map_ptr)
do index = 1, 10
map_ptr(index) = index
end do
!$omp end target
call func
print *, map_ptr
call func_arg(map_ptr)
deallocate(map_ptr)
end program
! CHECK: 1 2 3 4 5 6 7 8 9 10
! CHECK: 1 2 3 4 5 6 7 8 9 10
! CHECK: 2 4 6 8 10 12 14 16 18 20