[Bug libgomp/92843] [OpenACC] Disallow 'acc_delete' etc. for everything without a dynamic reference count
jules at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Dec 10 14:48:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92843
--- Comment #9 from jules at gcc dot gnu.org ---
FWIW, I wrote this at the time wrt. the refcounting changes (some parts refer
to a previous iteration of the manual deep copy patches)...
Writing a couple of new attach/detach tests, I realised that reference
counting for OpenACC was pretty seriously broken. In an attempt to fix
that, I've:
- written self-checking code to verify reference counts. This walks
over the whole memory-mapping splay tree and re-counts references,
making sure they match up with the running tallies kept by the
mapping/unmapping routines.
- removed the dubious "finalize" arguments from the unmap routines you
pointed out. Call "detach" in more appropriate places.
- rewritten gomp_acc_{insert,remove}_pointer, and change the way
"enter data" mapping works in OpenACC to be more like the
implementation for OpenMP (gomp_acc_remove_pointer is now modelled
on target.c:gomp_exit_data).
- ...which means we can get rid of the "acc_dev->openacc.data_environ"
list. I think I added that to start with (ICBW!) but now I don't
think we need it. That means we avoid a lot of scanning through
linear linked lists to find the "right" target_mem_desc to unmap --
which it turns out was buggy, and also probably conceptually wrong.
(In GOACC_enter_exit_data, that meant each mapping clause got its own
"target_mem_desc" when entering, which isn't how things normally work
for gomp_map_vars. That meant that when "exit data"ing, again
individual clauses could remove the corresponding target_mem_desc.
What *didn't* work is if the mappings for a single target_mem_desc
returned by GOACC_enter_exit_data refer to *other* target_mem_descs
in their argument lists, rather than pointing back to the same one. A
lot of the code that was checking "t->refcount" for "2" or "minrefs"
in oacc-mem.c was simply broken.)
- lookup_dev scans over the splay tree instead of looking through the
data_environ list. It should have done that to start with -- it
means it'll be able to find data mapped inside "pragma acc data"
blocks, which it wouldn't have been able to previously.
It's a lot of changes, but (I hope!) with the RC_CHECKING feature we'll
be able to be a little more confident that we've got the memory map
refcounting right, at least.
More information about the Gcc-bugs
mailing list