[Bug target/88941] [nvptx, openacc, libgomp] Assertion `!s->map->active' failed for empty asynchronous parallel

vries at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Jan 23 08:17:00 GMT 2019


--- Comment #3 from Tom de Vries <vries at gcc dot gnu.org> ---
Author: vries
Date: Wed Jan 23 08:16:42 2019
New Revision: 268177

URL: https://gcc.gnu.org/viewcvs?rev=268177&root=gcc&view=rev
[nvptx, libgomp] Fix assert (!s->map->active) in map_fini

There are currently two situations where this assert triggers:
libgomp/plugin/plugin-nvptx.c: map_fini: Assertion `!s->map->active' failed.

First, in abort-1.c, a parallel region triggering an abort:
main (void)
  #pragma acc parallel
  abort ();

  return 0;

The abort is detected in nvptx_exec as the CUDA_ERROR_ILLEGAL_INSTRUCTION
return status of the cuStreamSynchronize call after kernel launch, which is
then handled by calling non-returning function GOMP_PLUGIN_fatal.
Consequently, the map_pop in nvptx_exec that in case of cuStreamSynchronize
success would remove or inactive the element added by the map_push earlier in
nvptx_exec, does not trigger.  With the element no longer active, but still
marked active and a member of s->map,  we run into the assert during
GOMP_OFFLOAD_fini_device, which is triggered from atexit handler
gomp_target_fini (which is triggered by the GOMP_PLUGIN_fatal mentioned above
calling exit).

Second, in pr88941.c, an async parallel region without wait:
main (void)
  #pragma acc parallel async

  /* no #pragma acc wait */
  return 0;

Because nvptx_exec is handling an async region, it does not call map_pop for
the element added by map_push, but schedules an kernel execution completion
event to call map_pop.  Again, we run into the assert during
GOMP_OFFLOAD_fini_device, which is triggered from atexit handler
gomp_target_fini, but the exit in this case is triggered by returning from
So either the kernel is still running, or the kernel has completed but the
corresponding event that is supposed to call map_pop is stuck in the event
queue, waiting for an event_gc.

Fix this by removing the assert, and skipping the freeing of device memory if
the map is still marked active (though in the async case, this is more a
workaround than an fix).

2019-01-23  Tom de Vries  <tdevries@suse.de>

        PR target/88941
        PR target/88939
        * plugin/plugin-nvptx.c (cuda_map_destroy): Handle map->active case.
        (map_fini): Remove "assert (!s->map->active)".
        * testsuite/libgomp.oacc-c-c++-common/pr88941.c: New test.


More information about the Gcc-bugs mailing list