plugin/plugin-gcn.c: Fix error handling of GOMP_OFFLOAD_openacc_async_construct

Follow up to r15-5392-g884637b6362391. As the name implies,
GOMP_OFFLOAD_openacc_async_construct is also externally called.
Hence, partially revert previous commit to permit unlocking handling
in oacc-async.c's lookup_goacc_asyncqueue by not failing fatally.

Hence, also the other (indirect) callers had to be updated:
GOMP_OFFLOAD_dev2dev fails now with 'false' and
GOMP_OFFLOAD_async_run fatally.

libgomp/ChangeLog:

	* plugin/plugin-gcn.c (GOMP_OFFLOAD_dev2dev, GOMP_OFFLOAD_async_run):
	Handle omp_async_queue == NULL after call to maybe_init_omp_async.
	(GOMP_OFFLOAD_openacc_async_construct): Use error not fatal error,
	partially reverting r15-5392.
This commit is contained in:
Tobias Burnus 2024-12-10 16:16:04 +01:00
parent 0703e7491e
commit 7a12dc695b

View file

@ -3939,6 +3939,8 @@ GOMP_OFFLOAD_dev2dev (int device, void *dst, const void *src, size_t n)
{
struct agent_info *agent = get_agent_info (device);
maybe_init_omp_async (agent);
if (!agent->omp_async_queue)
return false;
queue_push_copy (agent->omp_async_queue, dst, src, n);
return true;
}
@ -4350,6 +4352,8 @@ GOMP_OFFLOAD_async_run (int device, void *tgt_fn, void *tgt_vars,
}
maybe_init_omp_async (agent);
if (!agent->omp_async_queue)
GOMP_PLUGIN_fatal ("Asynchronous queue initialization failed");
queue_push_launch (agent->omp_async_queue, kernel, tgt_vars, kla);
queue_push_callback (agent->omp_async_queue,
GOMP_PLUGIN_target_task_completion, async_data);
@ -4388,9 +4392,7 @@ GOMP_OFFLOAD_openacc_async_exec (void (*fn_ptr) (void *),
gcn_exec (kernel, devaddrs, dims, targ_mem_desc, true, aq);
}
/* Create a new asynchronous thread and queue for running future kernels;
issues a fatal error if the queue cannot be created as all callers expect
that the queue exists. */
/* Create a new asynchronous thread and queue for running future kernels. */
struct goacc_asyncqueue *
GOMP_OFFLOAD_openacc_async_construct (int device)
@ -4418,17 +4420,17 @@ GOMP_OFFLOAD_openacc_async_construct (int device)
if (pthread_mutex_init (&aq->mutex, NULL))
{
GOMP_PLUGIN_fatal ("Failed to initialize a GCN agent queue mutex");
GOMP_PLUGIN_error ("Failed to initialize a GCN agent queue mutex");
return NULL;
}
if (pthread_cond_init (&aq->queue_cond_in, NULL))
{
GOMP_PLUGIN_fatal ("Failed to initialize a GCN agent queue cond");
GOMP_PLUGIN_error ("Failed to initialize a GCN agent queue cond");
return NULL;
}
if (pthread_cond_init (&aq->queue_cond_out, NULL))
{
GOMP_PLUGIN_fatal ("Failed to initialize a GCN agent queue cond");
GOMP_PLUGIN_error ("Failed to initialize a GCN agent queue cond");
return NULL;
}