From patchwork Thu Nov 3 13:35:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tobias Burnus X-Patchwork-Id: 14874 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp535795wru; Thu, 3 Nov 2022 06:36:08 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6ZbTZDj9u7+uSvBLcthba2jEFPQqJBvJF44qv0y4flpRmua8DRXIHn93POm+iZmlOo3lmT X-Received: by 2002:a17:906:846a:b0:7ad:84cd:f2a9 with SMTP id hx10-20020a170906846a00b007ad84cdf2a9mr28686395ejc.244.1667482567854; Thu, 03 Nov 2022 06:36:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667482567; cv=none; d=google.com; s=arc-20160816; b=RtAS9JU84aUuc09X23+Dd7u3Yf+EurwCglArKwylgb3paHWMpT27eh83+Zu7yvPasH +1LwWnox9SvOxh0R0maYIUMxhbep7sglksjq3mZms329rpyQTM523yfbYmt7RcNBBoe3 WIcVn/1NfCMgi1UzXgHwRhdTgWoYoXycp+Sbnr854hgCUQtUVsvwi41G8EvLaSJ4wp2U H+ckKNylVKfUQgIGQl/091Yj0LtPFx0h4tzxQx0kwBVw/wO9zf46mkCJss9CDhPXoriF OVAqtd6BSukzKUr/Ju/OIEiiw/p6IDEGB4V8FxVqjB3MZmbPmXMks2GmMCTROY7yaY/i 2MNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :ironport-sdr:dmarc-filter:delivered-to; bh=HLHNq05Izja91uZmWwkepjWpHU1+NasC9o1wORoHIFU=; b=B67xLgGf+NGnhZmwMQpvAtoWHhcyOqc8CNKPtv7GP9rHlZnMRMtTJ7JJutJ75/GkGO Oz9KgnKG828wCkTqoZQTP4PvSIV75oqxLk3IEoQkDUVftRIfXbwmnSrQSnyEEGcWMxqT 9yj0XP6QuBmOpYgfm/I1j0PxkVOlWhnh6NCIXuzs74xPrk89mXNWaLAjk/3mrShoElIG NrFIkXxSCihuqRMDTKeiIpyWSR/bIoq6wTijvro+odydBMML1+i44k79vG+4qTMzzq7b EL1nf4Z+/+BsFiISiDHv1HQ1hkCQleu7+w1HPX1N2Nopx1zo7H8Bhm2N7Mx51hcZeFW+ yEMg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id fy2-20020a1709069f0200b0078d4a0c77f9si1067973ejc.458.2022.11.03.06.36.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Nov 2022 06:36:07 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D7C413858438 for ; Thu, 3 Nov 2022 13:35:57 +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 875143858D26; Thu, 3 Nov 2022 13:35:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 875143858D26 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.96,235,1665475200"; d="diff'?scan'208";a="86003411" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa4.mentor.iphmx.com with ESMTP; 03 Nov 2022 05:35:14 -0800 IronPort-SDR: UV5Tb4aXr0Y/EfbfiFtHrd2arI0tzZjkSZgbGlv9q43b2r9UYW6rJ/RtIw5WIhXLCTkE5loLpQ EfLWVphVerJSpHpiUt9RRXrEp81i7ojwkpDsyLEIW0k68YL0ldddDaajqcCA89L8i07quVeIgm PnFnRYu27ZrpxaBKG3ekoO6w4JS8Yb95n14Uj2TZn+6fKxNnJyZA3Rn+8L0OoZEuBOEG1RSdaq 6kgcKlZRFwrKLUFvE0pAEKOiTYEXhBhc9N3+msuRIcRcZ+iaCCEN2W27mrVDsP2tRHSuBWLLBL ngg= Message-ID: <23585d74-e7dc-10ca-97ac-124a3a513151@codesourcery.com> Date: Thu, 3 Nov 2022 14:35:03 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Subject: [Patch] OpenMP/Fortran: 'target update' with DT components (was: [Patch] OpenMP/Fortran: 'target update' with strides + DT components) Content-Language: en-US To: Jakub Jelinek , Tobias Burnus References: <51e764f7-635f-9754-dc4b-d2cd2b58435d@codesourcery.com> 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, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP 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: , Cc: gcc-patches , fortran Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1748482200980106624?= X-GMAIL-MSGID: =?utf-8?q?1748482200980106624?= On 03.11.22 13:44, Jakub Jelinek wrote: > [...] > Otherwise LGTM, assuming it actually works correctly. > > I don't remember support for non-contiguous copying to/from devices > being actually added, [...] And I think it is not ok to copy bytes > that aren't requested to be copied. I have now removed that stride support and only kept the bug fix and the DT component parts of the patch. The only code change is to remove the stride check disabling in openmp.cc and in one testcase, to remove the stride part. I will commit it as attached, unless there are further comments (or the just started reg testing shows that something does not work). Tobias PS: For strides, I now filed: PR middle-end/107517 "[OpenMP][5.0] 'target update' with strides — for C/C++ and Fortran" https://gcc.gnu.org/PR107517 ----------------- 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/Fortran: 'target update' with DT components OpenMP 5.0 permits to use arrays with derived type components for the list items to the 'from'/'to' clauses of the 'target update' directive. gcc/fortran/ChangeLog: * openmp.cc (gfc_match_omp_clauses): Permit derived types for the 'to' and 'from' clauses of 'target update'. * trans-openmp.cc (gfc_trans_omp_clauses): Fixes for derived-type changes; fix size for scalars. libgomp/ChangeLog: * testsuite/libgomp.fortran/target-11.f90: New test. * testsuite/libgomp.fortran/target-13.f90: New test. gcc/fortran/openmp.cc | 10 +- gcc/fortran/trans-openmp.cc | 9 +- libgomp/testsuite/libgomp.fortran/target-11.f90 | 75 +++++++++++ libgomp/testsuite/libgomp.fortran/target-13.f90 | 159 ++++++++++++++++++++++++ 4 files changed, 246 insertions(+), 7 deletions(-) diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc index 653c43f79ff..e0e3b52ad57 100644 --- a/gcc/fortran/openmp.cc +++ b/gcc/fortran/openmp.cc @@ -2499,9 +2499,10 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, true) == MATCH_YES) continue; if ((mask & OMP_CLAUSE_FROM) - && gfc_match_omp_variable_list ("from (", + && (gfc_match_omp_variable_list ("from (", &c->lists[OMP_LIST_FROM], false, - NULL, &head, true) == MATCH_YES) + NULL, &head, true, true) + == MATCH_YES)) continue; break; case 'g': @@ -3436,9 +3437,10 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, continue; } else if ((mask & OMP_CLAUSE_TO) - && gfc_match_omp_variable_list ("to (", + && (gfc_match_omp_variable_list ("to (", &c->lists[OMP_LIST_TO], false, - NULL, &head, true) == MATCH_YES) + NULL, &head, true, true) + == MATCH_YES)) continue; break; case 'u': diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc index 9bd4e6c7e1b..4bfdf85cd9b 100644 --- a/gcc/fortran/trans-openmp.cc +++ b/gcc/fortran/trans-openmp.cc @@ -3626,7 +3626,10 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, gcc_unreachable (); } tree node = build_omp_clause (input_location, clause_code); - if (n->expr == NULL || n->expr->ref->u.ar.type == AR_FULL) + if (n->expr == NULL + || (n->expr->ref->type == REF_ARRAY + && n->expr->ref->u.ar.type == AR_FULL + && n->expr->ref->next == NULL)) { tree decl = gfc_trans_omp_variable (n->sym, false); if (gfc_omp_privatize_by_reference (decl)) @@ -3666,13 +3669,13 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, { tree ptr; gfc_init_se (&se, NULL); - if (n->expr->ref->u.ar.type == AR_ELEMENT) + if (n->expr->rank == 0) { gfc_conv_expr_reference (&se, n->expr); ptr = se.expr; gfc_add_block_to_block (block, &se.pre); OMP_CLAUSE_SIZE (node) - = TYPE_SIZE_UNIT (TREE_TYPE (ptr)); + = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ptr))); } else { diff --git a/libgomp/testsuite/libgomp.fortran/target-11.f90 b/libgomp/testsuite/libgomp.fortran/target-11.f90 new file mode 100644 index 00000000000..b0faa2e620d --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/target-11.f90 @@ -0,0 +1,75 @@ +! Based on libgomp.c/target-23.c + +! { dg-additional-options "-fdump-tree-original" } +! { dg-final { scan-tree-dump "omp target update to\\(xxs\\\[3\\\] \\\[len: 2\\\]\\)" "original" } } +! { dg-final { scan-tree-dump "omp target update to\\(s\\.s \\\[len: 4\\\]\\)" "original" } } +! { dg-final { scan-tree-dump "omp target update from\\(s\\.s \\\[len: 4\\\]\\)" "original" } } + +module m + implicit none + type S_type + integer s + integer, pointer :: u(:) => null() + integer :: v(0:4) + end type S_type + integer, volatile :: z +end module m + +program main + use m + implicit none + integer, target :: u(0:9) = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + logical :: err + type (S_type) :: s + integer, pointer :: v(:) + integer(kind=2) :: xxs(5) + err = .false. + s = S_type(9, v=[10, 11, 12, 13, 14]) + s%u(0:) => u(3:) + v(-4+3:) => u(3:) + xxs = [-1,-2,-3,-4,-5] + !$omp target enter data map (to: s%s, s%u, s%u(0:5)) map (alloc: s%v(1:4), xxs(3:5)) + s%s = s%s + 1 + u(3) = u(3) + 1 + s%v(1) = s%v(1) + 1 + xxs(3) = -33 + xxs(4) = -44 + xxs(5) = -55 + !$omp target update to (xxs(4)) + !$omp target update to (s%s) to (s%u(0:2), s%v(1:4)) + + !$omp target map (alloc: s%s, s%v(1:4)) map (from: err) + err = .false. + if (s%s /= 10 .or. s%v(1) /= 12 .or. s%v(2) /= 12 .or. s%v(3) /= 13) & + err = .true. + if (v(-1) /= 4 .or. v(0) /= 4 .or. v(1) /= 5 .or. v(2) /= 6 .or. v(3) /= 7) & + err = .true. + if (xxs(4) /= -44) & + err = .true. + s%s = s%s + 1 + s%v(2) = s%v(2) + 2 + v(-1) = 5 + v(3) = 9 + !$omp end target + + if (err) & + error stop + + !$omp target map (alloc: s%u(0:5)) + err = .false. + if (s%u(0) /= 5 .or. s%u(1) /= 4 .or. s%u(2) /= 5 .or. s%u(3) /= 6 .or. s%u(4) /= 9) & + err = .true. + s%u(1) = 12 + !$omp end target + + !$omp target update from (s%s, s%u(0:5)) from (s%v(1:4)) + if (err .or. s%s /= 11 .or. u(0) /= 0 .or. u(1) /= 1 .or. u(2) /= 2 .or. u(3) /= 5 & + .or. u(4) /= 12 .or. u(5) /= 5 .or. u(6) /= 6 .or. u(7) /= 9 .or. u(8) /= 8 & + .or. u(9) /= 9 .or. s%v(0) /= 10 .or. s%v(1) /= 12 .or. s%v(2) /= 14 & + .or. s%v(3) /= 13 .or. s%v(4) /= 14) & + error stop + ! !$omp target exit data map (release: s%s) + ! !$omp target exit data map (release: s%u(0:5)) + ! !$omp target exit data map (delete: s%v(1:4)) + ! !$omp target exit data map (release: s%s) +end diff --git a/libgomp/testsuite/libgomp.fortran/target-13.f90 b/libgomp/testsuite/libgomp.fortran/target-13.f90 new file mode 100644 index 00000000000..6aacc778449 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/target-13.f90 @@ -0,0 +1,159 @@ +module m + implicit none + type t + integer :: s, a(5) + end type t + + type t2 + integer :: s, a(5) + type(t) :: st, at(2:3) + end type t2 + + interface operator(/=) + procedure ne_compare_t + procedure ne_compare_t2 + end interface + +contains + + logical pure elemental function ne_compare_t (a, b) result(res) + type(t), intent(in) :: a, b + res = (a%s /= b%s) .or. any(a%a /= b%a) + end function + + logical pure elemental function ne_compare_t2 (a, b) result(res) + type(t2), intent(in) :: a, b + res = (a%s /= b%s) .or. any(a%a /= b%a) & + .or. (a%st /= b%st) .or. any(a%at /= b%at) + end function +end module m + +program p +use m +implicit none + +type(t2) :: var1, var2(5), var3(:) +type(t2) :: var1a, var2a(5), var3a(:) +allocatable :: var3, var3a +logical :: shared_memory = .false. + +!$omp target map(to: shared_memory) + shared_memory = .true. +!$omp end target + +var1 = T2(1, [1,2,3,4,5], T(11, [11,22,33,44,55]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]) + +var2 = [T2(101, [201,202,203,204,205], T(2011, [2011,2022,2033,2044,2055]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]), & + T2(111, [211,212,213,214,215], T(2111, [2111,2122,2133,2144,2155]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]), & + T2(121, [221,222,223,224,225], T(2211, [2211,2222,2233,2244,2255]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]), & + T2(131, [231,232,233,234,235], T(2311, [2311,2322,2333,2344,2355]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]), & + T2(141, [241,242,243,244,245], T(2411, [2411,2422,2433,2444,2455]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])])] + +var3 = [T2(301, [401,402,403,404,405], T(4011, [4011,4022,4033,4044,4055]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]), & + T2(311, [411,412,413,414,415], T(4111, [4111,4122,4133,4144,4155]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]), & + T2(321, [421,422,423,424,425], T(4211, [4211,4222,4233,4244,4255]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]), & + T2(331, [431,432,433,434,435], T(4311, [4311,4322,4333,4344,4355]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])]), & + T2(341, [441,442,443,444,445], T(4411, [4411,4422,4433,4444,4455]), & + [T(-11, [-11,-22,-33,-44,-55]), T(11, [11,22,33,44,55])])] + +var1a = var1 +var2a = var2 +var3a = var3 + +!$omp target enter data map(to:var1) +!$omp target enter data map(to:var2) +!$omp target enter data map(to:var3) + +! --------------- + +!$omp target update from(var1%at(2:3)) + +if (var1a /= var1) error stop +if (any (var2a /= var2)) error stop +if (any (var3a /= var3)) error stop + +! --------------- + +!$omp target + var1%st%s = 1243 + var2(3)%at(2) = T(123, [345,64,356,39,13]) + var2(3)%at(3) = T(48, [74,162,572,357,3]) +!$omp end target + +if (.not. shared_memory) then + if (var1 /= var1) error stop + if (any (var2a /= var2)) error stop + if (any (var3a /= var3)) error stop +endif + +!$omp target update from(var1%st) from(var2(3)%at(2:3)) + +var1a%st%s = 1243 +var2a(3)%at(2) = T(123, [345,64,356,39,13]) +var2a(3)%at(3) = T(48, [74,162,572,357,3]) +if (var1 /= var1) error stop +if (any (var2a /= var2)) error stop +if (any (var3a /= var3)) error stop + +! --------------- + +var3(1) = var2(1) +var1%at(2)%a = var2(1)%a +var1%at(3)%a = var2(2)%a + +var1a = var1 +var2a = var2 +var3a = var3 + +!$omp target update to(var3) to(var1%at(2:3)) + +!$omp target + var3(1)%s = var3(1)%s + 123 + var1%at(2)%a = var1%at(2)%a * 7 + var1%at(3)%s = var1%at(3)%s * (-3) +!$omp end target + +if (.not. shared_memory) then + if (var1 /= var1) error stop + if (any (var2a /= var2)) error stop + if (any (var3a /= var3)) error stop +endif + +var3a(1)%s = var3a(1)%s + 123 +var1a%at(2)%a = var1a%at(2)%a * 7 +var1a%at(3)%s = var1a%at(3)%s * (-3) + +block + integer, volatile :: i1,i2,i3,i4 + i1 = 1 + i2 = 2 + i3 = 1 + i4 = 2 + !$omp target update from(var3(i1:i2)) from(var1%at(i3:i4)) + i1 = 3 + i2 = 3 + i3 = 1 + i4 = 5 + !$omp target update from(var1%at(i1)%s) from(var1%at(i2)%a(i3:i4)) +end block + +if (var1 /= var1) error stop +if (any (var2a /= var2)) error stop +if (any (var3a /= var3)) error stop + +! --------------- + +!$omp target exit data map(from:var1) +!$omp target exit data map(from:var2) +!$omp target exit data map(from:var3) +end