oacc-parallel.c (GOACC_parallel): Move variadic handling into wait=-specific if.

* oacc-parallel.c (GOACC_parallel): Move variadic handling into
	wait=-specific if.
	(GOACC_enter_exit_data, GOACC_update): Use consistent num_waits
	!=0 condition.
	(goacc_waits): Move !num_waits handling to ...
	(GOACC_wait): ... here, the only caller that might have zero waits.

From-SVN: r226011
This commit is contained in:
Nathan Sidwell 2015-07-20 17:31:46 +00:00 committed by Nathan Sidwell
parent 53c1201606
commit a091118d2c
2 changed files with 34 additions and 52 deletions

View File

@ -1,5 +1,12 @@
2015-07-20 Nathan Sidwell <nathan@codesourcery.com> 2015-07-20 Nathan Sidwell <nathan@codesourcery.com>
* oacc-parallel.c (GOACC_parallel): Move variadic handling into
wait=-specific if.
(GOACC_enter_exit_data, GOACC_update): Use consistent num_waits
!=0 condition.
(goacc_waits): Move !num_waits handling to ...
(GOACC_wait): ... here, the only caller that might have zero waits.
* plugin/plugin-nvptx.c (struct targ_fn_descriptor): Move later. * plugin/plugin-nvptx.c (struct targ_fn_descriptor): Move later.
(struct ptx_image_data): Move earlier, add fns field. (struct ptx_image_data): Move earlier, add fns field.
(struct ptx_device): Add images and image_lock fields. (struct ptx_device): Add images and image_lock fields.

View File

@ -105,12 +105,12 @@ GOACC_parallel (int device, void (*fn) (void *),
return; return;
} }
if (num_waits)
{
va_start (ap, num_waits); va_start (ap, num_waits);
if (num_waits > 0)
goacc_wait (async, num_waits, ap); goacc_wait (async, num_waits, ap);
va_end (ap); va_end (ap);
}
acc_dev->openacc.async_set_async_func (async); acc_dev->openacc.async_set_async_func (async);
@ -225,14 +225,12 @@ GOACC_enter_exit_data (int device, size_t mapnum,
|| host_fallback) || host_fallback)
return; return;
if (num_waits > 0) if (num_waits)
{ {
va_list ap; va_list ap;
va_start (ap, num_waits); va_start (ap, num_waits);
goacc_wait (async, num_waits, ap); goacc_wait (async, num_waits, ap);
va_end (ap); va_end (ap);
} }
@ -350,47 +348,21 @@ goacc_wait (int async, int num_waits, va_list ap)
{ {
struct goacc_thread *thr = goacc_thread (); struct goacc_thread *thr = goacc_thread ();
struct gomp_device_descr *acc_dev = thr->dev; struct gomp_device_descr *acc_dev = thr->dev;
int i;
assert (num_waits >= 0); while (num_waits--)
if (async == acc_async_sync && num_waits == 0)
{
acc_wait_all ();
return;
}
if (async == acc_async_sync && num_waits)
{
for (i = 0; i < num_waits; i++)
{ {
int qid = va_arg (ap, int); int qid = va_arg (ap, int);
if (acc_async_test (qid)) if (acc_async_test (qid))
continue; continue;
if (async == acc_async_sync)
acc_wait (qid); acc_wait (qid);
} else if (qid == async)
return; ;/* If we're waiting on the same asynchronous queue as we're
} launching on, the queue itself will order work as
required, so there's no need to wait explicitly. */
if (async == acc_async_noval && num_waits == 0) else
{
acc_dev->openacc.async_wait_all_async_func (acc_async_noval);
return;
}
for (i = 0; i < num_waits; i++)
{
int qid = va_arg (ap, int);
if (acc_async_test (qid))
continue;
/* If we're waiting on the same asynchronous queue as we're launching on,
the queue itself will order work as required, so there's no need to
wait explicitly. */
if (qid != async)
acc_dev->openacc.async_wait_async_func (qid, async); acc_dev->openacc.async_wait_async_func (qid, async);
} }
} }
@ -412,14 +384,12 @@ GOACC_update (int device, size_t mapnum,
|| host_fallback) || host_fallback)
return; return;
if (num_waits > 0) if (num_waits)
{ {
va_list ap; va_list ap;
va_start (ap, num_waits); va_start (ap, num_waits);
goacc_wait (async, num_waits, ap); goacc_wait (async, num_waits, ap);
va_end (ap); va_end (ap);
} }
@ -455,13 +425,18 @@ GOACC_update (int device, size_t mapnum,
void void
GOACC_wait (int async, int num_waits, ...) GOACC_wait (int async, int num_waits, ...)
{ {
if (num_waits)
{
va_list ap; va_list ap;
va_start (ap, num_waits); va_start (ap, num_waits);
goacc_wait (async, num_waits, ap); goacc_wait (async, num_waits, ap);
va_end (ap); va_end (ap);
}
else if (async == acc_async_sync)
acc_wait_all ();
else if (async == acc_async_noval)
acc_dev->openacc.async_wait_all_async_func (acc_async_noval);
} }
int int