Commit 7ce64403 by Thomas Schwinge Committed by Thomas Schwinge

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
parent 318686c2
2017-05-24 Thomas Schwinge <thomas@codesourcery.com> 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 * openacc_lib.h (acc_pcopyin, acc_pcreate): Route to
acc_present_or_copyin and acc_present_or_create procedures, acc_present_or_copyin and acc_present_or_create procedures,
respectively. respectively.
......
...@@ -380,6 +380,8 @@ OACC_2.0 { ...@@ -380,6 +380,8 @@ OACC_2.0 {
OACC_2.0.1 { OACC_2.0.1 {
global: global:
acc_async_wait;
acc_async_wait_all;
acc_pcopyin; acc_pcopyin;
acc_pcreate; acc_pcreate;
} OACC_2.0; } OACC_2.0;
......
...@@ -2095,12 +2095,15 @@ specified in @var{arg}. ...@@ -2095,12 +2095,15 @@ specified in @var{arg}.
@item @emph{C/C++}: @item @emph{C/C++}:
@multitable @columnfractions .20 .80 @multitable @columnfractions .20 .80
@item @emph{Prototype}: @tab @code{acc_wait(arg);} @item @emph{Prototype}: @tab @code{acc_wait(arg);}
@item @emph{Prototype (OpenACC 1.0 compatibility)}: @tab @code{acc_async_wait(arg);}
@end multitable @end multitable
@item @emph{Fortran}: @item @emph{Fortran}:
@multitable @columnfractions .20 .80 @multitable @columnfractions .20 .80
@item @emph{Interface}: @tab @code{subroutine acc_wait(arg)} @item @emph{Interface}: @tab @code{subroutine acc_wait(arg)}
@item @tab @code{integer(acc_handle_kind) 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 @end multitable
@item @emph{Reference}: @item @emph{Reference}:
...@@ -2119,11 +2122,13 @@ This function waits for the completion of all asynchronous operations. ...@@ -2119,11 +2122,13 @@ This function waits for the completion of all asynchronous operations.
@item @emph{C/C++}: @item @emph{C/C++}:
@multitable @columnfractions .20 .80 @multitable @columnfractions .20 .80
@item @emph{Prototype}: @tab @code{acc_wait_all(void);} @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 @end multitable
@item @emph{Fortran}: @item @emph{Fortran}:
@multitable @columnfractions .20 .80 @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 @end multitable
@item @emph{Reference}: @item @emph{Reference}:
......
...@@ -70,6 +70,17 @@ acc_wait (int async) ...@@ -70,6 +70,17 @@ acc_wait (int async)
thr->dev->openacc.async_wait_func (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 void
acc_wait_async (int async1, int async2) acc_wait_async (int async1, int async2)
{ {
...@@ -92,6 +103,17 @@ acc_wait_all (void) ...@@ -92,6 +103,17 @@ acc_wait_all (void)
thr->dev->openacc.async_wait_all_func (); 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 void
acc_wait_all_async (int async) acc_wait_all_async (int async)
{ {
......
...@@ -470,8 +470,10 @@ module openacc ...@@ -470,8 +470,10 @@ module openacc
public :: acc_get_num_devices, acc_set_device_type, acc_get_device_type 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_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_async_test_all
public :: acc_wait_all_async, acc_init, acc_shutdown, acc_on_device 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_copyin, acc_present_or_copyin, acc_pcopyin, acc_create
public :: acc_present_or_create, acc_pcreate, acc_copyout, acc_delete public :: acc_present_or_create, acc_pcreate, acc_copyout, acc_delete
public :: acc_update_device, acc_update_self, acc_is_present public :: acc_update_device, acc_update_self, acc_is_present
...@@ -510,6 +512,11 @@ module openacc ...@@ -510,6 +512,11 @@ module openacc
procedure :: acc_wait_h procedure :: acc_wait_h
end interface 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 interface acc_wait_async
procedure :: acc_wait_async_h procedure :: acc_wait_async_h
end interface end interface
...@@ -518,6 +525,11 @@ module openacc ...@@ -518,6 +525,11 @@ module openacc
procedure :: acc_wait_all_h procedure :: acc_wait_all_h
end interface 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 interface acc_wait_all_async
procedure :: acc_wait_all_async_h procedure :: acc_wait_all_async_h
end interface end interface
......
...@@ -75,8 +75,10 @@ int acc_get_device_num (acc_device_t) __GOACC_NOTHROW; ...@@ -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 (int) __GOACC_NOTHROW;
int acc_async_test_all (void) __GOACC_NOTHROW; int acc_async_test_all (void) __GOACC_NOTHROW;
void acc_wait (int) __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_async (int, int) __GOACC_NOTHROW;
void acc_wait_all (void) __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_wait_all_async (int) __GOACC_NOTHROW;
void acc_init (acc_device_t) __GOACC_NOTHROW; void acc_init (acc_device_t) __GOACC_NOTHROW;
void acc_shutdown (acc_device_t) __GOACC_NOTHROW; void acc_shutdown (acc_device_t) __GOACC_NOTHROW;
......
...@@ -108,6 +108,11 @@ ...@@ -108,6 +108,11 @@
end subroutine end subroutine
end interface 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 interface acc_wait_async
subroutine acc_wait_async_h (a1, a2) subroutine acc_wait_async_h (a1, a2)
integer a1, a2 integer a1, a2
...@@ -119,6 +124,12 @@ ...@@ -119,6 +124,12 @@
end subroutine end subroutine
end interface 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 interface acc_wait_all_async
subroutine acc_wait_all_async_h (a) subroutine acc_wait_all_async_h (a)
integer 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" } */ /* { dg-additional-options "-w" } */
#include <assert.h> #include <assert.h>
#include <openacc.h> #include <openacc.h>
/* Test of reduction on parallel directive (with async). */
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
...@@ -25,7 +26,7 @@ main (int argc, char *argv[]) ...@@ -25,7 +26,7 @@ main (int argc, char *argv[])
} }
res = GANGS * 5; res = GANGS * 5;
acc_wait (1); acc_async_wait (1);
assert (res == res1); assert (res == res1);
assert (res == res2); assert (res == res2);
...@@ -49,7 +50,7 @@ main (int argc, char *argv[]) ...@@ -49,7 +50,7 @@ main (int argc, char *argv[])
for (int i = 0; i < GANGS; ++i) for (int i = 0; i < GANGS; ++i)
res *= 5; res *= 5;
acc_wait (1); acc_async_wait_all ();
assert (res == res1); assert (res == res1);
assert (res == res2); assert (res == res2);
......
! 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
! 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment