This patch adds OpenMPToLLVMIRTranslation support for the OpenMP Declare Mapper directive. Since both MLIR and Clang now support custom mappers, I've changed the respective function params to no longer be optional as well. Depends on #121005
54 lines
1.4 KiB
Fortran
54 lines
1.4 KiB
Fortran
! Offloading test checking lowering of arrays with dynamic extents.
|
|
! REQUIRES: flang, amdgpu
|
|
|
|
! RUN: %libomptarget-compile-fortran-run-and-check-generic
|
|
|
|
program test_openmp_mapper
|
|
implicit none
|
|
integer, parameter :: n = 1024
|
|
type :: mytype
|
|
integer :: data(n)
|
|
end type mytype
|
|
|
|
type :: mytype2
|
|
type(mytype) :: my_data
|
|
end type mytype2
|
|
|
|
! Declare custom mappers for the derived type `mytype`
|
|
!$omp declare mapper(my_mapper1 : mytype :: t) map(to: t%data(1 : n))
|
|
|
|
! Declare custom mappers for the derived type `mytype2`
|
|
!$omp declare mapper(my_mapper2 : mytype2 :: t) map(mapper(my_mapper1): t%my_data)
|
|
|
|
type(mytype2) :: obj
|
|
integer :: i, sum_host, sum_device
|
|
|
|
! Initialize the host data
|
|
do i = 1, n
|
|
obj%my_data%data(i) = 1
|
|
end do
|
|
|
|
! Compute the sum on the host for verification
|
|
sum_host = sum(obj%my_data%data)
|
|
|
|
! Offload computation to the device using the named mapper `my_mapper2`
|
|
sum_device = 0
|
|
!$omp target map(tofrom: sum_device) map(mapper(my_mapper2) : obj)
|
|
do i = 1, n
|
|
sum_device = sum_device + obj%my_data%data(i)
|
|
end do
|
|
!$omp end target
|
|
|
|
! Check results
|
|
print *, "Sum on host: ", sum_host
|
|
print *, "Sum on device: ", sum_device
|
|
|
|
if (sum_device == sum_host) then
|
|
print *, "Test passed!"
|
|
else
|
|
print *, "Test failed!"
|
|
end if
|
|
end program test_openmp_mapper
|
|
|
|
! CHECK: Test passed!
|