From: Julian Brown Date: Fri, 20 Dec 2019 01:20:19 +0000 (+0000) Subject: Use gomp_map_val for OpenACC host-to-device address translation X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5bcd470bf0749e1f56d05dd43aa9584ff2e3a090;p=gcc.git Use gomp_map_val for OpenACC host-to-device address translation libgomp/ * libgomp.h (gomp_map_val): Add prototype. * oacc-parallel.c (GOACC_parallel_keyed): Use gomp_map_val instead of open-coding device-address calculation. * target.c (gomp_map_val): Make global. Use OFFSET_POINTER in non-present case. Co-Authored-By: Cesar Philippidis From-SVN: r279622 --- diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index c08d7b0c457..6c146217fe2 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,12 @@ +2019-12-19 Julian Brown + Cesar Philippidis + + * libgomp.h (gomp_map_val): Add prototype. + * oacc-parallel.c (GOACC_parallel_keyed): Use gomp_map_val instead of + open-coding device-address calculation. + * target.c (gomp_map_val): Make global. Use OFFSET_POINTER in + non-present case. + 2019-12-19 Julian Brown * libgomp.h (struct splay_tree_key_s): Substitute dynamic_refcount diff --git a/libgomp/libgomp.h b/libgomp/libgomp.h index b9301bd70f8..8139cd7de08 100644 --- a/libgomp/libgomp.h +++ b/libgomp/libgomp.h @@ -1157,6 +1157,7 @@ extern void gomp_copy_host2dev (struct gomp_device_descr *, extern void gomp_copy_dev2host (struct gomp_device_descr *, struct goacc_asyncqueue *, void *, const void *, size_t); +extern uintptr_t gomp_map_val (struct target_mem_desc *, void **, size_t); extern struct target_mem_desc *gomp_map_vars (struct gomp_device_descr *, size_t, void **, void **, diff --git a/libgomp/oacc-parallel.c b/libgomp/oacc-parallel.c index 5c13a7e4348..c853f01b27f 100644 --- a/libgomp/oacc-parallel.c +++ b/libgomp/oacc-parallel.c @@ -303,12 +303,8 @@ GOACC_parallel_keyed (int flags_m, void (*fn) (void *), devaddrs = gomp_alloca (sizeof (void *) * mapnum); for (i = 0; i < mapnum; i++) - if (tgt->list[i].key != NULL) - devaddrs[i] = (void *) (tgt->list[i].key->tgt->tgt_start - + tgt->list[i].key->tgt_offset - + tgt->list[i].offset); - else - devaddrs[i] = NULL; + devaddrs[i] = (void *) gomp_map_val (tgt, hostaddrs, i); + if (aq == NULL) acc_dev->openacc.exec_func (tgt_fn, mapnum, hostaddrs, devaddrs, dims, tgt); diff --git a/libgomp/target.c b/libgomp/target.c index f2a60614e59..ef8e9ab14fc 100644 --- a/libgomp/target.c +++ b/libgomp/target.c @@ -493,7 +493,7 @@ gomp_map_fields_existing (struct target_mem_desc *tgt, (void *) cur_node.host_end); } -static inline uintptr_t +attribute_hidden uintptr_t gomp_map_val (struct target_mem_desc *tgt, void **hostaddrs, size_t i) { if (tgt->list[i].key != NULL) @@ -713,7 +713,7 @@ gomp_map_vars_internal (struct gomp_device_descr *devicep, { /* Not present, hence, skip entry - including its MAP_POINTER, when existing. */ - tgt->list[i].offset = 0; + tgt->list[i].offset = OFFSET_POINTER; if (i + 1 < mapnum && ((typemask & get_kind (short_mapkind, kinds, i + 1)) == GOMP_MAP_POINTER))