mirror of git://gcc.gnu.org/git/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
This commit is contained in:
parent
318686c21a
commit
7ce6440371
|
@ -1,5 +1,17 @@
|
||||||
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 {
|
||||||
|
|
||||||
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}.
|
||||||
@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.
|
||||||
@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)
|
||||||
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)
|
||||||
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
|
||||||
|
|
||||||
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
|
||||||
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
|
||||||
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;
|
||||||
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 @@
|
||||||
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 @@
|
||||||
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
|
||||||
|
|
|
@ -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" } */
|
/* { 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[])
|
||||||
}
|
}
|
||||||
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[])
|
||||||
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);
|
||||||
|
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue