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