libgomp: Fix reverse offload issues
If there is nothing to map, skip the mapping and avoid attempting to copy 0 bytes from addrs, sizes and kinds. Additionally, it could happen that a non-allocated address was deallocated, such as a pointer set, leading to a free for the actual data. libgomp/ * target.c (gomp_target_rev): Handle mapnum == 0 and avoid freeing not allocated memory. * testsuite/libgomp.fortran/reverse-offload-6.f90: New test.
This commit is contained in:
parent
f84fdb134d
commit
0b1ce70a81
2 changed files with 36 additions and 4 deletions
|
@ -3324,7 +3324,7 @@ gomp_target_rev (uint64_t fn_ptr, uint64_t mapnum, uint64_t devaddrs_ptr,
|
|||
gomp_fatal ("Cannot find reverse-offload function");
|
||||
void (*host_fn)() = (void (*)()) n->k->host_start;
|
||||
|
||||
if (devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
|
||||
if ((devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) || mapnum == 0)
|
||||
{
|
||||
devaddrs = (uint64_t *) (uintptr_t) devaddrs_ptr;
|
||||
sizes = (uint64_t *) (uintptr_t) sizes_ptr;
|
||||
|
@ -3402,7 +3402,7 @@ gomp_target_rev (uint64_t fn_ptr, uint64_t mapnum, uint64_t devaddrs_ptr,
|
|||
}
|
||||
}
|
||||
|
||||
if (!(devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM))
|
||||
if (!(devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) && mapnum > 0)
|
||||
{
|
||||
size_t j, struct_cpy = 0;
|
||||
splay_tree_key n2;
|
||||
|
@ -3638,7 +3638,7 @@ gomp_target_rev (uint64_t fn_ptr, uint64_t mapnum, uint64_t devaddrs_ptr,
|
|||
|
||||
host_fn (devaddrs);
|
||||
|
||||
if (!(devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM))
|
||||
if (!(devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) && mapnum > 0)
|
||||
{
|
||||
uint64_t struct_cpy = 0;
|
||||
bool clean_struct = false;
|
||||
|
@ -3680,7 +3680,7 @@ gomp_target_rev (uint64_t fn_ptr, uint64_t mapnum, uint64_t devaddrs_ptr,
|
|||
clean_struct = true;
|
||||
struct_cpy = sizes[i];
|
||||
}
|
||||
else if (cdata[i].aligned)
|
||||
else if (!cdata[i].present && cdata[i].aligned)
|
||||
gomp_aligned_free ((void *) (uintptr_t) devaddrs[i]);
|
||||
else if (!cdata[i].present)
|
||||
free ((void *) (uintptr_t) devaddrs[i]);
|
||||
|
|
32
libgomp/testsuite/libgomp.fortran/reverse-offload-6.f90
Normal file
32
libgomp/testsuite/libgomp.fortran/reverse-offload-6.f90
Normal file
|
@ -0,0 +1,32 @@
|
|||
!
|
||||
! Ensure that a mapping with no argument works
|
||||
!
|
||||
|
||||
module m
|
||||
implicit none (type, external)
|
||||
integer :: x = 32
|
||||
integer :: dev_num2 = -1
|
||||
contains
|
||||
subroutine foo()
|
||||
use omp_lib, only: omp_get_device_num
|
||||
x = x + 10
|
||||
dev_num2 = omp_get_device_num()
|
||||
end
|
||||
end module m
|
||||
|
||||
use m
|
||||
use omp_lib
|
||||
!$omp requires reverse_offload
|
||||
implicit none (type, external)
|
||||
integer :: dev_num = -1
|
||||
!$omp target map(from:dev_num)
|
||||
dev_num = omp_get_device_num()
|
||||
! This calls GOMP_target_ext with number of maps = 0
|
||||
!$omp target device(ancestor:1)
|
||||
call foo
|
||||
!$omp end target
|
||||
!$omp end target
|
||||
|
||||
if (omp_get_num_devices() > 0 .and. dev_num2 == dev_num) stop 1
|
||||
if (x /= 42) stop 2
|
||||
end
|
Loading…
Add table
Reference in a new issue