From: Thomas Schwinge Date: Wed, 24 May 2017 13:25:01 +0000 (+0200) Subject: OpenACC 1.0 compatibility: acc_async_wait, acc_async_wait_all X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7ce6440371a57a4c23eff770056e7b24aa30b204;p=gcc.git OpenACC 1.0 compatibility: acc_async_wait, acc_async_wait_all libgomp/ * 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. From-SVN: r248413 --- diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 55869d2bfbc..8adc10b3614 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,5 +1,17 @@ 2017-05-24 Thomas Schwinge + * 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. diff --git a/libgomp/libgomp.map b/libgomp/libgomp.map index b43c6deb851..f9044ae273b 100644 --- a/libgomp/libgomp.map +++ b/libgomp/libgomp.map @@ -380,6 +380,8 @@ OACC_2.0 { OACC_2.0.1 { global: + acc_async_wait; + acc_async_wait_all; acc_pcopyin; acc_pcreate; } OACC_2.0; diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi index cc5ee1cd6b1..230720f94b4 100644 --- a/libgomp/libgomp.texi +++ b/libgomp/libgomp.texi @@ -2095,12 +2095,15 @@ specified in @var{arg}. @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}: @@ -2119,11 +2122,13 @@ This function waits for the completion of all asynchronous operations. @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}: diff --git a/libgomp/oacc-async.c b/libgomp/oacc-async.c index b68c84d641b..1334f99b410 100644 --- a/libgomp/oacc-async.c +++ b/libgomp/oacc-async.c @@ -70,6 +70,17 @@ acc_wait (int async) 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) { @@ -92,6 +103,17 @@ acc_wait_all (void) 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) { diff --git a/libgomp/openacc.f90 b/libgomp/openacc.f90 index a4422d4fb77..0eb34fff734 100644 --- a/libgomp/openacc.f90 +++ b/libgomp/openacc.f90 @@ -470,8 +470,10 @@ module openacc 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 @@ -510,6 +512,11 @@ module openacc 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 @@ -518,6 +525,11 @@ module openacc 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 diff --git a/libgomp/openacc.h b/libgomp/openacc.h index ebccb1856d7..137e2c1f7be 100644 --- a/libgomp/openacc.h +++ b/libgomp/openacc.h @@ -75,8 +75,10 @@ int acc_get_device_num (acc_device_t) __GOACC_NOTHROW; 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; diff --git a/libgomp/openacc_lib.h b/libgomp/openacc_lib.h index 7818bd7efad..289b5512bcc 100644 --- a/libgomp/openacc_lib.h +++ b/libgomp/openacc_lib.h @@ -108,6 +108,11 @@ 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 @@ -119,6 +124,12 @@ 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 diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/par-reduction-2.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/par-reduction-2.c index 911b76cc9be..5ab52e97009 100644 --- a/libgomp/testsuite/libgomp.oacc-c-c++-common/par-reduction-2.c +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/par-reduction-2.c @@ -1,10 +1,11 @@ +/* Test of reduction on parallel directive (with async). */ +/* See also Fortran variants in "../libgomp.oacc-fortran/par-reduction-2*". */ + /* { dg-additional-options "-w" } */ #include #include -/* Test of reduction on parallel directive (with async). */ - int main (int argc, char *argv[]) { @@ -25,7 +26,7 @@ main (int argc, char *argv[]) } res = GANGS * 5; - acc_wait (1); + acc_async_wait (1); assert (res == res1); assert (res == res2); @@ -49,7 +50,7 @@ main (int argc, char *argv[]) for (int i = 0; i < GANGS; ++i) res *= 5; - acc_wait (1); + acc_async_wait_all (); assert (res == res1); assert (res == res2); diff --git a/libgomp/testsuite/libgomp.oacc-fortran/par-reduction-2-1.f b/libgomp/testsuite/libgomp.oacc-fortran/par-reduction-2-1.f new file mode 100644 index 00000000000..dcd65928685 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/par-reduction-2-1.f @@ -0,0 +1,57 @@ +! 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 diff --git a/libgomp/testsuite/libgomp.oacc-fortran/par-reduction-2-2.f b/libgomp/testsuite/libgomp.oacc-fortran/par-reduction-2-2.f new file mode 100644 index 00000000000..bf72002dd20 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/par-reduction-2-2.f @@ -0,0 +1,57 @@ +! 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