libgomp – fix handling of 'target enter data'
* target.c (GOMP_target_enter_exit_data): Handle PSET/MAP_POINTER. * testsuite/libgomp.fortran/target-enter-data-1.f90: New.
This commit is contained in:
parent
331c438d5a
commit
689418b97e
3 changed files with 53 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
|||
2020-03-31 Tobias Burnus <tobias@codesourcery.com>
|
||||
|
||||
* target.c (GOMP_target_enter_exit_data): Handle PSET/MAP_POINTER.
|
||||
* testsuite/libgomp.fortran/target-enter-data-1.f90: New.
|
||||
|
||||
2020-03-24 Tobias Burnus <tobias@codesourcery.com>
|
||||
|
||||
PR libgomp/81689
|
||||
|
|
|
@ -2480,7 +2480,9 @@ GOMP_target_enter_exit_data (int device, size_t mapnum, void **hostaddrs,
|
|||
}
|
||||
}
|
||||
|
||||
size_t i;
|
||||
/* The variables are mapped separately such that they can be released
|
||||
independently. */
|
||||
size_t i, j;
|
||||
if ((flags & GOMP_TARGET_FLAG_EXIT_DATA) == 0)
|
||||
for (i = 0; i < mapnum; i++)
|
||||
if ((kinds[i] & 0xff) == GOMP_MAP_STRUCT)
|
||||
|
@ -2489,6 +2491,15 @@ GOMP_target_enter_exit_data (int device, size_t mapnum, void **hostaddrs,
|
|||
&kinds[i], true, GOMP_MAP_VARS_ENTER_DATA);
|
||||
i += sizes[i];
|
||||
}
|
||||
else if ((kinds[i] & 0xff) == GOMP_MAP_TO_PSET)
|
||||
{
|
||||
for (j = i + 1; j < mapnum; j++)
|
||||
if (!GOMP_MAP_POINTER_P (get_kind (true, kinds, j) & 0xff))
|
||||
break;
|
||||
gomp_map_vars (devicep, j-i, &hostaddrs[i], NULL, &sizes[i],
|
||||
&kinds[i], true, GOMP_MAP_VARS_ENTER_DATA);
|
||||
i += j - i - 1;
|
||||
}
|
||||
else
|
||||
gomp_map_vars (devicep, 1, &hostaddrs[i], NULL, &sizes[i], &kinds[i],
|
||||
true, GOMP_MAP_VARS_ENTER_DATA);
|
||||
|
|
36
libgomp/testsuite/libgomp.fortran/target-enter-data-1.f90
Normal file
36
libgomp/testsuite/libgomp.fortran/target-enter-data-1.f90
Normal file
|
@ -0,0 +1,36 @@
|
|||
program main
|
||||
implicit none
|
||||
integer, allocatable, dimension(:) :: AA, BB, CC, DD
|
||||
integer :: i, N = 20
|
||||
|
||||
allocate(BB(N))
|
||||
AA = [(i, i=1,N)]
|
||||
|
||||
!$omp target enter data map(alloc: BB)
|
||||
!$omp target enter data map(to: AA)
|
||||
|
||||
!$omp target
|
||||
BB = 3 * AA
|
||||
!$omp end target
|
||||
|
||||
!$omp target exit data map(delete: AA)
|
||||
!$omp target exit data map(from: BB)
|
||||
|
||||
if (any (BB /= [(3*i, i=1,N)])) stop 1
|
||||
if (any (AA /= [(i, i=1,N)])) stop 2
|
||||
|
||||
|
||||
CC = 31 * BB
|
||||
DD = [(-i, i=1,N)]
|
||||
|
||||
!$omp target enter data map(to: CC) map(alloc: DD)
|
||||
|
||||
!$omp target
|
||||
DD = 5 * CC
|
||||
!$omp end target
|
||||
|
||||
!$omp target exit data map(delete: CC) map(from: DD)
|
||||
|
||||
if (any (CC /= [(31*3*i, i=1,N)])) stop 3
|
||||
if (any (DD /= [(31*3*5*i, i=1,N)])) stop 4
|
||||
end
|
Loading…
Add table
Reference in a new issue