From patchwork Wed May 18 09:02:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tobias Burnus X-Patchwork-Id: 54150 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 806433857348 for ; Wed, 18 May 2022 09:14:48 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id C486D3857428; Wed, 18 May 2022 09:02:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C486D3857428 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.91,234,1647331200"; d="diff'?scan'208";a="76044542" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 18 May 2022 01:02:33 -0800 IronPort-SDR: yinL2aQvaUO5LKwComemSvAvuf4v77r6SByy7/OSJChBhZC/szGyCtJ0xEbsARrwE+Xo3yVnE1 rwlwHKBGCdIb6OQnJLmvNoz4PUdo7XNf6veH/QbAPMB+bXfc7mZFgNPkH5+Ivx8RAULraHLhgz K0UOjItYAGs6762Q0QLuPtzfkBk7arBK0XJlER3IqiAm91xjCVFXF+G9uEE7SK0hvbJQsowx5c IeZDo2NX5WahwbKbSAV7zfgM5NbPoHfwrWPIEzmmcgthd4S+0BhSg9pkJdAH2G+cmHUmVxqe4j EHM= Message-ID: Date: Wed, 18 May 2022 11:02:27 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Subject: [Patch] OpenMP: Add Fortran support for inoutset depend-kind (was: openmp: Add support for inoutset depend-kind) Content-Language: en-US To: Jakub Jelinek , , fortran References: From: Tobias Burnus In-Reply-To: X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-09.mgc.mentorg.com (139.181.222.9) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" On 17.05.22 15:55, Jakub Jelinek via Gcc-patches wrote: > This patch adds support for inoutset depend-kind in depend > clauses. While this patch adds the Fortran FE bits and converts the C/C++ testcase changes for Fortran. Bootstrapped/regtested on x86_64-linux. OK for trunk? Tobias ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955 OpenMP: Add Fortran support for inoutset depend-kind Fortran additions to the C/C++ + ME/libgomp commit r13-556-g2c16eb3157f86ae561468c540caf8eb326106b5f gcc/fortran/ChangeLog: * gfortran.h (enum gfc_omp_depend_op): Add OMP_DEPEND_INOUTSET. (gfc_omp_clauses): Enlarge ENUM_BITFIELD. * dump-parse-tree.cc (show_omp_namelist, show_omp_clauses): Handle 'inoutset' depend modifier. * openmp.cc (gfc_match_omp_clauses, gfc_match_omp_depobj): Likewise. * trans-openmp.cc (gfc_trans_omp_clauses, gfc_trans_omp_depobj): Likewise. libgomp/ChangeLog: * libgomp.texi (OpenMP 5.1): Set 'inoutset' to Y. (OpenMP Context Selectors): Add missing comma. * testsuite/libgomp.fortran/depend-5.f90: Add inoutset test. * testsuite/libgomp.fortran/depend-6.f90: Likewise. * testsuite/libgomp.fortran/depend-7.f90: Likewise. * testsuite/libgomp.fortran/depend-inoutset-1.f90: New test. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/all-memory-1.f90: Add inoutset test. * gfortran.dg/gomp/all-memory-2.f90: Likewise. * gfortran.dg/gomp/depobj-1.f90: Likewise. * gfortran.dg/gomp/depobj-2.f90: Likewise. gcc/fortran/dump-parse-tree.cc | 2 + gcc/fortran/gfortran.h | 3 +- gcc/fortran/openmp.cc | 12 +- gcc/fortran/trans-openmp.cc | 4 + gcc/testsuite/gfortran.dg/gomp/all-memory-1.f90 | 3 + gcc/testsuite/gfortran.dg/gomp/all-memory-2.f90 | 3 + gcc/testsuite/gfortran.dg/gomp/depobj-1.f90 | 3 + gcc/testsuite/gfortran.dg/gomp/depobj-2.f90 | 6 +- libgomp/libgomp.texi | 4 +- libgomp/testsuite/libgomp.fortran/depend-5.f90 | 8 +- libgomp/testsuite/libgomp.fortran/depend-6.f90 | 8 +- libgomp/testsuite/libgomp.fortran/depend-7.f90 | 8 +- .../libgomp.fortran/depend-inoutset-1.f90 | 170 +++++++++++++++++++++ 13 files changed, 221 insertions(+), 13 deletions(-) diff --git a/gcc/fortran/dump-parse-tree.cc b/gcc/fortran/dump-parse-tree.cc index a32992035a2..4e8986bd599 100644 --- a/gcc/fortran/dump-parse-tree.cc +++ b/gcc/fortran/dump-parse-tree.cc @@ -1379,6 +1379,7 @@ show_omp_namelist (int list_type, gfc_omp_namelist *n) case OMP_DEPEND_IN: fputs ("in:", dumpfile); break; case OMP_DEPEND_OUT: fputs ("out:", dumpfile); break; case OMP_DEPEND_INOUT: fputs ("inout:", dumpfile); break; + case OMP_DEPEND_INOUTSET: fputs ("inoutset:", dumpfile); break; case OMP_DEPEND_DEPOBJ: fputs ("depobj:", dumpfile); break; case OMP_DEPEND_MUTEXINOUTSET: fputs ("mutexinoutset:", dumpfile); @@ -1898,6 +1899,7 @@ show_omp_clauses (gfc_omp_clauses *omp_clauses) case OMP_DEPEND_IN: deptype = "IN"; break; case OMP_DEPEND_OUT: deptype = "OUT"; break; case OMP_DEPEND_INOUT: deptype = "INOUT"; break; + case OMP_DEPEND_INOUTSET: deptype = "INOUTSET"; break; case OMP_DEPEND_MUTEXINOUTSET: deptype = "MUTEXINOUTSET"; break; default: gcc_unreachable (); } diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 1bce2833139..5d970bc1df0 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1271,6 +1271,7 @@ enum gfc_omp_depend_op OMP_DEPEND_IN, OMP_DEPEND_OUT, OMP_DEPEND_INOUT, + OMP_DEPEND_INOUTSET, OMP_DEPEND_MUTEXINOUTSET, OMP_DEPEND_DEPOBJ, OMP_DEPEND_SINK_FIRST, @@ -1540,7 +1541,7 @@ typedef struct gfc_omp_clauses ENUM_BITFIELD (gfc_omp_memorder) fail:3; ENUM_BITFIELD (gfc_omp_cancel_kind) cancel:3; ENUM_BITFIELD (gfc_omp_proc_bind_kind) proc_bind:3; - ENUM_BITFIELD (gfc_omp_depend_op) depobj_update:3; + ENUM_BITFIELD (gfc_omp_depend_op) depobj_update:4; ENUM_BITFIELD (gfc_omp_bind_type) bind:2; ENUM_BITFIELD (gfc_omp_at_type) at:2; ENUM_BITFIELD (gfc_omp_severity_type) severity:2; diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc index 3061e5297b7..63fd4dd2767 100644 --- a/gcc/fortran/openmp.cc +++ b/gcc/fortran/openmp.cc @@ -1915,7 +1915,9 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, break; m = MATCH_YES; gfc_omp_depend_op depend_op = OMP_DEPEND_OUT; - if (gfc_match ("inout") == MATCH_YES) + if (gfc_match ("inoutset") == MATCH_YES) + depend_op = OMP_DEPEND_INOUTSET; + else if (gfc_match ("inout") == MATCH_YES) depend_op = OMP_DEPEND_INOUT; else if (gfc_match ("in") == MATCH_YES) depend_op = OMP_DEPEND_IN; @@ -3805,7 +3807,9 @@ gfc_match_omp_depobj (void) if (gfc_match ("update ( ") == MATCH_YES) { c = gfc_get_omp_clauses (); - if (gfc_match ("inout )") == MATCH_YES) + if (gfc_match ("inoutset )") == MATCH_YES) + c->depobj_update = OMP_DEPEND_INOUTSET; + else if (gfc_match ("inout )") == MATCH_YES) c->depobj_update = OMP_DEPEND_INOUT; else if (gfc_match ("in )") == MATCH_YES) c->depobj_update = OMP_DEPEND_IN; @@ -3815,8 +3819,8 @@ gfc_match_omp_depobj (void) c->depobj_update = OMP_DEPEND_MUTEXINOUTSET; else { - gfc_error ("Expected IN, OUT, INOUT, MUTEXINOUTSET followed by " - "%<)%> at %C"); + gfc_error ("Expected IN, OUT, INOUT, INOUTSET or MUTEXINOUTSET " + "followed by %<)%> at %C"); goto error; } } diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc index 7633aee755c..e1907a46d5a 100644 --- a/gcc/fortran/trans-openmp.cc +++ b/gcc/fortran/trans-openmp.cc @@ -2937,6 +2937,9 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, case OMP_DEPEND_INOUT: OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_INOUT; break; + case OMP_DEPEND_INOUTSET: + OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_INOUTSET; + break; case OMP_DEPEND_MUTEXINOUTSET: OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_MUTEXINOUTSET; @@ -5593,6 +5596,7 @@ gfc_trans_omp_depobj (gfc_code *code) case OMP_DEPEND_IN: k = GOMP_DEPEND_IN; break; case OMP_DEPEND_OUT: k = GOMP_DEPEND_OUT; break; case OMP_DEPEND_INOUT: k = GOMP_DEPEND_INOUT; break; + case OMP_DEPEND_INOUTSET: k = GOMP_DEPEND_INOUTSET; break; case OMP_DEPEND_MUTEXINOUTSET: k = GOMP_DEPEND_MUTEXINOUTSET; break; default: gcc_unreachable (); } diff --git a/gcc/testsuite/gfortran.dg/gomp/all-memory-1.f90 b/gcc/testsuite/gfortran.dg/gomp/all-memory-1.f90 index 6d56473b1f3..f8f34f0c887 100644 --- a/gcc/testsuite/gfortran.dg/gomp/all-memory-1.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/all-memory-1.f90 @@ -44,6 +44,9 @@ subroutine f6 !$omp target depend(mutexinoutset : omp_all_memory ) ! { dg-error "'omp_all_memory' used with DEPEND kind other than OUT or INOUT" } ! !$omp end target + !$omp target depend(inoutset : omp_all_memory ) ! { dg-error "'omp_all_memory' used with DEPEND kind other than OUT or INOUT" } + ! !$omp end target + !$omp target depend ( depobj : omp_all_memory) ! { dg-error "'omp_all_memory' used with DEPEND kind other than OUT or INOUT" } !!$omp end target diff --git a/gcc/testsuite/gfortran.dg/gomp/all-memory-2.f90 b/gcc/testsuite/gfortran.dg/gomp/all-memory-2.f90 index f7ee34fedc8..e7d51bef885 100644 --- a/gcc/testsuite/gfortran.dg/gomp/all-memory-2.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/all-memory-2.f90 @@ -45,6 +45,9 @@ subroutine f6 !$omp target depend(mutexinoutset : omp_all_memory ) ! !$omp end target + !$omp target depend(inoutset : omp_all_memory ) + ! !$omp end target + !$omp target depend ( depobj : omp_all_memory) !$omp end target diff --git a/gcc/testsuite/gfortran.dg/gomp/depobj-1.f90 b/gcc/testsuite/gfortran.dg/gomp/depobj-1.f90 index 66cfb61060f..73734bbb07e 100644 --- a/gcc/testsuite/gfortran.dg/gomp/depobj-1.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/depobj-1.f90 @@ -22,4 +22,7 @@ subroutine f1 !$omp task depend(mutexinoutset: a) !$omp end task !$omp depobj(depobj2) destroy + !$omp depobj(depobj1) depend(inoutset: a) + !$omp depobj(depobj1) update(mutexinoutset) + !$omp depobj(depobj1) update(inoutset) end subroutine f1 diff --git a/gcc/testsuite/gfortran.dg/gomp/depobj-2.f90 b/gcc/testsuite/gfortran.dg/gomp/depobj-2.f90 index 3ffd3d5d01b..cb67c3ce9d1 100644 --- a/gcc/testsuite/gfortran.dg/gomp/depobj-2.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/depobj-2.f90 @@ -23,9 +23,9 @@ subroutine f1 !$omp depobj(depobj) depend(mutexinoutset : a) ! OK !$omp depobj(depobj) depend(source) ! { dg-error "DEPEND clause at .1. of OMP DEPOBJ construct shall not have dependence-type SOURCE, SINK or DEPOBJ" } !$omp depobj(depobj) depend(sink : i + 1) ! { dg-error "DEPEND clause at .1. of OMP DEPOBJ construct shall not have dependence-type SOURCE, SINK or DEPOBJ" } - !$omp depobj(depobj) update(source) ! { dg-error "Expected IN, OUT, INOUT, MUTEXINOUTSET followed by '\\)'" } - !$omp depobj(depobj) update(sink) ! { dg-error "Expected IN, OUT, INOUT, MUTEXINOUTSET followed by '\\)'" } - !$omp depobj(depobj) update(depobj) ! { dg-error "Expected IN, OUT, INOUT, MUTEXINOUTSET followed by '\\)'" } + !$omp depobj(depobj) update(source) ! { dg-error "Expected IN, OUT, INOUT, INOUTSET or MUTEXINOUTSET followed by '\\)'" } + !$omp depobj(depobj) update(sink) ! { dg-error "Expected IN, OUT, INOUT, INOUTSET or MUTEXINOUTSET followed by '\\)'" } + !$omp depobj(depobj) update(depobj) ! { dg-error "Expected IN, OUT, INOUT, INOUTSET or MUTEXINOUTSET followed by '\\)'" } ! Valid in OpenMP 5.1: !$omp depobj(depobj5) depend(depobj: depobj3) ! { dg-error "DEPEND clause at .1. of OMP DEPOBJ construct shall not have dependence-type SOURCE, SINK or DEPOBJ" } diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi index 9f40bae1247..c9d01cd8a5c 100644 --- a/libgomp/libgomp.texi +++ b/libgomp/libgomp.texi @@ -306,7 +306,7 @@ The OpenMP 4.5 specification is fully supported. @item @code{nowait} clause in @code{taskwait} directive @tab N @tab @item Extensions to the @code{atomic} directive @tab Y @tab @item @code{seq_cst} clause on a @code{flush} construct @tab Y @tab -@item @code{inoutset} argument to the @code{depend} clause @tab N @tab +@item @code{inoutset} argument to the @code{depend} clause @tab Y @tab @item @code{private} and @code{firstprivate} argument to @code{default} clause in C and C++ @tab Y @tab @item @code{present} argument to @code{defaultmap} clause @tab N @tab @@ -4279,7 +4279,7 @@ The following sections present notes on the offload-target specifics. @code{i586}, @code{i686}, @code{ia32} @tab @code{host} @tab See @code{-m...} flags in ``x86 Options'' (without @code{-m}) -@item @code{amdgcn} @code{gcn} +@item @code{amdgcn}, @code{gcn} @tab @code{gpu} @tab See @code{-march=} in ``AMD GCN Options'' @item @code{nvptx} diff --git a/libgomp/testsuite/libgomp.fortran/depend-5.f90 b/libgomp/testsuite/libgomp.fortran/depend-5.f90 index a350e793623..b812b6dab53 100644 --- a/libgomp/testsuite/libgomp.fortran/depend-5.f90 +++ b/libgomp/testsuite/libgomp.fortran/depend-5.f90 @@ -59,6 +59,12 @@ subroutine test (ifval) call usleep (5000) b(4) = 48 end block + !$omp task shared(b) depend(inoutset: b(5)) + block + call usleep (5000) + b(5) = 49 + end block + ! None of the above tasks depend on each other. ! The following task depends on all but the a(4) = 46; one. !$omp task shared(a, b) depend(out: omp_all_memory) private(i) if(ifval) @@ -66,7 +72,7 @@ subroutine test (ifval) if (a(0) /= 42 .or. a(1) /= 43 .or. a(2) /= 44 .or. a(3) /= 45 & .or. a(5) /= 5 .or. a(6) /= 6 .or. a(7) /= 7 & .or. b(0) /= 47 .or. b(1) /= 2 .or. b(2) /= 4 .or. b(3) /= 6 & - .or. b(4) /= 48 .or. b(5) /= 10 .or. b(6) /= 12 .or. b(7) /= 14) & + .or. b(4) /= 48 .or. b(5) /= 49 .or. b(6) /= 12 .or. b(7) /= 14) & error stop do i = 0, 7 if (i /= 4) & diff --git a/libgomp/testsuite/libgomp.fortran/depend-6.f90 b/libgomp/testsuite/libgomp.fortran/depend-6.f90 index edea8571bba..b5032e98a2f 100644 --- a/libgomp/testsuite/libgomp.fortran/depend-6.f90 +++ b/libgomp/testsuite/libgomp.fortran/depend-6.f90 @@ -62,6 +62,12 @@ subroutine test (ifval) call usleep (5000) b(4) = 48 end block + !$omp task shared(b) depend(inoutset: b(5)) + block + call usleep (5000) + b(5) = 49 + end block + ! None of the above tasks depend on each other. ! The following task depends on all but the a(4) = 46; one. !$omp task shared(a, b) depend(depobj: d1) private(i) if(ifval) @@ -69,7 +75,7 @@ subroutine test (ifval) if (a(0) /= 42 .or. a(1) /= 43 .or. a(2) /= 44 .or. a(3) /= 45 & .or. a(5) /= 5 .or. a(6) /= 6 .or. a(7) /= 7 & .or. b(0) /= 47 .or. b(1) /= 2 .or. b(2) /= 4 .or. b(3) /= 6 & - .or. b(4) /= 48 .or. b(5) /= 10 .or. b(6) /= 12 .or. b(7) /= 14) & + .or. b(4) /= 48 .or. b(5) /= 49 .or. b(6) /= 12 .or. b(7) /= 14) & error stop do i = 0, 7 if (i /= 4) & diff --git a/libgomp/testsuite/libgomp.fortran/depend-7.f90 b/libgomp/testsuite/libgomp.fortran/depend-7.f90 index d3f3988f0da..771a59c50f0 100644 --- a/libgomp/testsuite/libgomp.fortran/depend-7.f90 +++ b/libgomp/testsuite/libgomp.fortran/depend-7.f90 @@ -57,6 +57,12 @@ program main call usleep (5000) b(4) = 48 end block + !$omp task shared(b) depend(inoutset: b(5)) + block + call usleep (5000) + b(5) = 49 + end block + ! None of the above tasks depend on each other. ! The following task depends on all but the a(4) = 46; one. !$omp task shared(a, b) depend(iterator (j=0:7), inout: omp_all_memory) private(i) @@ -64,7 +70,7 @@ program main if (a(0) /= 42 .or. a(1) /= 43 .or. a(2) /= 44 .or. a(3) /= 45 & .or. a(5) /= 5 .or. a(6) /= 6 .or. a(7) /= 7 & .or. b(0) /= 47 .or. b(1) /= 2 .or. b(2) /= 4 .or. b(3) /= 6 & - .or. b(4) /= 48 .or. b(5) /= 10 .or. b(6) /= 12 .or. b(7) /= 14) & + .or. b(4) /= 48 .or. b(5) /= 49 .or. b(6) /= 12 .or. b(7) /= 14) & error stop do i = 0, 7 if (i /= 4) & diff --git a/libgomp/testsuite/libgomp.fortran/depend-inoutset-1.f90 b/libgomp/testsuite/libgomp.fortran/depend-inoutset-1.f90 new file mode 100644 index 00000000000..46161c36cd2 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/depend-inoutset-1.f90 @@ -0,0 +1,170 @@ +! { dg-additional-sources my-usleep.c } +! { dg-prune-output "command-line option '-fintrinsic-modules-path=.*' is valid for Fortran but not for C" } + +program main + use omp_lib + implicit none (type, external) + + interface + subroutine usleep(t) bind(C, name="my_usleep") + use iso_c_binding + integer(c_int), value :: t + end subroutine + end interface + + integer :: a(0:7) = 0 + integer(omp_depend_kind) :: d1, d2 + + !$omp depobj (d1) depend(inoutset: a) + !$omp depobj (d2) depend(inout: a) + !$omp depobj (d2) update(inoutset) + + !$omp parallel + !$omp barrier + !$omp master + !$omp task shared(a) depend(out: a) + block + call usleep (5000) + a(0) = 1; a(1) = 2; a(2) = 3; a(3) = 4 + end block + ! The above task needs to finish first. + !$omp task shared(a) depend(in: a) + block + if (a(0) /= 1 .or. a(1) /= 2 .or. a(2) /= 3 .or. a(3) /= 4) & + error stop + call usleep (5000) + a(4) = 42 + end block + !$omp task shared(a) depend(in: a) + block + if (a(0) /= 1 .or. a(1) /= 2 .or. a(2) /= 3 .or. a(3) /= 4) & + error stop + call usleep (5000); + a(5) = 43 + end block + !$omp task shared(a) depend(in: a) + block + if (a(0) /= 1 .or. a(1) /= 2 .or. a(2) /= 3 .or. a(3) /= 4) & + error stop + call usleep (5000) + a(6) = 44 + end block + !$omp task shared(a) depend(in: a) + block + if (a(0) /= 1 .or. a(1) /= 2 .or. a(2) /= 3 .or. a(3) /= 4) & + error stop + call usleep (5000) + a(7) = 45 + end block + ! The above 4 tasks can be scheduled in any order but need to wait + ! for the depend(out: a) task. + !$omp task shared(a) depend(inoutset: a) + block + if (a(4) /= 42 .or. a(5) /= 43 .or. a(6) /= 44 .or. a(7) /= 45) & + error stop + call usleep (5000) + a(0) = 42 + end block + !$omp task shared(a) depend(iterator(i=1:3:2), inoutset: a) + block + if (a(4) /= 42 .or. a(5) /= 43 .or. a(6) /= 44 .or. a(7) /= 45) & + error stop + call usleep (5000) + a(1) = 43 + end block + !$omp task shared(a) depend(depobj: d1) + block + if (a(4) /= 42 .or. a(5) /= 43 .or. a(6) /= 44 .or. a(7) /= 45) & + error stop + call usleep (5000) + a(2) = 44 + end block + !$omp task shared(a) depend(depobj: d2) + block + if (a(4) /= 42 .or. a(5) /= 43 .or. a(6) /= 44 .or. a(7) /= 45) & + error stop + call usleep (5000) + a(3) = 45 + end block + ! The above 4 tasks can be scheduled in any order but need to wait + ! for all the above depend(in: a) tasks. + !$omp task shared(a) depend(in: a) + block + if (a(0) /= 42 .or. a(1) /= 43 .or. a(2) /= 44 .or. a(3) /= 45) & + error stop + call usleep (5000) + a(4) = 46 + end block + !$omp task shared(a) depend(in: a) + block + if (a(0) /= 42 .or. a(1) /= 43 .or. a(2) /= 44 .or. a(3) /= 45) & + error stop + call usleep (5000) + a(5) = 47 + end block + !$omp task shared(a) depend(in: a) + block + if (a(0) /= 42 .or. a(1) /= 43 .or. a(2) /= 44 .or. a(3) /= 45) & + error stop + call usleep (5000) + a(6) = 48 + end block + !$omp task shared(a) depend(in: a) + block + if (a(0) /= 42 .or. a(1) /= 43 .or. a(2) /= 44 .or. a(3) /= 45) & + error stop + call usleep (5000) + a(7) = 49 + end block + ! The above 4 tasks can be scheduled in any order but need to wait + ! for all the above depend(inoutset: a), + ! depend(iterator(i=1:3:2), inoutset: a), depend(depobj: d1) and + ! depend(depobj: d2) tasks. + !$omp task shared(a) depend(inoutset: a) + block + if (a(4) /= 46.or. a(5) /= 47 .or. a(6) /= 48 .or. a(7) /= 49) & + error stop + call usleep (5000) + a(0) = 50 + end block + ! The above task needs to wait for all the above 4 depend(in: a) + ! tasks. + !$omp task shared(a) depend(out: a) + block + if (a(0) /= 50 .or. a(4) /= 46.or. a(5) /= 47 .or. a(6) /= 48 .or. a(7) /= 49) & + error stop + call usleep (5000) + a(0) = 51 + end block + ! The above task needs to wait for the above depend(inoutset: a) task. + !$omp task shared(a) depend(inoutset: a) + block + if (a(0) /= 51 .or. a(4) /= 46.or. a(5) /= 47 .or. a(6) /= 48 .or. a(7) /= 49) & + error stop + call usleep (5000) + a(0) = 52 + end block + ! The above task needs to wait for the above depend(out: a) task. + !$omp task shared(a) depend(mutexinoutset: a) + block + if (a(0) /= 52 .or. a(4) /= 46.or. a(5) /= 47 .or. a(6) /= 48 .or. a(7) /= 49) & + error stop + call usleep (5000) + a(0) = 53 + end block + ! The above task needs to wait for the above depend(inoutset: a) task. + !$omp task shared(a) depend(inoutset: a) + block + if (a(0) /= 53 .or. a(4) /= 46.or. a(5) /= 47 .or. a(6) /= 48 .or. a(7) /= 49) & + error stop + call usleep (5000) + a(0) = 54 + end block + ! The above task needs to wait for the above + ! depend(mutexinoutset: a) task. + !$omp end master + !$omp end parallel + if (a(0) /= 54 .or. a(1) /= 43 .or. a(2) /= 44 .or. a(3) /= 45 & + .or. a(4) /= 46.or. a(5) /= 47 .or. a(6) /= 48 .or. a(7) /= 49) & + error stop +end