On Fri, 5 Jun 2020 13:17:09 +0200 Thomas Schwinge <tho...@codesourcery.com> wrote:
> Hi Julian! > > On 2019-12-17T21:03:47-0800, Julian Brown <jul...@codesourcery.com> > wrote: > > This part contains the libgomp runtime support for the > > GOMP_MAP_ATTACH and GOMP_MAP_DETACH mapping kinds > > > --- a/libgomp/target.c > > +++ b/libgomp/target.c > > > @@ -1203,6 +1211,32 @@ gomp_map_vars_internal (struct > > gomp_device_descr *devicep, > > > + case GOMP_MAP_ATTACH: > > + { > > + cur_node.host_start = (uintptr_t) hostaddrs[i]; > > + cur_node.host_end = cur_node.host_start + sizeof > > (void *); > > + splay_tree_key n = splay_tree_lookup (mem_map, > > &cur_node); > > + if (n != NULL) > > + { > > + tgt->list[i].key = n; > > + tgt->list[i].offset = cur_node.host_start - > > n->host_start; > > + tgt->list[i].length = n->host_end - > > n->host_start; > > + tgt->list[i].copy_from = false; > > + tgt->list[i].always_copy_from = false; > > + tgt->list[i].do_detach > > + = (pragma_kind != > > GOMP_MAP_VARS_OPENACC_ENTER_DATA); > > + n->refcount++; > > + } > > + else > > + { > > + gomp_mutex_unlock (&devicep->lock); > > + gomp_fatal ("outer struct not mapped for > > attach"); > > + } > > + gomp_attach_pointer (devicep, aq, mem_map, n, > > + (uintptr_t) hostaddrs[i], > > sizes[i], > > + cbufp); > > + continue; > > + } > > For the OpenACC runtime API 'acc_attach' etc. routines they don't, so > what's the conceptual reason that for the corresponding OpenACC > directive variants, 'GOMP_MAP_ATTACH' etc. here participate in > reference counting ('n->refcount++' above)? I understand OpenACC > 'attach'/'detach' clauses to be simple "executable clauses", which > just update some values somewhere (say, like > 'GOMP_MAP_ALWAYS_POINTER'), but they don't alter any mapping state, > thus wouldn't appear to need reference counting? IIUC, n->refcount is not directly the "structural reference count" as seen at source level, but rather counts the number of target_var_descs in the lists appended to each target_mem_desc -- and GOMP_MAP_ATTACH have variable entries in those lists. That's not the case for the API routines. Julian