From patchwork Wed May 24 11:47:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Schwinge X-Patchwork-Id: 766445 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wXrHj4X6lz9sNH for ; Wed, 24 May 2017 21:48:00 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="rMcdtNTq"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:in-reply-to:references:date:message-id:mime-version :content-type:content-transfer-encoding; q=dns; s=default; b=d1M asPriwQAI73P1CHJ2KHyJuS4hKeJCc8TKztzsYq7PvGeHtVKA+5UbqjH84W0jvxi RIS99JXjbMZh7PWCqnmvPNQ804a1LKtbbryb1nvYYYQX9sUhVK/Xsb/Gg1xiqi0C OIftRofgIOZSRxkPIy+Jwl95z2ePZJbfc29srOYI= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:in-reply-to:references:date:message-id:mime-version :content-type:content-transfer-encoding; s=default; bh=pXMIqeTsx WH41bhegV4Iw6N4dUA=; b=rMcdtNTq6QbpTxmp+maS7/t/I0A4lbR1zFRbKZvC7 FcPJ10qqLTuaMLMVEeOcG5A8vNGUcHn+5506bPW6oB/8yrXeZu21rs6eqiS1grdj 3q9NNMFhY52lw8d08qj7m+lNsHwP8QtVx3/nc3ScVXpE0AvDS0ZzJwfi1mWDhvDi /s= Received: (qmail 2713 invoked by alias); 24 May 2017 11:47:43 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 2694 invoked by uid 89); 24 May 2017 11:47:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS, URIBL_RED autolearn=ham version=3.3.2 spammy=THEN X-Spam-User: qpsmtpd, 2 recipients X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 24 May 2017 11:47:40 +0000 Received: from svr-orw-mbx-05.mgc.mentorg.com ([147.34.90.205]) by relay1.mentorg.com with esmtp id 1dDUlS-0007eO-2M from Thomas_Schwinge@mentor.com ; Wed, 24 May 2017 04:47:42 -0700 Received: from hertz.schwinge.homeip.net (137.202.0.87) by SVR-ORW-MBX-05.mgc.mentorg.com (147.34.90.205) with Microsoft SMTP Server (TLS) id 15.0.1210.3; Wed, 24 May 2017 04:47:39 -0700 From: Thomas Schwinge To: Jakub Jelinek , , Subject: Re: OpenACC 1.0 compatibility: acc_async_wait, acc_async_wait_all In-Reply-To: <20170523111726.GT8499@tucnak> References: <87r3ygyz9t.fsf@schwinge.name> <8737bwzt2p.fsf@hertz.schwinge.homeip.net> <20170523111726.GT8499@tucnak> User-Agent: Notmuch/0.9-101-g81dad07 (http://notmuchmail.org) Emacs/24.5.1 (x86_64-pc-linux-gnu) Date: Wed, 24 May 2017 13:47:34 +0200 Message-ID: <87shjuwk6h.fsf@hertz.schwinge.homeip.net> MIME-Version: 1.0 X-ClientProxiedBy: svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) To SVR-ORW-MBX-05.mgc.mentorg.com (147.34.90.205) Hi Jakub! On Tue, 23 May 2017 13:17:26 +0200, Jakub Jelinek wrote: > On Mon, May 22, 2017 at 07:42:38PM +0200, Thomas Schwinge wrote: > > For OpenACC 1.0 compatibility, we need to provide the aliases > > acc_async_wait, and acc_async_wait_all for acc_wait, and acc_wait_all, > > respectively. > > OpenACC 1.0 compatibility: acc_async_wait, acc_async_wait_all > All I've said about acc_pcopyin applies here too. Obviously. ;-) > Except that OACC_1.0 > as symbol version might look like a good idea here. GCC never implemented OpenACC 1.0 but directly started with 2.0a, so I would find it confusing to now starting using 1.0 versions for these symbols specifically. OK for trunk using "OACC_2.0.1" symbol version? commit 5c0da4609b29a406601c2dd92f8dbff2f448bc1d Author: Thomas Schwinge Date: Wed May 24 12:49:19 2017 +0200 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. --- libgomp/libgomp.map | 2 + libgomp/libgomp.texi | 7 ++- libgomp/oacc-async.c | 22 +++++++++ libgomp/openacc.f90 | 16 +++++- libgomp/openacc.h | 2 + libgomp/openacc_lib.h | 11 +++++ .../libgomp.oacc-c-c++-common/par-reduction-2.c | 9 ++-- .../libgomp.oacc-fortran/par-reduction-2-1.f | 57 ++++++++++++++++++++++ .../libgomp.oacc-fortran/par-reduction-2-2.f | 57 ++++++++++++++++++++++ 9 files changed, 176 insertions(+), 7 deletions(-) Grüße Thomas diff --git libgomp/libgomp.map libgomp/libgomp.map index b43c6de..f9044ae 100644 --- libgomp/libgomp.map +++ 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 libgomp/libgomp.texi libgomp/libgomp.texi index cc5ee1c..230720f 100644 --- libgomp/libgomp.texi +++ 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 libgomp/oacc-async.c libgomp/oacc-async.c index b68c84d..1334f99 100644 --- libgomp/oacc-async.c +++ 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 libgomp/openacc.f90 libgomp/openacc.f90 index a4422d4..0eb34ff 100644 --- libgomp/openacc.f90 +++ 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 libgomp/openacc.h libgomp/openacc.h index ebccb18..137e2c1 100644 --- libgomp/openacc.h +++ 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 libgomp/openacc_lib.h libgomp/openacc_lib.h index 7818bd7..289b551 100644 --- libgomp/openacc_lib.h +++ 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 libgomp/testsuite/libgomp.oacc-c-c++-common/par-reduction-2.c libgomp/testsuite/libgomp.oacc-c-c++-common/par-reduction-2.c index 911b76c..5ab52e9 100644 --- libgomp/testsuite/libgomp.oacc-c-c++-common/par-reduction-2.c +++ 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 libgomp/testsuite/libgomp.oacc-fortran/par-reduction-2-1.f libgomp/testsuite/libgomp.oacc-fortran/par-reduction-2-1.f new file mode 100644 index 0000000..dcd6592 --- /dev/null +++ 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 libgomp/testsuite/libgomp.oacc-fortran/par-reduction-2-2.f libgomp/testsuite/libgomp.oacc-fortran/par-reduction-2-2.f new file mode 100644 index 0000000..bf72002 --- /dev/null +++ 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