diff options
author | Chung-Lin Tang <cltang@baylibre.com> | 2024-04-16 09:03:21 +0000 |
---|---|---|
committer | Chung-Lin Tang <cltang@baylibre.com> | 2024-04-16 09:04:11 +0000 |
commit | a7578a077ed8b64b94282aa55faf7037690abbc5 (patch) | |
tree | 1ec72d713dc1e66fa238d3b15396b21b30d75144 /libgomp/target.c | |
parent | 274f6bbe2328f899fd4e24636e0d71ac08c99856 (diff) | |
download | gcc-a7578a077ed8b64b94282aa55faf7037690abbc5.zip gcc-a7578a077ed8b64b94282aa55faf7037690abbc5.tar.gz gcc-a7578a077ed8b64b94282aa55faf7037690abbc5.tar.bz2 |
OpenACC 2.7: Adjust acc_map_data/acc_unmap_data interaction with reference counters
This patch adjusts the implementation of acc_map_data/acc_unmap_data API library
routines to more fit the description in the OpenACC 2.7 specification.
Instead of using REFCOUNT_INFINITY, we now define a REFCOUNT_ACC_MAP_DATA
special value to mark acc_map_data-created mappings. Adjustment around
mapping related code to respect OpenACC semantics are also added.
libgomp/ChangeLog:
* libgomp.h (REFCOUNT_ACC_MAP_DATA): Define as (REFCOUNT_SPECIAL | 2).
* oacc-mem.c (acc_map_data): Adjust to use REFCOUNT_ACC_MAP_DATA,
initialize dynamic_refcount as 1.
(acc_unmap_data): Adjust to use REFCOUNT_ACC_MAP_DATA,
(goacc_map_var_existing): Add REFCOUNT_ACC_MAP_DATA case.
(goacc_exit_datum_1): Add REFCOUNT_ACC_MAP_DATA case, respect
REFCOUNT_ACC_MAP_DATA when decrementing/finalizing. Force lowest
dynamic_refcount to be 1 for REFCOUNT_ACC_MAP_DATA.
(goacc_enter_data_internal): Add REFCOUNT_ACC_MAP_DATA case.
* target.c (gomp_increment_refcount): Return early for
REFCOUNT_ACC_MAP_DATA case.
(gomp_decrement_refcount): Likewise.
* testsuite/libgomp.oacc-c-c++-common/lib-96.c: New testcase.
* testsuite/libgomp.oacc-c-c++-common/unmap-infinity-1.c: Adjust
testcase error output scan test.
Diffstat (limited to 'libgomp/target.c')
-rw-r--r-- | libgomp/target.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/libgomp/target.c b/libgomp/target.c index bcc8605..5ec19ae 100644 --- a/libgomp/target.c +++ b/libgomp/target.c @@ -476,7 +476,9 @@ gomp_free_device_memory (struct gomp_device_descr *devicep, void *devptr) static inline void gomp_increment_refcount (splay_tree_key k, htab_t *refcount_set) { - if (k == NULL || k->refcount == REFCOUNT_INFINITY) + if (k == NULL + || k->refcount == REFCOUNT_INFINITY + || k->refcount == REFCOUNT_ACC_MAP_DATA) return; uintptr_t *refcount_ptr = &k->refcount; @@ -520,7 +522,9 @@ static inline void gomp_decrement_refcount (splay_tree_key k, htab_t *refcount_set, bool delete_p, bool *do_copy, bool *do_remove) { - if (k == NULL || k->refcount == REFCOUNT_INFINITY) + if (k == NULL + || k->refcount == REFCOUNT_INFINITY + || k->refcount == REFCOUNT_ACC_MAP_DATA) { *do_copy = *do_remove = false; return; |