| ! Test custom mappers with target update to/from clauses |
| ! REQUIRES: flang, amdgpu |
| |
| ! RUN: %libomptarget-compile-fortran-run-and-check-generic |
| |
| program target_update_mapper_test |
| implicit none |
| integer, parameter :: n = 100 |
| |
| type :: my_type |
| integer :: a(n) |
| integer :: b(n) |
| end type my_type |
| |
| ! Declare custom mapper that only maps field 'a' |
| !$omp declare mapper(custom : my_type :: t) map(t%a) |
| |
| ! Declare default mapper that maps both fields |
| !$omp declare mapper(my_type :: t) map(t%a, t%b) |
| |
| type(my_type) :: obj1, obj2 |
| integer :: i, sum_a, sum_b |
| |
| ! ========== Test 1: Custom mapper (field 'a' only) ========== |
| |
| ! Initialize data on host |
| do i = 1, n |
| obj1%a(i) = i |
| obj1%b(i) = i * 2 |
| end do |
| |
| ! Allocate and update using custom mapper (only 'a') |
| !$omp target enter data map(mapper(custom), alloc: obj1) |
| |
| obj1%a = 10 |
| !$omp target update to(mapper(custom): obj1) |
| |
| obj1%a = 0 |
| !$omp target update from(mapper(custom): obj1) |
| |
| sum_a = sum(obj1%a) |
| sum_b = sum(obj1%b) |
| |
| ! CHECK: Sum of a (custom mapper): 1000 |
| print *, "Sum of a (custom mapper):", sum_a |
| |
| ! Field 'b' was never mapped with custom mapper |
| ! CHECK: Sum of b (never mapped): 10100 |
| print *, "Sum of b (never mapped):", sum_b |
| |
| !$omp target exit data map(mapper(custom), delete: obj1) |
| |
| ! ========== Test 2: Default mapper (both fields) ========== |
| |
| ! Initialize separate object for default mapper test |
| do i = 1, n |
| obj2%a(i) = 20 |
| obj2%b(i) = 30 |
| end do |
| |
| ! Allocate and update using default mapper (both 'a' and 'b') |
| !$omp target enter data map(mapper(default), alloc: obj2) |
| |
| !$omp target update to(mapper(default): obj2) |
| |
| obj2%a = 0 |
| obj2%b = 0 |
| |
| !$omp target update from(mapper(default): obj2) |
| |
| sum_a = sum(obj2%a) |
| sum_b = sum(obj2%b) |
| |
| ! CHECK: Sum of a (default mapper): 2000 |
| print *, "Sum of a (default mapper):", sum_a |
| |
| ! CHECK: Sum of b (default mapper): 3000 |
| print *, "Sum of b (default mapper):", sum_b |
| |
| !$omp target exit data map(mapper(default), delete: obj2) |
| |
| ! CHECK: Test passed! |
| print *, "Test passed!" |
| |
| end program target_update_mapper_test |