2017-05-24 Thomas Schwinge <thomas@codesourcery.com>
+ * openacc.h (acc_async_wait, acc_async_wait_all): New prototypes.
+ * libgomp.map (OACC_2.0.1): Add these.
+ * oacc-async.c (acc_async_wait, acc_async_wait_all): New aliases
+ for "acc_wait", and "acc_wait_all", respectively.
+ * openacc.f90 (acc_async_wait, acc_async_wait_all): New interfaces
+ for "acc_wait", and "acc_wait_all", respectively.
+ * openacc_lib.h (acc_async_wait, acc_async_wait_all): Likewise.
+ * libgomp.texi (acc_wait, acc_wait_all): Update.
+ * testsuite/libgomp.oacc-c-c++-common/par-reduction-2.c: Update.
+ * testsuite/libgomp.oacc-fortran/par-reduction-2-1.f: New file.
+ * testsuite/libgomp.oacc-fortran/par-reduction-2-2.f: Likewise.
+
* openacc_lib.h (acc_pcopyin, acc_pcreate): Route to
acc_present_or_copyin and acc_present_or_create procedures,
respectively.
OACC_2.0.1 {
global:
+ acc_async_wait;
+ acc_async_wait_all;
acc_pcopyin;
acc_pcreate;
} OACC_2.0;
@item @emph{C/C++}:
@multitable @columnfractions .20 .80
@item @emph{Prototype}: @tab @code{acc_wait(arg);}
+@item @emph{Prototype (OpenACC 1.0 compatibility)}: @tab @code{acc_async_wait(arg);}
@end multitable
@item @emph{Fortran}:
@multitable @columnfractions .20 .80
@item @emph{Interface}: @tab @code{subroutine acc_wait(arg)}
@item @tab @code{integer(acc_handle_kind) arg}
+@item @emph{Interface (OpenACC 1.0 compatibility)}: @tab @code{subroutine acc_async_wait(arg)}
+@item @tab @code{integer(acc_handle_kind) arg}
@end multitable
@item @emph{Reference}:
@item @emph{C/C++}:
@multitable @columnfractions .20 .80
@item @emph{Prototype}: @tab @code{acc_wait_all(void);}
+@item @emph{Prototype (OpenACC 1.0 compatibility)}: @tab @code{acc_async_wait_all(void);}
@end multitable
@item @emph{Fortran}:
@multitable @columnfractions .20 .80
-@item @emph{Interface}: @tab @code{subroutine acc_wait_async()}
+@item @emph{Interface}: @tab @code{subroutine acc_wait_all()}
+@item @emph{Interface (OpenACC 1.0 compatibility)}: @tab @code{subroutine acc_async_wait_all()}
@end multitable
@item @emph{Reference}:
thr->dev->openacc.async_wait_func (async);
}
+/* acc_async_wait is an OpenACC 1.0 compatibility name for acc_wait. */
+#ifdef HAVE_ATTRIBUTE_ALIAS
+strong_alias (acc_wait, acc_async_wait)
+#else
+void
+acc_async_wait (int async)
+{
+ acc_wait (async);
+}
+#endif
+
void
acc_wait_async (int async1, int async2)
{
thr->dev->openacc.async_wait_all_func ();
}
+/* acc_async_wait_all is an OpenACC 1.0 compatibility name for acc_wait_all. */
+#ifdef HAVE_ATTRIBUTE_ALIAS
+strong_alias (acc_wait_all, acc_async_wait_all)
+#else
+void
+acc_async_wait_all (void)
+{
+ acc_wait_all ();
+}
+#endif
+
void
acc_wait_all_async (int async)
{
public :: acc_get_num_devices, acc_set_device_type, acc_get_device_type
public :: acc_set_device_num, acc_get_device_num, acc_async_test
- public :: acc_async_test_all, acc_wait, acc_wait_async, acc_wait_all
- public :: acc_wait_all_async, acc_init, acc_shutdown, acc_on_device
+ public :: acc_async_test_all
+ public :: acc_wait, acc_async_wait, acc_wait_async
+ public :: acc_wait_all, acc_async_wait_all, acc_wait_all_async
+ public :: acc_init, acc_shutdown, acc_on_device
public :: acc_copyin, acc_present_or_copyin, acc_pcopyin, acc_create
public :: acc_present_or_create, acc_pcreate, acc_copyout, acc_delete
public :: acc_update_device, acc_update_self, acc_is_present
procedure :: acc_wait_h
end interface
+ ! acc_async_wait is an OpenACC 1.0 compatibility name for acc_wait.
+ interface acc_async_wait
+ procedure :: acc_wait_h
+ end interface
+
interface acc_wait_async
procedure :: acc_wait_async_h
end interface
procedure :: acc_wait_all_h
end interface
+ ! acc_async_wait_all is an OpenACC 1.0 compatibility name for acc_wait_all.
+ interface acc_async_wait_all
+ procedure :: acc_wait_all_h
+ end interface
+
interface acc_wait_all_async
procedure :: acc_wait_all_async_h
end interface
int acc_async_test (int) __GOACC_NOTHROW;
int acc_async_test_all (void) __GOACC_NOTHROW;
void acc_wait (int) __GOACC_NOTHROW;
+void acc_async_wait (int) __GOACC_NOTHROW;
void acc_wait_async (int, int) __GOACC_NOTHROW;
void acc_wait_all (void) __GOACC_NOTHROW;
+void acc_async_wait_all (void) __GOACC_NOTHROW;
void acc_wait_all_async (int) __GOACC_NOTHROW;
void acc_init (acc_device_t) __GOACC_NOTHROW;
void acc_shutdown (acc_device_t) __GOACC_NOTHROW;
end subroutine
end interface
+! acc_async_wait is an OpenACC 1.0 compatibility name for acc_wait.
+ interface acc_async_wait
+ procedure :: acc_wait_h
+ end interface
+
interface acc_wait_async
subroutine acc_wait_async_h (a1, a2)
integer a1, a2
end subroutine
end interface
+! acc_async_wait_all is an OpenACC 1.0 compatibility name for
+! acc_wait_all.
+ interface acc_async_wait_all
+ procedure :: acc_wait_all_h
+ end interface
+
interface acc_wait_all_async
subroutine acc_wait_all_async_h (a)
integer a
+/* Test of reduction on parallel directive (with async). */
+/* See also Fortran variants in "../libgomp.oacc-fortran/par-reduction-2*". */
+
/* { dg-additional-options "-w" } */
#include <assert.h>
#include <openacc.h>
-/* Test of reduction on parallel directive (with async). */
-
int
main (int argc, char *argv[])
{
}
res = GANGS * 5;
- acc_wait (1);
+ acc_async_wait (1);
assert (res == res1);
assert (res == res2);
for (int i = 0; i < GANGS; ++i)
res *= 5;
- acc_wait (1);
+ acc_async_wait_all ();
assert (res == res1);
assert (res == res2);
--- /dev/null
+! Test of reduction on parallel directive (with async).
+! Variant of "../libgomp.oacc-c-c++-common/par-reduction-2.c".
+! Variant using "openacc_lib.h".
+
+! { dg-do run }
+
+ PROGRAM MAIN
+ IMPLICIT NONE
+ INCLUDE "openacc_lib.h"
+
+ INTEGER RES, RES1, RES2
+
+ RES1 = 0
+ RES2 = 0
+
+!$ACC PARALLEL NUM_GANGS(256) NUM_WORKERS(32) VECTOR_LENGTH(32)
+!$ACC& REDUCTION(+:RES1) COPY(RES1, RES2) ASYNC(1)
+ res1 = res1 + 5
+
+!$ACC ATOMIC
+ res2 = res2 + 5
+!$ACC END PARALLEL
+
+ IF (ACC_GET_DEVICE_TYPE () .EQ. ACC_DEVICE_HOST) THEN
+ RES = 1 * 5
+ ELSE
+ RES = 256 * 5
+ END IF
+
+ CALL ACC_ASYNC_WAIT (1)
+
+ IF (RES .NE. RES1) CALL ABORT
+ IF (RES .NE. RES2) CALL ABORT
+
+ RES1 = 1
+ RES2 = 1
+
+!$ACC PARALLEL NUM_GANGS(8) NUM_WORKERS(32) VECTOR_LENGTH(32)
+!$ACC& REDUCTION(*:RES1) COPY(RES1, RES2) ASYNC(1)
+ res1 = res1 * 5
+
+!$ACC ATOMIC
+ res2 = res2 * 5
+!$ACC END PARALLEL
+
+ IF (ACC_GET_DEVICE_TYPE () .EQ. ACC_DEVICE_HOST) THEN
+ RES = 5 ** 1
+ ELSE
+ RES = 5 ** 8
+ END IF
+
+ CALL ACC_ASYNC_WAIT_ALL
+
+ IF (RES .NE. RES1) CALL ABORT
+ IF (RES .NE. RES2) CALL ABORT
+
+ END PROGRAM
--- /dev/null
+! Test of reduction on parallel directive (with async).
+! Variant of "../libgomp.oacc-c-c++-common/par-reduction-2.c".
+! Variant using the "openacc" module.
+
+! { dg-do run }
+
+ PROGRAM MAIN
+ USE OPENACC
+ IMPLICIT NONE
+
+ INTEGER RES, RES1, RES2
+
+ RES1 = 0
+ RES2 = 0
+
+!$ACC PARALLEL NUM_GANGS(256) NUM_WORKERS(32) VECTOR_LENGTH(32)
+!$ACC& REDUCTION(+:RES1) COPY(RES1, RES2) ASYNC(1)
+ res1 = res1 + 5
+
+!$ACC ATOMIC
+ res2 = res2 + 5
+!$ACC END PARALLEL
+
+ IF (ACC_GET_DEVICE_TYPE () .EQ. ACC_DEVICE_HOST) THEN
+ RES = 1 * 5
+ ELSE
+ RES = 256 * 5
+ END IF
+
+ CALL ACC_ASYNC_WAIT (1)
+
+ IF (RES .NE. RES1) CALL ABORT
+ IF (RES .NE. RES2) CALL ABORT
+
+ RES1 = 1
+ RES2 = 1
+
+!$ACC PARALLEL NUM_GANGS(8) NUM_WORKERS(32) VECTOR_LENGTH(32)
+!$ACC& REDUCTION(*:RES1) COPY(RES1, RES2) ASYNC(1)
+ res1 = res1 * 5
+
+!$ACC ATOMIC
+ res2 = res2 * 5
+!$ACC END PARALLEL
+
+ IF (ACC_GET_DEVICE_TYPE () .EQ. ACC_DEVICE_HOST) THEN
+ RES = 5 ** 1
+ ELSE
+ RES = 5 ** 8
+ END IF
+
+ CALL ACC_ASYNC_WAIT_ALL
+
+ IF (RES .NE. RES1) CALL ABORT
+ IF (RES .NE. RES2) CALL ABORT
+
+ END PROGRAM