From cffcf7a0baa6352e34747cf787bffd6e0c4b2ff1 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Thu, 31 Mar 2022 11:10:59 +0100 Subject: [PATCH 01/56] #1396 implement some ACC clauses and change ACCDataDirective to use them --- src/psyclone/psyir/nodes/acc_clauses.py | 125 +++++++++++++++++ src/psyclone/psyir/nodes/acc_directives.py | 126 +++++++++++++++++- src/psyclone/psyir/nodes/loop.py | 2 +- src/psyclone/psyir/nodes/omp_clauses.py | 2 +- .../openacc/data_directive_test.py | 19 ++- .../openacc/loop_directive_test.py | 4 +- .../openacc/parallel_directive_test.py | 6 +- 7 files changed, 264 insertions(+), 20 deletions(-) create mode 100644 src/psyclone/psyir/nodes/acc_clauses.py diff --git a/src/psyclone/psyir/nodes/acc_clauses.py b/src/psyclone/psyir/nodes/acc_clauses.py new file mode 100644 index 0000000000..5f4b6b2785 --- /dev/null +++ b/src/psyclone/psyir/nodes/acc_clauses.py @@ -0,0 +1,125 @@ +# ----------------------------------------------------------------------------- +# BSD 3-Clause License +# +# Copyright (c) 2022, Science and Technology Facilities Council. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ----------------------------------------------------------------------------- +# Author: A. R. Porter, STFC Daresbury Lab +# ----------------------------------------------------------------------------- + +''' This module contains the implementations of the various OpenACC Directive +Clause nodes.''' + +from psyclone.psyir.nodes.clause import Clause +from psyclone.psyir.nodes.reference import Reference + + +class ACCCopyClause(Clause): + ''' + OpenACC copy clause. Specifies a list of variables that are to be copied + to the device and the start of a region and back again at the end. + + ''' + _children_valid_format = "Reference" + _text_name = "CopyClause" + _clause_string = "copy" + + @staticmethod + def _validate_child(position, child): + ''' + Decides whether a given child and position are valid for this node. + Any number of children allowed, all of type Reference. + + :param int position: the position to be validated. + :param child: a child to be validated. + :type child: :py:class:`psyclone.psyir.nodes.Node` + + :return: whether the given child and position are valid for this node. + :rtype: bool + + ''' + return isinstance(child, Reference) + + +class ACCCopyInClause(Clause): + ''' + OpenACC copy clause. Specifies a list of variables that are to be copied + to the device and the start of a region and back again at the end. + + ''' + _children_valid_format = "Reference" + _text_name = "CopyInClause" + _clause_string = "copyin" + + @staticmethod + def _validate_child(position, child): + ''' + Decides whether a given child and position are valid for this node. + Any number of children allowed, all of type Reference. + + :param int position: the position to be validated. + :param child: a child to be validated. + :type child: :py:class:`psyclone.psyir.nodes.Node` + + :return: whether the given child and position are valid for this node. + :rtype: bool + + ''' + return isinstance(child, Reference) + + +class ACCCopyOutClause(Clause): + ''' + OpenACC copy clause. Specifies a list of variables that are to be copied + to the device and the start of a region and back again at the end. + + ''' + _children_valid_format = "Reference" + _text_name = "CopyOutClause" + _clause_string = "copyout" + + @staticmethod + def _validate_child(position, child): + ''' + Decides whether a given child and position are valid for this node. + Any number of children allowed, all of type Reference. + + :param int position: the position to be validated. + :param child: a child to be validated. + :type child: :py:class:`psyclone.psyir.nodes.Node` + + :return: whether the given child and position are valid for this node. + :rtype: bool + + ''' + return isinstance(child, Reference) + + +__all__ = ["ACCCopyClause", "ACCCopyInClause", "ACCCopyOutClause"] diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index f5156ca116..99b5090cbf 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -41,18 +41,21 @@ ''' This module contains the implementation of the various OpenACC Directive nodes.''' -from __future__ import absolute_import import abc import six -from psyclone.f2pygen import DirectiveGen, CommentGen +from psyclone.core import AccessType, VariablesAccessInfo from psyclone.errors import GenerationError, InternalError +from psyclone.f2pygen import DirectiveGen, CommentGen +from psyclone.psyir.nodes.acc_clauses import (ACCCopyClause, ACCCopyInClause, + ACCCopyOutClause) from psyclone.psyir.nodes.codeblock import CodeBlock from psyclone.psyir.nodes.directive import StandaloneDirective, \ RegionDirective +from psyclone.psyir.nodes.reference import Reference from psyclone.psyir.nodes.routine import Routine +from psyclone.psyir.nodes.schedule import Schedule from psyclone.psyir.nodes.psy_data_node import PSyDataNode from psyclone.psyir.symbols import DataSymbol, ScalarType -from psyclone.core import AccessType, VariablesAccessInfo @six.add_metaclass(abc.ABCMeta) @@ -603,6 +606,112 @@ class ACCDataDirective(ACCRegionDirective): in the PSyIR. ''' + def __init__(self, children=None, parent=None): + super().__init__(children=children, parent=parent) + + # Identify the inputs and outputs to the region (variables that + # are read and written). + var_accesses = VariablesAccessInfo(children) + table = self.scope.symbol_table + readers = set() + writers = set() + for signature in var_accesses.all_signatures: + sym = table.lookup(signature.var_name) + accesses = var_accesses[signature] + if isinstance(sym.datatype, ScalarType): + # We ignore scalars as these are passed by value when OpenACC + # kernels are launched. + continue + if accesses.is_read(): + readers.add(signature) + if accesses.is_written(): + writers.add(signature) + readwrites = readers.intersection(writers) + # Are any of the read-writes written before they are read? + for signature in list(readwrites)[:]: + accesses = var_accesses[signature] + if accesses[0].access_type == AccessType.WRITE: + # First access is a write so treat as a write + writers.add(signature) + readers.discard(signature) + readwrites.discard(signature) + readers_list = sorted(list(readers - readwrites)) + writers_list = sorted(list(writers - readwrites)) + readwrites_list = sorted(list(readwrites)) + + nodes = [] + for sig in readers_list: + nodes.extend(self.sig2ref(var_accesses, sig)) + if nodes: + self.addchild(ACCCopyInClause(children=nodes)) + nodes = [] + for sig in writers_list: + nodes.extend(self.sig2ref(var_accesses, sig)) + if nodes: + self.addchild(ACCCopyOutClause(children=nodes)) + nodes = [] + for sig in readwrites_list: + nodes.extend(self.sig2ref(var_accesses, sig)) + if nodes: + self.addchild(ACCCopyClause(children=nodes)) + + @staticmethod + def sig2ref(var_accesses, sig): + ''' + Convert the supplied signature into a list of references. + + :param var_accesses: + :type var_accesses: + :param sig: + :type sig: + + :returns: + :rtype: List[:py:class:`psyclone.psyir.nodes.Reference`] + + ''' + from psyclone.core.signature import Signature + from psyclone.psyir.nodes.array_mixin import ArrayMixin + from psyclone.psyir.nodes.loop import Loop + from psyclone.psyir.nodes.structure_reference import StructureReference + + node = var_accesses[sig].all_accesses[0].node + + if isinstance(node, StructureReference): + + member_sig, index_lists = node.get_signature_and_indices() + print(member_sig) + print(index_lists) + refs = [Reference(node.symbol)] + for idx in range(1, len(member_sig)): + refs.append(StructureReference.create( + node.symbol, list(member_sig[1:idx+1]))) + return refs + + # my_struct(ii)%my_array(ji) + # If we're inside a loop over ii then we'll actually need a loop: + # do ii = 1, N + # !$ acc data copyin(my_struct(ii)%my_array) + # end do + for access in var_accesses[sig].all_accesses: + node = access.node + # TODO need to make sure that loop is not outside the region! + loop_vars = [] + loop = node.ancestor(Loop) + while loop: + loop_vars.append(loop.variable) + loop = loop.ancestor(Loop) + array_accesses = node.walk(ArrayMixin) + for access in array_accesses: + idx_accesses = VariablesAccessInfo(access.indices) + if any(Signature(loop_var.name) in + idx_accesses.all_signatures for loop_var in + loop_vars): + print(access) + pass + + # TODO lookup array bounds here. + return [Reference(node.symbol)] + def gen_code(self, _): ''' :raises InternalError: the ACC data directive is currently only \ @@ -614,6 +723,15 @@ def gen_code(self, _): raise InternalError( "ACCDataDirective.gen_code should not have been called.") + @staticmethod + def _validate_child(position, child): + ''' + ''' + if position == 0: + return isinstance(child, Schedule) + return isinstance(child, (ACCCopyClause, ACCCopyInClause, + ACCCopyOutClause)) + def begin_string(self): '''Returns the beginning statement of this directive, i.e. "acc data". The backend is responsible for adding the @@ -670,6 +788,8 @@ def _create_access_list(signatures, var_accesses): return access_list result = "acc data" + return result + # TODO delete the rest! # Identify the inputs and outputs to the region (variables that # are read and written). diff --git a/src/psyclone/psyir/nodes/loop.py b/src/psyclone/psyir/nodes/loop.py index 7dfde263a3..af2eeac219 100644 --- a/src/psyclone/psyir/nodes/loop.py +++ b/src/psyclone/psyir/nodes/loop.py @@ -403,7 +403,7 @@ def kernel(self, kern): @property def variable(self): ''' - :returns: a reference to the control variable for this loop. + :returns: the control variable for this loop. :rtype: :py:class:`psyclone.psyir.symbols.DataSymbol` ''' self._check_variable(self._variable) diff --git a/src/psyclone/psyir/nodes/omp_clauses.py b/src/psyclone/psyir/nodes/omp_clauses.py index 49c5921d35..5d64abf96c 100644 --- a/src/psyclone/psyir/nodes/omp_clauses.py +++ b/src/psyclone/psyir/nodes/omp_clauses.py @@ -35,7 +35,7 @@ # ----------------------------------------------------------------------------- ''' This module contains the implementations of the various OpenMP Directive -nodes.''' +Clause nodes.''' from psyclone.psyir.nodes.clause import Clause from psyclone.psyir.nodes.literal import Literal diff --git a/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py b/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py index 818a067254..d310d2b27d 100644 --- a/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py +++ b/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2018-2021, Science and Technology Facilities Council. +# Copyright (c) 2018-2022, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -39,8 +39,6 @@ ''' -from __future__ import print_function, absolute_import - import os import pytest @@ -186,13 +184,14 @@ def test_multi_data(): gen_code = str(psy.gen) assert (" do jk = 1, jpkm1, 1\n" - " !$acc data copyin(ptb,wmask) copyout(zdk1t,zdkt)\n" + " !$acc data copyin(ptb, wmask) copyout(zdk1t, zdkt)\n" " do jj = 1, jpj, 1") in gen_code assert (" end if\n" " !$acc end data\n" - " !$acc data copyin(e2_e1u,e2u,e3t_n,e3u_n,pahu,r1_e1e2t," - "umask,uslp,wmask,zdit,zdk1t,zdkt,zftv) copyout(zftu) copy(pta)\n" + " !$acc data copyin(e2_e1u, e2u, e3t_n, e3u_n, pahu, r1_e1e2t, " + "umask, uslp, wmask, zdit, zdk1t, zdkt, zftv) copyout(zftu) " + "copy(pta)\n" " do jj = 1, jpjm1, 1") in gen_code assert (" enddo\n" @@ -249,7 +248,7 @@ def test_data_ref(parser): acc_trans = TransInfo().get_trans_name('ACCDataTrans') acc_trans.apply(schedule.children) gen_code = str(psy.gen) - assert "!$acc data copyin(a) copyout(prof,prof%npind)" in gen_code + assert "!$acc data copyin(a) copyout(prof, prof%npind)" in gen_code def test_data_ref_read(parser): @@ -270,7 +269,7 @@ def test_data_ref_read(parser): acc_trans = TransInfo().get_trans_name('ACCDataTrans') acc_trans.apply(schedule.children) gen_code = str(psy.gen) - assert "copyin(fld,fld%data)" in gen_code + assert "copyin(fld, fld%data)" in gen_code def test_array_section(): @@ -282,7 +281,7 @@ def test_array_section(): acc_trans = TransInfo().get_trans_name('ACCDataTrans') acc_trans.apply(schedule.children) gen_code = str(psy.gen).lower() - assert "!$acc data copyin(b,c) copyout(a)" in gen_code + assert "!$acc data copyin(b, c) copyout(a)" in gen_code def test_kind_parameter(parser): @@ -327,7 +326,7 @@ def test_no_copyin_intrinsics(parser): acc_trans.apply(schedule.children[0:1]) gen_code = str(psy.gen) idx = intrinsic.index("(") - assert "copyin({0})".format(intrinsic[0:idx]) not in gen_code.lower() + assert f"copyin({intrinsic[0:idx]})" not in gen_code.lower() def test_no_code_blocks(parser): diff --git a/src/psyclone/tests/nemo/transformations/openacc/loop_directive_test.py b/src/psyclone/tests/nemo/transformations/openacc/loop_directive_test.py index 30ea0cbcfd..8c14688ee4 100644 --- a/src/psyclone/tests/nemo/transformations/openacc/loop_directive_test.py +++ b/src/psyclone/tests/nemo/transformations/openacc/loop_directive_test.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2019-2021, Science and Technology Facilities Council. +# Copyright (c) 2019-2022, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -105,7 +105,7 @@ def test_explicit_loop(parser): " real, dimension(jpj) :: sto_tmp\n" " real, dimension(jpj) :: sto_tmp2\n" "\n" - " !$acc data copyout(sto_tmp,sto_tmp2)\n" + " !$acc data copyout(sto_tmp, sto_tmp2)\n" " !$acc parallel default(present)\n" " !$acc loop independent\n" " do ji = 1, jpj, 1\n" diff --git a/src/psyclone/tests/nemo/transformations/openacc/parallel_directive_test.py b/src/psyclone/tests/nemo/transformations/openacc/parallel_directive_test.py index 7edce3954a..7af6956ee4 100644 --- a/src/psyclone/tests/nemo/transformations/openacc/parallel_directive_test.py +++ b/src/psyclone/tests/nemo/transformations/openacc/parallel_directive_test.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2019-2021, Science and Technology Facilities Council. +# Copyright (c) 2019-2022, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -115,7 +115,7 @@ def test_parallel_two_loops(parser): " real, dimension(jpi) :: sto_tmp\n" " real, dimension(jpi) :: sto_tmp2\n" "\n" - " !$acc data copyout(sto_tmp,sto_tmp2)\n" + " !$acc data copyout(sto_tmp, sto_tmp2)\n" " !$acc parallel default(present)\n" " do ji = 1, jpi, 1\n" " sto_tmp(ji) = 1.0d0\n" @@ -154,7 +154,7 @@ def test_parallel_if_block(parser): acc_trans.apply(schedule[0:1]) data_trans.apply(schedule[0]) code = str(psy.gen).lower() - assert (" !$acc data copyout(sto_tmp,sto_tmp2)\n" + assert (" !$acc data copyout(sto_tmp, sto_tmp2)\n" " !$acc parallel default(present)\n" " if (init) then\n" " do ji = 1, jpi, 1\n" in code) From dad5832b7483e282569db422417346b28905863e Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Thu, 31 Mar 2022 16:00:07 +0100 Subject: [PATCH 02/56] #1396 support multiple array accesses within a structure access. Give Clause a colour so that view() works --- src/psyclone/psyir/nodes/acc_directives.py | 102 +++++++++++++----- src/psyclone/psyir/nodes/clause.py | 9 +- .../psyir/nodes/structure_reference.py | 6 +- .../openacc/data_directive_test.py | 57 +++++++++- .../tests/psyir/backend/psyir_openacc_test.py | 29 +++-- 5 files changed, 149 insertions(+), 54 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index 99b5090cbf..8b4e89c819 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -43,14 +43,18 @@ import abc import six +from collections import OrderedDict from psyclone.core import AccessType, VariablesAccessInfo from psyclone.errors import GenerationError, InternalError from psyclone.f2pygen import DirectiveGen, CommentGen from psyclone.psyir.nodes.acc_clauses import (ACCCopyClause, ACCCopyInClause, ACCCopyOutClause) +from psyclone.psyir.nodes.array_of_structures_reference import \ + ArrayOfStructuresReference from psyclone.psyir.nodes.codeblock import CodeBlock from psyclone.psyir.nodes.directive import StandaloneDirective, \ RegionDirective +from psyclone.psyir.nodes.loop import Loop from psyclone.psyir.nodes.reference import Reference from psyclone.psyir.nodes.routine import Routine from psyclone.psyir.nodes.schedule import Schedule @@ -609,6 +613,12 @@ class ACCDataDirective(ACCRegionDirective): def __init__(self, children=None, parent=None): super().__init__(children=children, parent=parent) + self._parent_loop_vars = [] + cursor = self.ancestor(Loop) + while cursor: + self._parent_loop_vars.append(cursor.variable) + cursor = cursor.ancestor(Loop) + # Identify the inputs and outputs to the region (variables that # are read and written). var_accesses = VariablesAccessInfo(children) @@ -639,53 +649,81 @@ def __init__(self, children=None, parent=None): writers_list = sorted(list(writers - readwrites)) readwrites_list = sorted(list(readwrites)) - nodes = [] + # We now need to create PSyIR references for all of the signatures + # and add them as children of the appropriate clauses. + nodes_dict = OrderedDict() for sig in readers_list: - nodes.extend(self.sig2ref(var_accesses, sig)) - if nodes: - self.addchild(ACCCopyInClause(children=nodes)) - nodes = [] + self.sig2ref(var_accesses, sig, nodes_dict) + if nodes_dict: + self.addchild(ACCCopyInClause(children=list(nodes_dict.values()))) + nodes_dict = OrderedDict() for sig in writers_list: - nodes.extend(self.sig2ref(var_accesses, sig)) - if nodes: - self.addchild(ACCCopyOutClause(children=nodes)) - nodes = [] + self.sig2ref(var_accesses, sig, nodes_dict) + if nodes_dict: + self.addchild(ACCCopyOutClause(children=list(nodes_dict.values()))) + nodes_dict = OrderedDict() for sig in readwrites_list: - nodes.extend(self.sig2ref(var_accesses, sig)) - if nodes: - self.addchild(ACCCopyClause(children=nodes)) + self.sig2ref(var_accesses, sig, nodes_dict) + if nodes_dict: + self.addchild(ACCCopyClause(children=list(nodes_dict.values()))) @staticmethod - def sig2ref(var_accesses, sig): + def sig2ref(var_accesses, sig, refs_dict): ''' - Convert the supplied signature into a list of references. + Update the supplied dict of accesses with those required by the + supplied signature. :param var_accesses: - :type var_accesses: - :param sig: - :type sig: - - :returns: - :rtype: List[:py:class:`psyclone.psyir.nodes.Reference`] + :type var_accesses: :py:class:`psyclone.core.VariablesAccessInfo` + :param sig: + :type sig: :py:class:`psyclone.core.Signature` + :param OrderedDict refs_dict: the dict of accesses to update. ''' from psyclone.core.signature import Signature from psyclone.psyir.nodes.array_mixin import ArrayMixin - from psyclone.psyir.nodes.loop import Loop from psyclone.psyir.nodes.structure_reference import StructureReference + # Having this import at the top level causes a circular dependency due + # to psyGen importing FortranWriter at the top level. + # pylint: disable=import-outside-toplevel + from psyclone.psyGen import Kern node = var_accesses[sig].all_accesses[0].node if isinstance(node, StructureReference): + for accesses in var_accesses[sig].all_accesses: + array_accesses = accesses.node.walk(ArrayMixin) + member_sig, index_lists = node.get_signature_and_indices() - print(member_sig) - print(index_lists) - refs = [Reference(node.symbol)] - for idx in range(1, len(member_sig)): - refs.append(StructureReference.create( - node.symbol, list(member_sig[1:idx+1]))) - return refs + + if Signature(node.symbol.name) not in refs_dict: + refs_dict[Signature(node.symbol.name)] = Reference(node.symbol) + + for depth in range(1, len(member_sig)): + if member_sig[:depth+1] not in refs_dict: + if node.is_array: + base_cls = ArrayOfStructuresReference + # Copy the indices so as not to modify the original + # node. + base_args = [node.symbol, + [idx.copy() for idx in node.indices]] + else: + base_cls = StructureReference + base_args = [node.symbol] + # Create the new lists of indices, one list for each member + # of the structure access apart from the last one where + # we assume the whole array (if it is an array) is + # accessed. Hence the loop is 1:depth and then we set the + # last one separately. + new_lists = [] + for idx_list in index_lists[1:depth]: + new_lists.append([idx.copy() for idx in idx_list]) + new_lists.append([]) + members = list(zip(member_sig[1:depth+1], new_lists)) + refs_dict[member_sig[:depth+1]] = base_cls.create( + *base_args, members) + return refs_dict # my_struct(ii)%my_array(ji) # If we're inside a loop over ii then we'll actually need a loop: @@ -709,8 +747,14 @@ def sig2ref(var_accesses, sig): print(access) pass + if isinstance(node, Kern): + if sig not in refs_dict: + refs_dict[sig] = Reference(node.scope.symbol_table.lookup( + str(sig))) + # TODO lookup array bounds here. - return [Reference(node.symbol)] + if sig not in refs_dict: + refs_dict[sig] = Reference(node.symbol) def gen_code(self, _): ''' diff --git a/src/psyclone/psyir/nodes/clause.py b/src/psyclone/psyir/nodes/clause.py index c927a00714..ed34264052 100644 --- a/src/psyclone/psyir/nodes/clause.py +++ b/src/psyclone/psyir/nodes/clause.py @@ -31,10 +31,11 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # ----------------------------------------------------------------------------- -# Author A. B. G. Chalk, STFC Daresbury Lab +# Author: A. B. G. Chalk, STFC Daresbury Lab +# Modified: A. R. Porter, STFC Daresbury Lab # ----------------------------------------------------------------------------- -''' This module contains the Clause abstract node implementation ''' +''' This module contains the Clause abstract node implementation. ''' import abc from psyclone.psyir.nodes.node import Node @@ -48,12 +49,12 @@ class Clause(Node, metaclass=abc.ABCMeta): _text_name = "Clause" # The base string for this clause, e.g. nowait or private _clause_string = None + _colour = "white" @property def clause_string(self): ''' - Returns the clause string for this Clause - + :returns: the base clause string for this Clause. :rtype: str ''' return self._clause_string diff --git a/src/psyclone/psyir/nodes/structure_reference.py b/src/psyclone/psyir/nodes/structure_reference.py index a609f0e546..f1c5600f56 100644 --- a/src/psyclone/psyir/nodes/structure_reference.py +++ b/src/psyclone/psyir/nodes/structure_reference.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2020-2021, Science and Technology Facilities Council. +# Copyright (c) 2020-2022, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -232,8 +232,8 @@ def get_signature_and_indices(self): ''':returns: the Signature of this structure reference, and \ a list of the indices used for each component (empty list \ if an access is not an array). - :rtype: tuple(:py:class:`psyclone.core.Signature`, list of \ - list of indices) + :rtype: Tuple[:py:class:`psyclone.core.Signature`, \ + List[List[:py:class:`psyclone.psyir.nodes.Node`]]] ''' # Get the signature of self: diff --git a/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py b/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py index d310d2b27d..7ca83a9915 100644 --- a/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py +++ b/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py @@ -46,7 +46,7 @@ from psyclone.errors import InternalError from psyclone.gocean1p0 import GOACCEnterDataDirective from psyclone.psyGen import PSyFactory, TransInfo -from psyclone.psyir.nodes import ACCDataDirective +from psyclone.psyir.nodes import ACCDataDirective, Schedule from psyclone.psyir.transformations import TransformationError from psyclone.tests.utilities import get_invoke, Compile @@ -272,6 +272,56 @@ def test_data_ref_read(parser): assert "copyin(fld, fld%data)" in gen_code +def test_multi_array_derived_type(fortran_reader, fortran_writer): + ''' + Check that we generate the correct clause if the derived-type contains + more than one array access but only one is iterated over. + ''' + psyir = fortran_reader.psyir_from_source( + "program dtype_read\n" + "use field_mod, only: fld_type\n" + "integer, parameter :: jpj = 10\n" + "type(fld_type), dimension(5) :: small_holding\n" + "real, dimension(jpj) :: sto_tmp\n" + "integer :: ji\n" + "do ji = 1,jpj\n" + " sto_tmp(ji) = small_holding(2)%data(ji) + 1.0\n" + "end do\n" + "end program dtype_read\n") + schedule = psyir.walk(Schedule)[0] + acc_trans = TransInfo().get_trans_name('ACCDataTrans') + acc_trans.apply(schedule.children) + gen_code = fortran_writer(psyir) + assert ("!$acc data copyin(small_holding, small_holding(2)%data) " + "copyout(sto_tmp)" in gen_code) + + +def test_multi_array_derived_type_error(fortran_reader, fortran_writer): + ''' + Check that we raise the expected error if the derived-type contains + more than one array access and they are both iterated over. + ''' + psyir = fortran_reader.psyir_from_source( + "program dtype_read\n" + "use field_mod, only: fld_type\n" + "integer, parameter :: jpj = 10\n" + "type(fld_type), dimension(5) :: small_holding\n" + "real, dimension(jpj) :: sto_tmp\n" + "integer :: ji, jf\n" + "sto_tmp(:) = 0.0\n" + "do jf = 1, 5\n" + "do ji = 1,jpj\n" + " sto_tmp(ji) = sto_tmp(ji) + small_holding(3)%grid(jf)%data(ji)\n" + "end do\n" + "end do\n" + "end program dtype_read\n") + schedule = psyir.walk(Schedule)[0] + acc_trans = TransInfo().get_trans_name('ACCDataTrans') + with pytest.raises(TransformationError) as err: + acc_trans.apply(schedule.children) + assert "hohohoho" in str(err.value) + + def test_array_section(): '''Check code generation with a arrays accessed via an array section. @@ -431,8 +481,9 @@ def test_array_access_in_ifblock(parser): def test_array_access_loop_bounds(parser): - ''' Check that we raise the expected error if our code that identifies - read and write accesses misses an array access. ''' + ''' Check that the correct data-movement statement is generated when + the region contains a loop that has an array-access as one of its + bounds. ''' code = ("program do_bound\n" " use kind_params_mod\n" " real(kind=wp) :: trim_width(8), zdta(8,8)\n" diff --git a/src/psyclone/tests/psyir/backend/psyir_openacc_test.py b/src/psyclone/tests/psyir/backend/psyir_openacc_test.py index 5cb085725f..58d9db1e7b 100644 --- a/src/psyclone/tests/psyir/backend/psyir_openacc_test.py +++ b/src/psyclone/tests/psyir/backend/psyir_openacc_test.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2021, Science and Technology Facilities Council. +# Copyright (c) 2021-2022, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -45,7 +45,8 @@ from psyclone.psyir.backend.visitor import VisitorError from psyclone.psyir.backend.c import CWriter from psyclone.psyir.backend.fortran import FortranWriter -from psyclone.psyir.nodes import Assignment, Reference, Loop, Directive +from psyclone.psyir.nodes import (Assignment, Reference, Loop, Directive, + Schedule) from psyclone.psyir.symbols import DataSymbol, REAL_TYPE from psyclone.transformations import (ACCKernelsTrans, ACCDataTrans, ACCParallelTrans) @@ -80,13 +81,13 @@ # ---------------------------------------------------------------------------- -def test_acc_data_region(parser, fortran_writer): +@pytest.mark.xfail(reason="ACCDataDirective clauses are not updated when " + "tree is modified - TODO.") +def test_acc_data_region(fortran_reader, fortran_writer): ''' Test that an ACCDataDirective node generates the expected code. ''' - # Generate fparser2 parse tree from Fortran code. - reader = FortranStringReader(NEMO_TEST_CODE) - code = parser(reader) - psy = PSyFactory("nemo", distributed_memory=False).create(code) - sched = psy.invokes.invoke_list[0].schedule + # Generate PSyIR from Fortran code. + psyir = fortran_reader.psyir_from_source(NEMO_TEST_CODE) + sched = psyir.walk(Schedule)[0] dtrans = ACCDataTrans() dtrans.apply(sched) result = fortran_writer(sched) @@ -108,12 +109,12 @@ def test_acc_data_region(parser, fortran_writer): # ---------------------------------------------------------------------------- -def test_acc_data_region_contains_struct(parser, fortran_writer): +def test_acc_data_region_contains_struct(fortran_reader, fortran_writer): ''' Test that we generate correct code if a data region includes references to structures. ''' - reader = FortranStringReader(''' + psyir = fortran_reader.psyir_from_source(''' module test use some_mod, only: grid_type type(grid_type) :: grid @@ -129,14 +130,12 @@ def test_acc_data_region_contains_struct(parser, fortran_writer): enddo end subroutine tmp end module test''') - code = parser(reader) - psy = PSyFactory("nemo", distributed_memory=False).create(code) - sched = psy.invokes.invoke_list[0].schedule + sched = psyir.walk(Schedule)[0] dtrans = ACCDataTrans() dtrans.apply(sched) gen = fortran_writer(sched) - assert (" !$acc data copyin(grid,grid%flag) " - "copyout(grid,grid%data,grid%weights) " + assert (" !$acc data copyin(grid, grid%flag) " + "copyout(grid, grid%data, grid%weights) " "copy(b)\n" " do i = 1, 20, 2\n" " b(i) = b(i) + i + grid%flag\n" From d014da03abf95320507f85b44a5e16a0653e3f9f Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Thu, 31 Mar 2022 17:04:23 +0100 Subject: [PATCH 03/56] #1396 add check for multi-array accesses within a structure --- src/psyclone/psyir/nodes/acc_directives.py | 58 ++++++++++++++-------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index 8b4e89c819..cc345c4d21 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -693,7 +693,44 @@ def sig2ref(var_accesses, sig, refs_dict): if isinstance(node, StructureReference): for accesses in var_accesses[sig].all_accesses: + # Find the loop variables for all Loops that contain this + # access and are themselves within the data region. + loop_vars = [] + cursor = accesses.node.ancestor(Loop) + while cursor and cursor.ancestor(ACCDataDirective): + loop_vars.append(Signature(cursor.variable.name)) + cursor = cursor.ancestor(Loop) + # Now check whether any of these loop variables appear within + # the structure reference + active_loop_vars = {} + # Loop over each component of the structure reference that is + # an array access. array_accesses = accesses.node.walk(ArrayMixin) + for access in array_accesses: + active_loop_vars[access.name] = [] + var_accesses = VariablesAccessInfo(access.indices) + for var in loop_vars: + if var in var_accesses.all_signatures: + active_loop_vars[access.name].append(var.var_name) + active_accesses = [pair for pair in active_loop_vars.items() + if pair[1]] + + if len(active_accesses) > 1: + # For an access such as my_struct(ii)%my_array(ji) then + # if we're inside a loop over ii we'll actually need + # a loop to do the deep copy: + # do ii = 1, N + # !$ acc data copyin(my_struct(ii)%my_array) + # end do + loop_vars = ', '.join(str(pair[1]) for pair in + active_accesses) + raise NotImplementedError( + f"Data region contains a structure access " + f"'{node.name}' where more than one component " + f"({', '.join(pair[0] for pair in active_accesses)}) " + f"is an array and is iterated over (variables " + f"{loop_vars}). Deep copying of data for such an" + f" access is not implemented.") member_sig, index_lists = node.get_signature_and_indices() @@ -725,27 +762,6 @@ def sig2ref(var_accesses, sig, refs_dict): *base_args, members) return refs_dict - # my_struct(ii)%my_array(ji) - # If we're inside a loop over ii then we'll actually need a loop: - # do ii = 1, N - # !$ acc data copyin(my_struct(ii)%my_array) - # end do - for access in var_accesses[sig].all_accesses: - node = access.node - # TODO need to make sure that loop is not outside the region! - loop_vars = [] - loop = node.ancestor(Loop) - while loop: - loop_vars.append(loop.variable) - loop = loop.ancestor(Loop) - array_accesses = node.walk(ArrayMixin) - for access in array_accesses: - idx_accesses = VariablesAccessInfo(access.indices) - if any(Signature(loop_var.name) in - idx_accesses.all_signatures for loop_var in - loop_vars): - print(access) - pass if isinstance(node, Kern): if sig not in refs_dict: From c62d99532df1ebfd0ebbf592780daee937ddeaa1 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Fri, 1 Apr 2022 10:38:06 +0100 Subject: [PATCH 04/56] #1396 move checking code into validate() of transformation. --- src/psyclone/psyir/nodes/acc_directives.py | 43 +------------------- src/psyclone/transformations.py | 46 +++++++++++++++++++++- 2 files changed, 47 insertions(+), 42 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index cc345c4d21..c5baf46855 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -679,9 +679,10 @@ def sig2ref(var_accesses, sig, refs_dict): :type sig: :py:class:`psyclone.core.Signature` :param OrderedDict refs_dict: the dict of accesses to update. + :raises NotImplementedError: if a non-leaf structure component is \ + iterated over, e.g. a(i)%b. ''' from psyclone.core.signature import Signature - from psyclone.psyir.nodes.array_mixin import ArrayMixin from psyclone.psyir.nodes.structure_reference import StructureReference # Having this import at the top level causes a circular dependency due # to psyGen importing FortranWriter at the top level. @@ -692,46 +693,6 @@ def sig2ref(var_accesses, sig, refs_dict): if isinstance(node, StructureReference): - for accesses in var_accesses[sig].all_accesses: - # Find the loop variables for all Loops that contain this - # access and are themselves within the data region. - loop_vars = [] - cursor = accesses.node.ancestor(Loop) - while cursor and cursor.ancestor(ACCDataDirective): - loop_vars.append(Signature(cursor.variable.name)) - cursor = cursor.ancestor(Loop) - # Now check whether any of these loop variables appear within - # the structure reference - active_loop_vars = {} - # Loop over each component of the structure reference that is - # an array access. - array_accesses = accesses.node.walk(ArrayMixin) - for access in array_accesses: - active_loop_vars[access.name] = [] - var_accesses = VariablesAccessInfo(access.indices) - for var in loop_vars: - if var in var_accesses.all_signatures: - active_loop_vars[access.name].append(var.var_name) - active_accesses = [pair for pair in active_loop_vars.items() - if pair[1]] - - if len(active_accesses) > 1: - # For an access such as my_struct(ii)%my_array(ji) then - # if we're inside a loop over ii we'll actually need - # a loop to do the deep copy: - # do ii = 1, N - # !$ acc data copyin(my_struct(ii)%my_array) - # end do - loop_vars = ', '.join(str(pair[1]) for pair in - active_accesses) - raise NotImplementedError( - f"Data region contains a structure access " - f"'{node.name}' where more than one component " - f"({', '.join(pair[0] for pair in active_accesses)}) " - f"is an array and is iterated over (variables " - f"{loop_vars}). Deep copying of data for such an" - f" access is not implemented.") - member_sig, index_lists = node.get_signature_and_indices() if Signature(node.symbol.name) not in refs_dict: diff --git a/src/psyclone/transformations.py b/src/psyclone/transformations.py index 1bb9a505eb..aca1f2416b 100644 --- a/src/psyclone/transformations.py +++ b/src/psyclone/transformations.py @@ -3119,7 +3119,7 @@ def apply(self, node, options=None): # Create a directive containing the nodes in node_list and insert it. directive = ACCDataDirective( - parent=parent, children=[node.detach() for node in node_list]) + parent=parent, children=[node.detach() for node in node_list]) parent.children.insert(start_index, directive) @@ -3153,6 +3153,50 @@ def validate(self, nodes, options): raise TransformationError( "Cannot add an OpenACC data region to a schedule that " "already contains an 'enter data' directive.") + from psyclone.psyir.nodes.array_mixin import ArrayMixin + from psyclone.psyir.nodes.structure_member import StructureMember + from psyclone.core.signature import Signature + from psyclone.core import VariablesAccessInfo + # Check that we don't have any accesses to arrays of derived types + # that we can't yet deep copy. + from psyclone.psyir.nodes import StructureReference + for node in node_list: + for sref in node.walk(StructureReference): + + # Find the loop variables for all Loops that contain this + # access and are themselves within the data region. + loop_vars = [] + cursor = sref.ancestor(Loop, limit=node) + while cursor: + loop_vars.append(Signature(cursor.variable.name)) + cursor = cursor.ancestor(Loop) + + # Now check whether any of these loop variables appear within + # the structure reference. + # Loop over each component of the structure reference that is + # an array access. + array_accesses = sref.walk(ArrayMixin) + for access in array_accesses: + if not isinstance(access, StructureMember): + continue + var_accesses = VariablesAccessInfo(access.indices) + for var in loop_vars: + if var not in var_accesses.all_signatures: + continue + # For an access such as my_struct(ii)%my_array(ji) + # then + # if we're inside a loop over ii we'll actually need + # a loop to do the deep copy: + # do ii = 1, N + # !$ acc data copyin(my_struct(ii)%my_array) + # end do + raise TransformationError( + f"Data region contains a structure access " + f"'{node.name}' where component '{access.name}' " + f"is an array and is iterated over (variable " + f"'{var}'). Deep copying of data for structures " + f"is only supported where the deepest " + f"component is the one being iterated over.") class KernelImportsToArguments(Transformation): From ebde2f2fc4a122dda5e32fe9e0f7258eef282178 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Fri, 26 May 2023 16:07:03 +0100 Subject: [PATCH 05/56] #1396 fix some tests after merge --- src/psyclone/psyir/nodes/acc_directives.py | 5 +++-- .../transformations/openacc/data_directive_test.py | 14 +++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index b59305b252..fa247880d1 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -42,10 +42,11 @@ nodes.''' import abc +from collections import OrderedDict + from psyclone.core import AccessType, VariablesAccessInfo, Signature from psyclone.f2pygen import DirectiveGen, CommentGen from psyclone.errors import GenerationError, InternalError -from psyclone.f2pygen import DirectiveGen, CommentGen from psyclone.psyir.nodes.acc_clauses import (ACCCopyClause, ACCCopyInClause, ACCCopyOutClause) from psyclone.psyir.nodes.array_of_structures_reference import \ @@ -58,7 +59,7 @@ from psyclone.psyir.nodes.routine import Routine from psyclone.psyir.nodes.schedule import Schedule from psyclone.psyir.nodes.psy_data_node import PSyDataNode -from psyclone.psyir.symbols import DataSymbol, ScalarType +from psyclone.psyir.symbols import ScalarType class ACCDirective(metaclass=abc.ABCMeta): diff --git a/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py b/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py index 7c5ca71fda..5f05c82044 100644 --- a/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py +++ b/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py @@ -183,13 +183,13 @@ def test_multi_data(): gen_code = str(psy.gen) assert (" do jk = 1, jpkm1, 1\n" - " !$acc data copyin(ptb, wmask) copyout(zdk1t, zdkt)\n" + " !$acc data copyin(ptb,wmask), copyout(zdk1t,zdkt)\n" " do jj = 1, jpj, 1") in gen_code assert (" end if\n" " !$acc end data\n" - " !$acc data copyin(e2_e1u, e2u, e3t_n, e3u_n, pahu, r1_e1e2t, " - "umask, uslp, wmask, zdit, zdk1t, zdkt, zftv) copyout(zftu) " + " !$acc data copyin(e2_e1u,e2u,e3t_n,e3u_n,pahu,r1_e1e2t," + "umask,uslp,wmask,zdit,zdk1t,zdkt,zftv), copyout(zftu), " "copy(pta)\n" " do jj = 1, jpjm1, 1") in gen_code @@ -247,7 +247,7 @@ def test_data_ref(parser): acc_trans = TransInfo().get_trans_name('ACCDataTrans') acc_trans.apply(schedule.children) gen_code = str(psy.gen) - assert "!$acc data copyin(a) copyout(prof, prof%npind)" in gen_code + assert "!$acc data copyin(a), copyout(prof,prof%npind)" in gen_code def test_data_ref_read(parser): @@ -268,7 +268,7 @@ def test_data_ref_read(parser): acc_trans = TransInfo().get_trans_name('ACCDataTrans') acc_trans.apply(schedule.children) gen_code = str(psy.gen) - assert "copyin(fld, fld%data)" in gen_code + assert "copyin(fld,fld%data)" in gen_code def test_multi_array_derived_type(fortran_reader, fortran_writer): @@ -291,7 +291,7 @@ def test_multi_array_derived_type(fortran_reader, fortran_writer): acc_trans = TransInfo().get_trans_name('ACCDataTrans') acc_trans.apply(schedule.children) gen_code = fortran_writer(psyir) - assert ("!$acc data copyin(small_holding, small_holding(2)%data) " + assert ("!$acc data copyin(small_holding,small_holding(2)%data), " "copyout(sto_tmp)" in gen_code) @@ -330,7 +330,7 @@ def test_array_section(): acc_trans = TransInfo().get_trans_name('ACCDataTrans') acc_trans.apply(schedule.children) gen_code = str(psy.gen).lower() - assert "!$acc data copyin(b, c) copyout(a)" in gen_code + assert "!$acc data copyin(b,c), copyout(a)" in gen_code def test_kind_parameter(parser): From c9c60734d174b185d21efc247c08f3a750b523ad Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Tue, 30 May 2023 10:32:59 +0100 Subject: [PATCH 06/56] #1396 revert Clause node to be coloured green --- src/psyclone/psyir/nodes/clause.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/psyclone/psyir/nodes/clause.py b/src/psyclone/psyir/nodes/clause.py index 3aea037a14..8258990e9b 100644 --- a/src/psyclone/psyir/nodes/clause.py +++ b/src/psyclone/psyir/nodes/clause.py @@ -49,7 +49,6 @@ class Clause(Node, metaclass=abc.ABCMeta): _colour = "green" # The base string for this clause, e.g. nowait or private _clause_string = None - _colour = "white" @property def clause_string(self): From cd7dc03f85567894b636ddc8aeac19f2ed372fca Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Tue, 30 May 2023 10:34:39 +0100 Subject: [PATCH 07/56] #1396 minor text changes to fix tests --- .../transformations/openacc/data_directive_test.py | 6 +++++- .../transformations/openacc/loop_directive_test.py | 5 ++--- .../openacc/parallel_directive_test.py | 7 +++---- .../tests/psyir/backend/psyir_openacc_test.py | 7 +++---- src/psyclone/transformations.py | 12 ++++++------ 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py b/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py index 5f05c82044..aba7e46c46 100644 --- a/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py +++ b/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py @@ -318,7 +318,11 @@ def test_multi_array_derived_type_error(fortran_reader, fortran_writer): acc_trans = TransInfo().get_trans_name('ACCDataTrans') with pytest.raises(TransformationError) as err: acc_trans.apply(schedule.children) - assert "hohohoho" in str(err.value) + assert ("Data region contains a structure access 'small_holding(3)%" + "grid(jf)%data(ji)' where component 'grid' is an array and is " + "iterated over (variable 'jf'). Deep copying of data for " + "structures is only supported where the deepest component is the " + "one being iterated over." in str(err.value)) def test_array_section(): diff --git a/src/psyclone/tests/nemo/transformations/openacc/loop_directive_test.py b/src/psyclone/tests/nemo/transformations/openacc/loop_directive_test.py index 8c14688ee4..a690708b91 100644 --- a/src/psyclone/tests/nemo/transformations/openacc/loop_directive_test.py +++ b/src/psyclone/tests/nemo/transformations/openacc/loop_directive_test.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2019-2022, Science and Technology Facilities Council. +# Copyright (c) 2019-2023, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -38,7 +38,6 @@ ''' -from __future__ import print_function, absolute_import import pytest from fparser.common.readfortran import FortranStringReader from psyclone.psyGen import PSyFactory, TransInfo @@ -105,7 +104,7 @@ def test_explicit_loop(parser): " real, dimension(jpj) :: sto_tmp\n" " real, dimension(jpj) :: sto_tmp2\n" "\n" - " !$acc data copyout(sto_tmp, sto_tmp2)\n" + " !$acc data copyout(sto_tmp,sto_tmp2)\n" " !$acc parallel default(present)\n" " !$acc loop independent\n" " do ji = 1, jpj, 1\n" diff --git a/src/psyclone/tests/nemo/transformations/openacc/parallel_directive_test.py b/src/psyclone/tests/nemo/transformations/openacc/parallel_directive_test.py index 7af6956ee4..e031200f48 100644 --- a/src/psyclone/tests/nemo/transformations/openacc/parallel_directive_test.py +++ b/src/psyclone/tests/nemo/transformations/openacc/parallel_directive_test.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2019-2022, Science and Technology Facilities Council. +# Copyright (c) 2019-2023, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -38,7 +38,6 @@ ''' -from __future__ import print_function, absolute_import from fparser.common.readfortran import FortranStringReader from psyclone.psyGen import PSyFactory, TransInfo @@ -115,7 +114,7 @@ def test_parallel_two_loops(parser): " real, dimension(jpi) :: sto_tmp\n" " real, dimension(jpi) :: sto_tmp2\n" "\n" - " !$acc data copyout(sto_tmp, sto_tmp2)\n" + " !$acc data copyout(sto_tmp,sto_tmp2)\n" " !$acc parallel default(present)\n" " do ji = 1, jpi, 1\n" " sto_tmp(ji) = 1.0d0\n" @@ -154,7 +153,7 @@ def test_parallel_if_block(parser): acc_trans.apply(schedule[0:1]) data_trans.apply(schedule[0]) code = str(psy.gen).lower() - assert (" !$acc data copyout(sto_tmp, sto_tmp2)\n" + assert (" !$acc data copyout(sto_tmp,sto_tmp2)\n" " !$acc parallel default(present)\n" " if (init) then\n" " do ji = 1, jpi, 1\n" in code) diff --git a/src/psyclone/tests/psyir/backend/psyir_openacc_test.py b/src/psyclone/tests/psyir/backend/psyir_openacc_test.py index 86635f6677..1b12fe5493 100644 --- a/src/psyclone/tests/psyir/backend/psyir_openacc_test.py +++ b/src/psyclone/tests/psyir/backend/psyir_openacc_test.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2021-2022, Science and Technology Facilities Council. +# Copyright (c) 2021-2023, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -38,7 +38,6 @@ '''Performs pytest tests on the support for OpenACC directives in the psyclone.psyir.backend.fortran and c modules. ''' -from __future__ import absolute_import import pytest from fparser.common.readfortran import FortranStringReader from psyclone.psyGen import PSyFactory, TransInfo @@ -134,8 +133,8 @@ def test_acc_data_region_contains_struct(fortran_reader, fortran_writer): dtrans = ACCDataTrans() dtrans.apply(sched) gen = fortran_writer(sched) - assert (" !$acc data copyin(grid, grid%flag) " - "copyout(grid, grid%data, grid%weights) " + assert (" !$acc data copyin(grid,grid%flag), " + "copyout(grid,grid%data,grid%weights), " "copy(b)\n" " do i = 1, 20, 2\n" " b(i) = b(i) + i + grid%flag\n" diff --git a/src/psyclone/transformations.py b/src/psyclone/transformations.py index bcf963cc10..5dd1fa6740 100644 --- a/src/psyclone/transformations.py +++ b/src/psyclone/transformations.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2017-2022, Science and Technology Facilities Council. +# Copyright (c) 2017-2023, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -55,6 +55,7 @@ from psyclone.nemo import NemoInvokeSchedule from psyclone.psyGen import Transformation, CodedKern, Kern, InvokeSchedule, \ BuiltIn +from psyclone.psyir.backend.debug_writer import DebugWriter from psyclone.psyir.nodes import ACCDataDirective, ACCDirective, \ ACCEnterDataDirective, ACCKernelsDirective, ACCLoopDirective, \ ACCParallelDirective, ACCRoutineDirective, Assignment, CodeBlock, \ @@ -2677,15 +2678,14 @@ def validate(self, nodes, options): if var not in var_accesses.all_signatures: continue # For an access such as my_struct(ii)%my_array(ji) - # then - # if we're inside a loop over ii we'll actually need - # a loop to do the deep copy: + # then if we're inside a loop over it we'll actually + # need a loop to do the deep copy: # do ii = 1, N - # !$ acc data copyin(my_struct(ii)%my_array) + # !$acc data copyin(my_struct(ii)%my_array) # end do raise TransformationError( f"Data region contains a structure access " - f"'{node.name}' where component '{access.name}' " + f"'{DebugWriter()(sref)}' where component '{access.name}' " f"is an array and is iterated over (variable " f"'{var}'). Deep copying of data for structures " f"is only supported where the deepest " From a33dc806313ee5285caaa052adfa61c4e8e1fa7b Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Fri, 2 Jun 2023 09:33:08 +0100 Subject: [PATCH 08/56] #1396 get update() working --- src/psyclone/psyir/nodes/acc_clauses.py | 15 +- src/psyclone/psyir/nodes/acc_directives.py | 130 ++++++++++-------- src/psyclone/psyir/nodes/directive.py | 7 +- src/psyclone/psyir/nodes/node.py | 29 +++- .../tests/psyir/backend/psyir_openacc_test.py | 6 +- 5 files changed, 114 insertions(+), 73 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_clauses.py b/src/psyclone/psyir/nodes/acc_clauses.py index 5f4b6b2785..ce4056dcba 100644 --- a/src/psyclone/psyir/nodes/acc_clauses.py +++ b/src/psyclone/psyir/nodes/acc_clauses.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2022, Science and Technology Facilities Council. +# Copyright (c) 2022-2023, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -44,7 +44,8 @@ class ACCCopyClause(Clause): ''' OpenACC copy clause. Specifies a list of variables that are to be copied - to the device and the start of a region and back again at the end. + to the device at the start of the associated region and back to the host + at the end. ''' _children_valid_format = "Reference" @@ -55,7 +56,7 @@ class ACCCopyClause(Clause): def _validate_child(position, child): ''' Decides whether a given child and position are valid for this node. - Any number of children allowed, all of type Reference. + Any number of children are allowed, all of type Reference. :param int position: the position to be validated. :param child: a child to be validated. @@ -71,7 +72,7 @@ def _validate_child(position, child): class ACCCopyInClause(Clause): ''' OpenACC copy clause. Specifies a list of variables that are to be copied - to the device and the start of a region and back again at the end. + to the device at the start of a region. ''' _children_valid_format = "Reference" @@ -82,7 +83,7 @@ class ACCCopyInClause(Clause): def _validate_child(position, child): ''' Decides whether a given child and position are valid for this node. - Any number of children allowed, all of type Reference. + Any number of children are allowed, all of type Reference. :param int position: the position to be validated. :param child: a child to be validated. @@ -98,7 +99,7 @@ def _validate_child(position, child): class ACCCopyOutClause(Clause): ''' OpenACC copy clause. Specifies a list of variables that are to be copied - to the device and the start of a region and back again at the end. + from the device to the host at the end of the associated region. ''' _children_valid_format = "Reference" @@ -109,7 +110,7 @@ class ACCCopyOutClause(Clause): def _validate_child(position, child): ''' Decides whether a given child and position are valid for this node. - Any number of children allowed, all of type Reference. + Any number of children are allowed, all of type Reference. :param int position: the position to be validated. :param child: a child to be validated. diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index fa247880d1..2b8d96ab55 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -541,8 +541,6 @@ class ACCKernelsDirective(ACCRegionDirective): :param bool default_present: whether or not to add the "default(present)" \ clause to the kernels directive. - :raises NotImplementedError: if default_present is False. - ''' def __init__(self, children=None, parent=None, default_present=True): super().__init__(children=children, parent=parent) @@ -629,61 +627,19 @@ class ACCDataDirective(ACCRegionDirective): ''' def __init__(self, children=None, parent=None): + self._under_construction = True super().__init__(children=children, parent=parent) self._parent_loop_vars = [] - cursor = self.ancestor(Loop) - while cursor: - self._parent_loop_vars.append(cursor.variable) - cursor = cursor.ancestor(Loop) - - # Identify the inputs and outputs to the region (variables that - # are read and written). - var_accesses = VariablesAccessInfo(children) - table = self.scope.symbol_table - readers = set() - writers = set() - for signature in var_accesses.all_signatures: - sym = table.lookup(signature.var_name) - accesses = var_accesses[signature] - if isinstance(sym.datatype, ScalarType): - # We ignore scalars as these are passed by value when OpenACC - # kernels are launched. - continue - if accesses.is_read(): - readers.add(signature) - if accesses.is_written(): - writers.add(signature) - readwrites = readers.intersection(writers) - # Are any of the read-writes written before they are read? - for signature in list(readwrites)[:]: - accesses = var_accesses[signature] - if accesses[0].access_type == AccessType.WRITE: - # First access is a write so treat as a write - writers.add(signature) - readers.discard(signature) - readwrites.discard(signature) - readers_list = sorted(list(readers - readwrites)) - writers_list = sorted(list(writers - readwrites)) - readwrites_list = sorted(list(readwrites)) + self._under_construction = False + self._in_update = False + self.update() - # We now need to create PSyIR references for all of the signatures - # and add them as children of the appropriate clauses. - nodes_dict = OrderedDict() - for sig in readers_list: - self.sig2ref(var_accesses, sig, nodes_dict) - if nodes_dict: - self.addchild(ACCCopyInClause(children=list(nodes_dict.values()))) - nodes_dict = OrderedDict() - for sig in writers_list: - self.sig2ref(var_accesses, sig, nodes_dict) - if nodes_dict: - self.addchild(ACCCopyOutClause(children=list(nodes_dict.values()))) - nodes_dict = OrderedDict() - for sig in readwrites_list: - self.sig2ref(var_accesses, sig, nodes_dict) - if nodes_dict: - self.addchild(ACCCopyClause(children=list(nodes_dict.values()))) + def _refine_copy(self, other): + ''' ''' + self._under_construction = True + super()._refine_copy(other) + self._under_construction = False @staticmethod def sig2ref(var_accesses, sig, refs_dict): @@ -741,7 +697,6 @@ def sig2ref(var_accesses, sig, refs_dict): *base_args, members) return refs_dict - if isinstance(node, Kern): if sig not in refs_dict: refs_dict[sig] = Reference(node.scope.symbol_table.lookup( @@ -879,6 +834,73 @@ def end_string(self): ''' return "acc end data" + def update(self): + ''' + ''' + if self._under_construction or self._in_update: + return + self._in_update = True + + cursor = self.ancestor(Loop) + while cursor: + self._parent_loop_vars.append(cursor.variable) + cursor = cursor.ancestor(Loop) + + # Remove the clauses that we will update. + for child in self.children[:]: + if isinstance(child, + (ACCCopyInClause, ACCCopyOutClause, ACCCopyClause)): + self.children.remove(child) + + # Identify the inputs and outputs to the region (variables that + # are read and written). + var_accesses = VariablesAccessInfo(self.children) + table = self.scope.symbol_table + readers = set() + writers = set() + for signature in var_accesses.all_signatures: + sym = table.lookup(signature.var_name) + accesses = var_accesses[signature] + if isinstance(sym.datatype, ScalarType): + # We ignore scalars as these are passed by value when OpenACC + # kernels are launched. + continue + if accesses.is_read(): + readers.add(signature) + if accesses.is_written(): + writers.add(signature) + readwrites = readers.intersection(writers) + # Are any of the read-writes written before they are read? + for signature in list(readwrites)[:]: + accesses = var_accesses[signature] + if accesses[0].access_type == AccessType.WRITE: + # First access is a write so treat as a write + writers.add(signature) + readers.discard(signature) + readwrites.discard(signature) + readers_list = sorted(list(readers - readwrites)) + writers_list = sorted(list(writers - readwrites)) + readwrites_list = sorted(list(readwrites)) + + # We now need to create PSyIR references for all of the signatures + # and add them as children of the appropriate clauses. + nodes_dict = OrderedDict() + for sig in readers_list: + self.sig2ref(var_accesses, sig, nodes_dict) + if nodes_dict: + self.addchild(ACCCopyInClause(children=list(nodes_dict.values()))) + nodes_dict = OrderedDict() + for sig in writers_list: + self.sig2ref(var_accesses, sig, nodes_dict) + if nodes_dict: + self.addchild(ACCCopyOutClause(children=list(nodes_dict.values()))) + nodes_dict = OrderedDict() + for sig in readwrites_list: + self.sig2ref(var_accesses, sig, nodes_dict) + if nodes_dict: + self.addchild(ACCCopyClause(children=list(nodes_dict.values()))) + self._in_update = False + class ACCUpdateDirective(ACCStandaloneDirective): ''' Class representing the OpenACC update directive in the PSyIR. It has diff --git a/src/psyclone/psyir/nodes/directive.py b/src/psyclone/psyir/nodes/directive.py index e6aab441a0..ef49b5b1df 100644 --- a/src/psyclone/psyir/nodes/directive.py +++ b/src/psyclone/psyir/nodes/directive.py @@ -91,9 +91,12 @@ class RegionDirective(Directive): _children_valid_format = "Schedule" def __init__(self, ast=None, children=None, parent=None): + super().__init__(ast, parent=parent) # A Directive always contains a Schedule - sched = Schedule(children=children, parent=self) - super().__init__(ast, children=[sched], parent=parent) + sched = Schedule(ast, parent=self) + self.addchild(sched) + if children: + sched.children.extend(children) @staticmethod def _validate_child(position, child): diff --git a/src/psyclone/psyir/nodes/node.py b/src/psyclone/psyir/nodes/node.py index 7084373ef0..766d27d4c6 100644 --- a/src/psyclone/psyir/nodes/node.py +++ b/src/psyclone/psyir/nodes/node.py @@ -95,7 +95,7 @@ class ChildrenList(list): a callback function that allows the validation of the inserted children. Since this is a subclass of the standard list, all operations (e.g. append, insert, extend, comparisons, list arithmetic operations) are conserved and - making use of the validation. + make use of the validation. :param node: reference to the node where the list belongs. :type node: :py:class:`psyclone.psyir.nodes.Node` @@ -206,6 +206,7 @@ def append(self, item): self._check_is_orphan(item) super(ChildrenList, self).append(item) self._set_parent_link(item) + self._node_reference.update() def __setitem__(self, index, item): ''' Extends list __setitem__ method with children node validation. @@ -220,6 +221,7 @@ def __setitem__(self, index, item): self._del_parent_link(self[index]) super(ChildrenList, self).__setitem__(index, item) self._set_parent_link(item) + self._node_reference.update() def insert(self, index, item): ''' Extends list insert method with children node validation. @@ -237,6 +239,7 @@ def insert(self, index, item): self._validate_item(position + 1, self[position]) super(ChildrenList, self).insert(index, item) self._set_parent_link(item) + self._node_reference.update() def extend(self, items): ''' Extends list extend method with children node validation. @@ -251,6 +254,7 @@ def extend(self, items): super(ChildrenList, self).extend(items) for item in items: self._set_parent_link(item) + self._node_reference.update() # Methods below don't insert elements but have the potential to displace # or change the order of the items in-place. @@ -265,6 +269,7 @@ def __delitem__(self, index): self._validate_item(position - 1, self[position]) self._del_parent_link(self[index]) super(ChildrenList, self).__delitem__(index) + self._node_reference.update() def remove(self, item): ''' Extends list remove method with children node validation. @@ -277,6 +282,7 @@ def remove(self, item): self._validate_item(position - 1, self[position]) self._del_parent_link(item) super(ChildrenList, self).remove(item) + self._node_reference.update() def pop(self, index=-1): ''' Extends list pop method with children node validation. @@ -293,13 +299,18 @@ def pop(self, index=-1): for position in range(positiveindex + 1, len(self)): self._validate_item(position - 1, self[position]) self._del_parent_link(self[index]) - return super(ChildrenList, self).pop(index) + obj = super(ChildrenList, self).pop(index) + self._node_reference.update() + return obj def reverse(self): ''' Extends list reverse method with children node validation. ''' for index, item in enumerate(self): self._validate_item(len(self) - index - 1, item) super(ChildrenList, self).reverse() + # Reversing the order of e.g. Statements may alter the read/write + # properties of any References. + self._node_reference.update() class Node(): @@ -340,10 +351,6 @@ class Node(): _colour = None def __init__(self, ast=None, children=None, parent=None, annotations=None): - self._children = ChildrenList(self, self._validate_child, - self._children_valid_format) - if children: - self._children.extend(children) if parent and not isinstance(parent, Node): raise TypeError(f"The parent of a Node must also be a Node but " f"got '{type(parent).__name__}'") @@ -353,6 +360,10 @@ def __init__(self, ast=None, children=None, parent=None, annotations=None): # will become False. self._has_constructor_parent = parent is not None self._parent = parent + self._children = ChildrenList(self, self._validate_child, + self._children_valid_format) + if children: + self._children.extend(children) # Reference into fparser2 AST (if any) self._ast = ast # Ref. to last fparser2 parse tree node associated with this Node. @@ -1456,6 +1467,12 @@ def debug_string(self): from psyclone.psyir.backend.debug_writer import DebugWriter return DebugWriter()(self) + def update(self): + ''' + ''' + if self.parent: + self.parent.update() + # For automatic documentation generation # TODO #913 the 'colored' routine shouldn't be in this module. diff --git a/src/psyclone/tests/psyir/backend/psyir_openacc_test.py b/src/psyclone/tests/psyir/backend/psyir_openacc_test.py index 1b12fe5493..b7a83b372e 100644 --- a/src/psyclone/tests/psyir/backend/psyir_openacc_test.py +++ b/src/psyclone/tests/psyir/backend/psyir_openacc_test.py @@ -80,8 +80,6 @@ # ---------------------------------------------------------------------------- -@pytest.mark.xfail(reason="ACCDataDirective clauses are not updated when " - "tree is modified - TODO.") def test_acc_data_region(fortran_reader, fortran_writer): ''' Test that an ACCDataDirective node generates the expected code. ''' # Generate PSyIR from Fortran code. @@ -90,7 +88,7 @@ def test_acc_data_region(fortran_reader, fortran_writer): dtrans = ACCDataTrans() dtrans.apply(sched) result = fortran_writer(sched) - assert (" !$acc data copyin(d) copyout(c) copy(b)\n" + assert (" !$acc data copyin(d), copyout(c), copy(b)\n" " do i = 1, 20, 2\n" in result) assert (" enddo\n" " !$acc end data\n" in result) @@ -98,7 +96,7 @@ def test_acc_data_region(fortran_reader, fortran_writer): # Remove the read from array 'd' assigns[0].detach() result = fortran_writer(sched) - assert (" !$acc data copyout(c) copy(b)\n" + assert (" !$acc data copyout(c), copy(b)\n" " do i = 1, 20, 2\n" in result) # Remove the readwrite of array 'b' assigns[2].detach() From aa4267a471083d160888c5b978aceaaa8fa843cd Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Tue, 6 Jun 2023 09:13:37 +0100 Subject: [PATCH 09/56] #1396 update header on acc_directives_test --- src/psyclone/tests/psyir/nodes/acc_directives_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/psyclone/tests/psyir/nodes/acc_directives_test.py b/src/psyclone/tests/psyir/nodes/acc_directives_test.py index e12b935f09..b8874b64fa 100644 --- a/src/psyclone/tests/psyir/nodes/acc_directives_test.py +++ b/src/psyclone/tests/psyir/nodes/acc_directives_test.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2021-2022, Science and Technology Facilities Council. +# Copyright (c) 2021-2023, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -38,7 +38,6 @@ ''' Performs py.test tests on the OpenACC PSyIR Directive nodes. ''' -from __future__ import absolute_import import os import pytest From f6cb6989535f002b8f43997888f2b3d7f26d04b1 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 7 Jun 2023 09:46:02 +0100 Subject: [PATCH 10/56] #1396 move some needed functionality into core/dependence-analysis --- src/psyclone/psyir/nodes/acc_directives.py | 165 ++++--------------- src/psyclone/psyir/tools/dependency_tools.py | 26 ++- src/psyclone/psyir/tools/read_write_info.py | 20 ++- 3 files changed, 71 insertions(+), 140 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index 4f7f94f2c3..66a63066e7 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -643,19 +643,23 @@ def _refine_copy(self, other): self._under_construction = False @staticmethod - def sig2ref(var_accesses, sig, refs_dict): + def sig2ref(var_accesses, table, sig, refs_dict): ''' - Update the supplied dict of accesses with those required by the - supplied signature. + Examines the supplied Signature and creates the References required + in order to access it. These are added to the supplied dictionary. - :param var_accesses: + :param var_accesses: object holding information on the accesses + relating to the supplied signature. :type var_accesses: :py:class:`psyclone.core.VariablesAccessInfo` - :param sig: + :param table: the most local symbol table. + :type table: :py:class:`psyclone.psyir.symbols.SymbolTable` + :param sig: the Signature to process for accesses. :type sig: :py:class:`psyclone.core.Signature` :param OrderedDict refs_dict: the dict of accesses to update. - :raises NotImplementedError: if a non-leaf structure component is \ - iterated over, e.g. a(i)%b. + :raises NotImplementedError: if a non-leaf structure component is + iterated over, e.g. a(i)%b. + ''' from psyclone.core.signature import Signature from psyclone.psyir.nodes.structure_reference import StructureReference @@ -665,6 +669,9 @@ def sig2ref(var_accesses, sig, refs_dict): from psyclone.psyGen import Kern node = var_accesses[sig].all_accesses[0].node + sym = table.lookup(sig.var_name) + if isinstance(sym.datatype, ScalarType): + return if isinstance(node, StructureReference): @@ -704,6 +711,7 @@ def sig2ref(var_accesses, sig, refs_dict): str(sig))) # TODO lookup array bounds here. + # if isinstance(node, ArrayReference): xxxxx if sig not in refs_dict: refs_dict[sig] = Reference(node.symbol) @@ -728,104 +736,12 @@ def _validate_child(position, child): ACCCopyOutClause)) def begin_string(self): - '''Returns the beginning statement of this directive, i.e. - "acc data". The backend is responsible for adding the - correct directive beginning (e.g. "!$"). - - :returns: the opening statement of this directive. + ''' + :returns: the beginning of the opening statement of this directive. :rtype: str - TODO #1396 - remove this whole method in favour of having the - visitor backend generate the code. - - ''' - def _create_access_list(signatures, var_accesses): - ''' - Constructs a list of variables for inclusion in a data-access - clause. - - :param signatures: the list of Signatures for which to create \ - entries in the list. - :type signatures: List[:py:class:`psyclone.core.Signature`] - :param var_accesses: object holding details on all variable \ - accesses in the region to which the data-access clause applies. - :type var_accesses: :py:class:`psyclone.core.VariablesAccessInfo` - - :returns: list of variable accesses. - :rtype: List[str] - - ''' - access_list = [] - for sig in signatures: - if sig.is_structure: - # We have to do a 'deep copy' of any structure access. This - # means that if we have an access `a%b%c(i)` then we need - # to copy `a`, `a%b` and then `a%b%c`. - # Look up a PSyIR node that corresponds to this access. - current = var_accesses[sig].all_accesses[0].node - part_list = [current.name] - if current.name not in access_list: - access_list.append(current.name) - while hasattr(current, "member"): - current = current.member - # Currently this is hardwired to generate Fortran (i.e. - # we use '%' when accessing a component of a struct). - # TODO #1386 a new StructureReference needs to be - # created for 'current' and then given to an - # appropriate backend. - ref_string = "%".join(part_list[:]+[current.name]) - if ref_string not in access_list: - access_list.append(ref_string) - else: - ref_string = str(sig) - if ref_string not in access_list: - access_list.append(ref_string) - return access_list - - result = "acc data" - return result - # TODO delete the rest! - - # Identify the inputs and outputs to the region (variables that - # are read and written). - var_accesses = VariablesAccessInfo(self) - table = self.scope.symbol_table - readers = set() - writers = set() - for signature in var_accesses.all_signatures: - sym = table.lookup(signature.var_name) - accesses = var_accesses[signature] - if isinstance(sym.datatype, ScalarType): - # We ignore scalars as these are passed by value when OpenACC - # kernels are launched. - continue - if accesses.is_read(): - readers.add(signature) - if accesses.is_written(): - writers.add(signature) - readwrites = readers.intersection(writers) - # Are any of the read-writes written before they are read? - for signature in list(readwrites)[:]: - accesses = var_accesses[signature] - if accesses[0].access_type == AccessType.WRITE: - # First access is a write so treat as a write - writers.add(signature) - readers.discard(signature) - readwrites.discard(signature) - readers_list = sorted(readers - readwrites) - writers_list = sorted(writers - readwrites) - readwrites_list = sorted(readwrites) - if readers_list: - result += f""" copyin({",".join( - _create_access_list(readers_list, var_accesses))})""" - if writers_list: - result += f""" copyout({",".join( - _create_access_list(writers_list, var_accesses))})""" - if readwrites_list: - result += f""" copy({",".join( - _create_access_list(readwrites_list, var_accesses))})""" - - return result + ''' + return "acc data" def end_string(self): ''' @@ -837,6 +753,7 @@ def end_string(self): def update(self): ''' + Called whenever there is a change in the PSyIR tree below this node. ''' if self._under_construction or self._in_update: return @@ -855,49 +772,33 @@ def update(self): # Identify the inputs and outputs to the region (variables that # are read and written). - var_accesses = VariablesAccessInfo(self.children) + from psyclone.psyir.tools import DependencyTools + dtools = DependencyTools() table = self.scope.symbol_table - readers = set() - writers = set() - for signature in var_accesses.all_signatures: - sym = table.lookup(signature.var_name) - accesses = var_accesses[signature] - if isinstance(sym.datatype, ScalarType): - # We ignore scalars as these are passed by value when OpenACC - # kernels are launched. - continue - if accesses.is_read(): - readers.add(signature) - if accesses.is_written(): - writers.add(signature) - readwrites = readers.intersection(writers) - # Are any of the read-writes written before they are read? - for signature in list(readwrites)[:]: - accesses = var_accesses[signature] - if accesses[0].access_type == AccessType.WRITE: - # First access is a write so treat as a write - writers.add(signature) - readers.discard(signature) - readwrites.discard(signature) - readers_list = sorted(list(readers - readwrites)) - writers_list = sorted(list(writers - readwrites)) - readwrites_list = sorted(list(readwrites)) + in_outs = dtools.get_in_out_parameters(self.children) + var_accesses = dtools.variable_access_info + readers = in_outs.signatures_read + writers = in_outs.signatures_written + readwrites_list = in_outs.signatures_readwrite + readwrites = set(readwrites_list) + readers_list = sorted(list(set(readers) - readwrites)) + writers_list = sorted(list(set(writers) - readwrites)) # We now need to create PSyIR references for all of the signatures # and add them as children of the appropriate clauses. nodes_dict = OrderedDict() for sig in readers_list: - self.sig2ref(var_accesses, sig, nodes_dict) + self.sig2ref(var_accesses, table, sig, nodes_dict) if nodes_dict: self.addchild(ACCCopyInClause(children=list(nodes_dict.values()))) nodes_dict = OrderedDict() for sig in writers_list: - self.sig2ref(var_accesses, sig, nodes_dict) + self.sig2ref(var_accesses, table, sig, nodes_dict) if nodes_dict: self.addchild(ACCCopyOutClause(children=list(nodes_dict.values()))) nodes_dict = OrderedDict() for sig in readwrites_list: - self.sig2ref(var_accesses, sig, nodes_dict) + self.sig2ref(var_accesses, table, sig, nodes_dict) if nodes_dict: self.addchild(ACCCopyClause(children=list(nodes_dict.values()))) self._in_update = False diff --git a/src/psyclone/psyir/tools/dependency_tools.py b/src/psyclone/psyir/tools/dependency_tools.py index 83e5987e48..81fa99b88a 100644 --- a/src/psyclone/psyir/tools/dependency_tools.py +++ b/src/psyclone/psyir/tools/dependency_tools.py @@ -167,6 +167,8 @@ def __init__(self, loop_types_to_parallelise=None, else: self._language_writer = language_writer self._clear_messages() + # Cache to hold most recently generated VariablesAccessInfo. + self._var_access_info = None # ------------------------------------------------------------------------- def _clear_messages(self): @@ -766,7 +768,7 @@ def can_loop_be_parallelised(self, loop, # Appropriate messages will have been added already, so just exit return False - var_accesses = VariablesAccessInfo(loop) + self._var_access_info = VariablesAccessInfo(loop) if not signatures_to_ignore: signatures_to_ignore = [] @@ -775,7 +777,7 @@ def can_loop_be_parallelised(self, loop, result = True # Now check all variables used in the loop - for signature in var_accesses.all_signatures: + for signature in self._var_access_info.all_signatures: # This string contains derived type information, e.g. # "a%b" var_string = str(signature) @@ -789,7 +791,7 @@ def can_loop_be_parallelised(self, loop, # This returns the first component of the signature, # i.e. in case of "a%b" it will only return "a" var_name = signature.var_name - var_info = var_accesses[signature] + var_info = self._var_access_info[signature] symbol_table = loop.scope.symbol_table symbol = symbol_table.lookup(var_name) # TODO #1270 - the is_array_access function might be moved @@ -839,6 +841,7 @@ def get_input_parameters(self, read_write_info, node_list, # Collect the information about all variables used: if not variables_info: variables_info = VariablesAccessInfo(node_list, options=options) + self._var_access_info = variables_info for signature in variables_info.all_signatures: # If the first access is a write, the variable is not an input @@ -876,6 +879,7 @@ def get_output_parameters(self, read_write_info, node_list, # Collect the information about all variables used: if not variables_info: variables_info = VariablesAccessInfo(node_list, options=options) + self._var_access_info = variables_info for signature in variables_info.all_signatures: if variables_info.is_written(signature): @@ -904,8 +908,18 @@ def get_in_out_parameters(self, node_list, options=None): :rtype: :py:class:`psyclone.psyir.tools.ReadWriteInfo` ''' - variables_info = VariablesAccessInfo(node_list, options=options) + self._var_access_info = VariablesAccessInfo(node_list, options=options) read_write_info = ReadWriteInfo() - self.get_input_parameters(read_write_info, node_list, variables_info) - self.get_output_parameters(read_write_info, node_list, variables_info) + self.get_input_parameters(read_write_info, node_list, + self._var_access_info) + self.get_output_parameters(read_write_info, node_list, + self._var_access_info) return read_write_info + + @property + def variable_access_info(self): + ''' + :returns: the most-recently collected information on variable accesses. + :rtype: :py:class:`psyclone.core.VariablesAccessInfo` + ''' + return self._var_access_info diff --git a/src/psyclone/psyir/tools/read_write_info.py b/src/psyclone/psyir/tools/read_write_info.py index 50ae78a51d..1e20922940 100644 --- a/src/psyclone/psyir/tools/read_write_info.py +++ b/src/psyclone/psyir/tools/read_write_info.py @@ -31,7 +31,8 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # ----------------------------------------------------------------------------- -# Author J. Henrichs, Bureau of Meteorology +# Authors: J. Henrichs, Bureau of Meteorology +# A. R. Porter, STFC Daresbury Lab # ----------------------------------------------------------------------------- ''' This module provides the class to store information about which variables @@ -100,12 +101,27 @@ def write_list(self): def signatures_written(self): '''Convenience function to return only the signatures written. - :returns the list of all signatures written. + :returns: the list of all signatures written. :rtype: List[:py:class:`psyclone.core.Signature`] ''' return [sig for _, sig in self.write_list] + # ------------------------------------------------------------------------- + @property + def signatures_readwrite(self): + '''Convenience function to return only those signatures that have + read-write access (i.e. read before write). + + :returns: the sorted list of all signatures with read-write access. + :rtype: List[:py:class:`psyclone.core.Signature`] + + ''' + readers = set(sig for _, sig in self._read_list) + writers = set(sig for _, sig in self._write_list) + readwrites = readers.intersection(writers) + return sorted(list(readwrites)) + # ------------------------------------------------------------------------- @property def set_of_all_used_vars(self): From a1541af6575574fc8213e9a62733a4f4126cf537 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 7 Jun 2023 10:29:00 +0100 Subject: [PATCH 11/56] #1396 tidying of imports and docstrings --- src/psyclone/psyir/nodes/acc_directives.py | 14 ++++++---- src/psyclone/transformations.py | 32 ++++++++++++---------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index 66a63066e7..67673c31ca 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -44,7 +44,7 @@ import abc from collections import OrderedDict -from psyclone.core import AccessType, VariablesAccessInfo, Signature +from psyclone.core import Signature from psyclone.f2pygen import DirectiveGen, CommentGen from psyclone.errors import GenerationError, InternalError from psyclone.psyir.nodes.acc_clauses import (ACCCopyClause, ACCCopyInClause, @@ -55,10 +55,11 @@ from psyclone.psyir.nodes.directive import StandaloneDirective, \ RegionDirective from psyclone.psyir.nodes.loop import Loop +from psyclone.psyir.nodes.psy_data_node import PSyDataNode from psyclone.psyir.nodes.reference import Reference from psyclone.psyir.nodes.routine import Routine from psyclone.psyir.nodes.schedule import Schedule -from psyclone.psyir.nodes.psy_data_node import PSyDataNode +from psyclone.psyir.nodes.structure_reference import StructureReference from psyclone.psyir.symbols import ScalarType @@ -661,8 +662,6 @@ def sig2ref(var_accesses, table, sig, refs_dict): iterated over, e.g. a(i)%b. ''' - from psyclone.core.signature import Signature - from psyclone.psyir.nodes.structure_reference import StructureReference # Having this import at the top level causes a circular dependency due # to psyGen importing FortranWriter at the top level. # pylint: disable=import-outside-toplevel @@ -671,6 +670,8 @@ def sig2ref(var_accesses, table, sig, refs_dict): node = var_accesses[sig].all_accesses[0].node sym = table.lookup(sig.var_name) if isinstance(sym.datatype, ScalarType): + # We ignore scalars as these are copied by value when launching + # kernels. return if isinstance(node, StructureReference): @@ -710,8 +711,9 @@ def sig2ref(var_accesses, table, sig, refs_dict): refs_dict[sig] = Reference(node.scope.symbol_table.lookup( str(sig))) - # TODO lookup array bounds here. - # if isinstance(node, ArrayReference): xxxxx + # TODO #1396 - in languages such as C++ it will be necessary to + # supply the extent of an array that is being accessed. For now we + # only supply a Reference (which is sufficient in Fortran). if sig not in refs_dict: refs_dict[sig] = Reference(node.symbol) diff --git a/src/psyclone/transformations.py b/src/psyclone/transformations.py index 5dd1fa6740..5b30fa04ec 100644 --- a/src/psyclone/transformations.py +++ b/src/psyclone/transformations.py @@ -47,6 +47,7 @@ from psyclone import psyGen from psyclone.configuration import Config +from psyclone.core import Signature, VariablesAccessInfo from psyclone.domain.lfric import KernCallArgList, LFRicConstants from psyclone.dynamo0p3 import DynHaloExchangeEnd, DynHaloExchangeStart, \ DynInvokeSchedule, DynKern @@ -64,6 +65,9 @@ OMPParallelDirective, OMPParallelDoDirective, OMPSerialDirective, \ OMPSingleDirective, OMPTaskloopDirective, PSyDataNode, Reference, \ Return, Routine, Schedule +from psyclone.psyir.nodes.array_mixin import ArrayMixin +from psyclone.psyir.nodes.structure_member import StructureMember +from psyclone.psyir.nodes.structure_reference import StructureReference from psyclone.psyir.symbols import ArgumentInterface, DataSymbol, \ DeferredType, INTEGER_TYPE, ScalarType, Symbol, SymbolError from psyclone.psyir.transformations.loop_trans import LoopTrans @@ -2623,15 +2627,18 @@ def validate(self, nodes, options): of nodes. :param nodes: the proposed node(s) to enclose in a data region. - :type nodes: (list of) subclasses of \ - :py:class:`psyclone.psyir.nodes.Node` + :type nodes: List[:py:class:`psyclone.psyir.nodes.Node`] | + :py:class:`psyclone.psyir.nodes.Node` :param options: a dictionary with options for transformations. :type options: Optional[Dict[str, Any]] - :raises TransformationError: if the Schedule to which the nodes \ - belong already has an 'enter data' directive. - :raises TransformationError: if any of the nodes are themselves \ - data directives. + :raises TransformationError: if the Schedule to which the nodes + belong already has an 'enter data' directive. + :raises TransformationError: if any of the nodes are themselves + data directives. + :raises TransformationError: if an array of structures needs to be + deep copied (this is not currently supported). + ''' # Ensure we are always working with a list of nodes, even if only # one was supplied via the `nodes` argument. @@ -2647,13 +2654,8 @@ def validate(self, nodes, options): raise TransformationError( "Cannot add an OpenACC data region to a schedule that " "already contains an 'enter data' directive.") - from psyclone.psyir.nodes.array_mixin import ArrayMixin - from psyclone.psyir.nodes.structure_member import StructureMember - from psyclone.core.signature import Signature - from psyclone.core import VariablesAccessInfo # Check that we don't have any accesses to arrays of derived types # that we can't yet deep copy. - from psyclone.psyir.nodes import StructureReference for node in node_list: for sref in node.walk(StructureReference): @@ -2685,10 +2687,10 @@ def validate(self, nodes, options): # end do raise TransformationError( f"Data region contains a structure access " - f"'{DebugWriter()(sref)}' where component '{access.name}' " - f"is an array and is iterated over (variable " - f"'{var}'). Deep copying of data for structures " - f"is only supported where the deepest " + f"'{DebugWriter()(sref)}' where component " + f"'{access.name}' is an array and is iterated over" + f" (variable '{var}'). Deep copying of data for " + f"structures is only supported where the deepest " f"component is the one being iterated over.") From 197f0f42d59582b3265d81da6a9cb54da9aed9b7 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 7 Jun 2023 11:26:30 +0100 Subject: [PATCH 12/56] #1396 tidy implementation and docstrings --- src/psyclone/psyir/nodes/acc_directives.py | 59 ++++++++++++++-------- src/psyclone/psyir/nodes/directive.py | 8 +-- src/psyclone/psyir/nodes/node.py | 53 +++++++++++-------- 3 files changed, 73 insertions(+), 47 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index 67673c31ca..f398250ce1 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -54,7 +54,6 @@ from psyclone.psyir.nodes.codeblock import CodeBlock from psyclone.psyir.nodes.directive import StandaloneDirective, \ RegionDirective -from psyclone.psyir.nodes.loop import Loop from psyclone.psyir.nodes.psy_data_node import PSyDataNode from psyclone.psyir.nodes.reference import Reference from psyclone.psyir.nodes.routine import Routine @@ -629,19 +628,25 @@ class ACCDataDirective(ACCRegionDirective): ''' def __init__(self, children=None, parent=None): - self._under_construction = True + self._disable_tree_update = True super().__init__(children=children, parent=parent) - self._parent_loop_vars = [] - self._under_construction = False - self._in_update = False - self.update() + self._disable_tree_update = False + self.tree_update() def _refine_copy(self, other): - ''' ''' - self._under_construction = True + ''' + Overrides the base implementation to ensure that tree-updating is + disabled during this operation (since it is a copy we know we + don't need to change the tree structure). + + :param other: the object we are copying from. + :type other: :py:class:`psyclone.psyir.node.Node` + + ''' + self._disable_tree_update = True super()._refine_copy(other) - self._under_construction = False + self._disable_tree_update = False @staticmethod def sig2ref(var_accesses, table, sig, refs_dict): @@ -704,7 +709,7 @@ def sig2ref(var_accesses, table, sig, refs_dict): members = list(zip(member_sig[1:depth+1], new_lists)) refs_dict[member_sig[:depth+1]] = base_cls.create( *base_args, members) - return refs_dict + return if isinstance(node, Kern): if sig not in refs_dict: @@ -731,6 +736,17 @@ def gen_code(self, _): @staticmethod def _validate_child(position, child): ''' + Check that the supplied node is a valid child of this node at the + specified position. + + :param int position: the proposed position of this child in the list + of children. + :param child: the proposed child node. + :type child: :py:class:`psyclone.psyir.nodes.Node` + + :returns: whether or not the proposed child and position are valid. + :rtype: bool + ''' if position == 0: return isinstance(child, Schedule) @@ -741,7 +757,6 @@ def begin_string(self): ''' :returns: the beginning of the opening statement of this directive. :rtype: str - ''' return "acc data" @@ -753,18 +768,17 @@ def end_string(self): ''' return "acc end data" - def update(self): + def tree_update(self): ''' Called whenever there is a change in the PSyIR tree below this node. + This may mean that the various copy[in/out] clauses need updating if + the contents of the data region have changed. + ''' - if self._under_construction or self._in_update: + # Ensure that this method does not get called recursively. + if self._disable_tree_update: return - self._in_update = True - - cursor = self.ancestor(Loop) - while cursor: - self._parent_loop_vars.append(cursor.variable) - cursor = cursor.ancestor(Loop) + self._disable_tree_update = True # Remove the clauses that we will update. for child in self.children[:]: @@ -774,6 +788,7 @@ def update(self): # Identify the inputs and outputs to the region (variables that # are read and written). + # pylint: disable=import-outside-toplevel from psyclone.psyir.tools import DependencyTools dtools = DependencyTools() table = self.scope.symbol_table @@ -803,7 +818,11 @@ def update(self): self.sig2ref(var_accesses, table, sig, nodes_dict) if nodes_dict: self.addchild(ACCCopyClause(children=list(nodes_dict.values()))) - self._in_update = False + + # Mark that we've left this method. + self._disable_tree_update = False + # Propagate any changes on up the tree. + super().tree_update() class ACCUpdateDirective(ACCStandaloneDirective): diff --git a/src/psyclone/psyir/nodes/directive.py b/src/psyclone/psyir/nodes/directive.py index ef49b5b1df..77e6041257 100644 --- a/src/psyclone/psyir/nodes/directive.py +++ b/src/psyclone/psyir/nodes/directive.py @@ -91,12 +91,8 @@ class RegionDirective(Directive): _children_valid_format = "Schedule" def __init__(self, ast=None, children=None, parent=None): - super().__init__(ast, parent=parent) - # A Directive always contains a Schedule - sched = Schedule(ast, parent=self) - self.addchild(sched) - if children: - sched.children.extend(children) + sched = Schedule(children=children, parent=self) + super().__init__(ast, children=[sched], parent=parent) @staticmethod def _validate_child(position, child): diff --git a/src/psyclone/psyir/nodes/node.py b/src/psyclone/psyir/nodes/node.py index 766d27d4c6..d23ee22fdb 100644 --- a/src/psyclone/psyir/nodes/node.py +++ b/src/psyclone/psyir/nodes/node.py @@ -95,7 +95,10 @@ class ChildrenList(list): a callback function that allows the validation of the inserted children. Since this is a subclass of the standard list, all operations (e.g. append, insert, extend, comparisons, list arithmetic operations) are conserved and - make use of the validation. + make use of the validation. They also trigger an update of all ancestor + nodes so that action can be taken in order to keep the tree consistent when + necessary (e.g. to update the data-movement clauses on an OpenACC data + region). :param node: reference to the node where the list belongs. :type node: :py:class:`psyclone.psyir.nodes.Node` @@ -106,7 +109,7 @@ class ChildrenList(list): ''' def __init__(self, node, validation_function, validation_text): - super(ChildrenList, self).__init__() + super().__init__() self._node_reference = node self._validation_function = validation_function self._validation_text = validation_text @@ -204,9 +207,9 @@ def append(self, item): ''' self._validate_item(len(self), item) self._check_is_orphan(item) - super(ChildrenList, self).append(item) + super().append(item) self._set_parent_link(item) - self._node_reference.update() + self._node_reference.tree_update() def __setitem__(self, index, item): ''' Extends list __setitem__ method with children node validation. @@ -219,9 +222,9 @@ def __setitem__(self, index, item): self._validate_item(index, item) self._check_is_orphan(item) self._del_parent_link(self[index]) - super(ChildrenList, self).__setitem__(index, item) + super().__setitem__(index, item) self._set_parent_link(item) - self._node_reference.update() + self._node_reference.tree_update() def insert(self, index, item): ''' Extends list insert method with children node validation. @@ -237,9 +240,9 @@ def insert(self, index, item): # Check that all displaced items will still in valid positions for position in range(positiveindex, len(self)): self._validate_item(position + 1, self[position]) - super(ChildrenList, self).insert(index, item) + super().insert(index, item) self._set_parent_link(item) - self._node_reference.update() + self._node_reference.tree_update() def extend(self, items): ''' Extends list extend method with children node validation. @@ -251,10 +254,10 @@ def extend(self, items): for index, item in enumerate(items): self._validate_item(len(self) + index, item) self._check_is_orphan(item) - super(ChildrenList, self).extend(items) + super().extend(items) for item in items: self._set_parent_link(item) - self._node_reference.update() + self._node_reference.tree_update() # Methods below don't insert elements but have the potential to displace # or change the order of the items in-place. @@ -268,8 +271,8 @@ def __delitem__(self, index): for position in range(positiveindex + 1, len(self)): self._validate_item(position - 1, self[position]) self._del_parent_link(self[index]) - super(ChildrenList, self).__delitem__(index) - self._node_reference.update() + super().__delitem__(index) + self._node_reference.tree_update() def remove(self, item): ''' Extends list remove method with children node validation. @@ -281,8 +284,8 @@ def remove(self, item): for position in range(self.index(item) + 1, len(self)): self._validate_item(position - 1, self[position]) self._del_parent_link(item) - super(ChildrenList, self).remove(item) - self._node_reference.update() + super().remove(item) + self._node_reference.tree_update() def pop(self, index=-1): ''' Extends list pop method with children node validation. @@ -299,18 +302,18 @@ def pop(self, index=-1): for position in range(positiveindex + 1, len(self)): self._validate_item(position - 1, self[position]) self._del_parent_link(self[index]) - obj = super(ChildrenList, self).pop(index) - self._node_reference.update() + obj = super().pop(index) + self._node_reference.tree_update() return obj def reverse(self): ''' Extends list reverse method with children node validation. ''' for index, item in enumerate(self): self._validate_item(len(self) - index - 1, item) - super(ChildrenList, self).reverse() + super().reverse() # Reversing the order of e.g. Statements may alter the read/write # properties of any References. - self._node_reference.update() + self._node_reference.tree_update() class Node(): @@ -1467,11 +1470,19 @@ def debug_string(self): from psyclone.psyir.backend.debug_writer import DebugWriter return DebugWriter()(self) - def update(self): + def tree_update(self): ''' + Called when any of the nodes below this one in the tree are + changed. + + This default implementation simply propagates the notification up + the tree by calling the corresponding method on its parent. + ''' - if self.parent: - self.parent.update() + # If we're in the middle of constructing a Node then it's + # possible that it doesn't yet even have the _parent attribute. + if hasattr(self, "_parent") and self._parent: + self._parent.tree_update() # For automatic documentation generation From fd78e903c0d62fa214f3633a26211beda1d53b11 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 7 Jun 2023 11:28:52 +0100 Subject: [PATCH 13/56] #1396 revert directive.py --- src/psyclone/psyir/nodes/directive.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/psyclone/psyir/nodes/directive.py b/src/psyclone/psyir/nodes/directive.py index 77e6041257..e6aab441a0 100644 --- a/src/psyclone/psyir/nodes/directive.py +++ b/src/psyclone/psyir/nodes/directive.py @@ -91,6 +91,7 @@ class RegionDirective(Directive): _children_valid_format = "Schedule" def __init__(self, ast=None, children=None, parent=None): + # A Directive always contains a Schedule sched = Schedule(children=children, parent=self) super().__init__(ast, children=[sched], parent=parent) From 683d1768829eb62afb6c9cfc09e5b0fcf01b67fc Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 7 Jun 2023 15:01:03 +0100 Subject: [PATCH 14/56] #1396 improve testing --- src/psyclone/psyir/nodes/acc_directives.py | 28 +++++----- .../tests/psyir/nodes/acc_directives_test.py | 51 +++++++++++++++++-- 2 files changed, 61 insertions(+), 18 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index f398250ce1..326e135265 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -649,7 +649,7 @@ def _refine_copy(self, other): self._disable_tree_update = False @staticmethod - def sig2ref(var_accesses, table, sig, refs_dict): + def _sig2refs(var_accesses, table, sig, refs_dict): ''' Examines the supplied Signature and creates the References required in order to access it. These are added to the supplied dictionary. @@ -680,14 +680,19 @@ def sig2ref(var_accesses, table, sig, refs_dict): return if isinstance(node, StructureReference): + # We have to do a 'deep copy' of any structure access. This + # means that if we have an access `a%b%c(i)` then we need to + # copy `a`, `a%b` and then `a%b%c`. - member_sig, index_lists = node.get_signature_and_indices() + # A Signature does not contain indexing information so we must + # lookup a PSyIR node that corresponds to this access. + _, index_lists = node.get_signature_and_indices() if Signature(node.symbol.name) not in refs_dict: refs_dict[Signature(node.symbol.name)] = Reference(node.symbol) - for depth in range(1, len(member_sig)): - if member_sig[:depth+1] not in refs_dict: + for depth in range(1, len(sig)): + if sig[:depth+1] not in refs_dict: if node.is_array: base_cls = ArrayOfStructuresReference # Copy the indices so as not to modify the original @@ -706,16 +711,11 @@ def sig2ref(var_accesses, table, sig, refs_dict): for idx_list in index_lists[1:depth]: new_lists.append([idx.copy() for idx in idx_list]) new_lists.append([]) - members = list(zip(member_sig[1:depth+1], new_lists)) - refs_dict[member_sig[:depth+1]] = base_cls.create( + members = list(zip(sig[1:depth+1], new_lists)) + refs_dict[sig[:depth+1]] = base_cls.create( *base_args, members) return - if isinstance(node, Kern): - if sig not in refs_dict: - refs_dict[sig] = Reference(node.scope.symbol_table.lookup( - str(sig))) - # TODO #1396 - in languages such as C++ it will be necessary to # supply the extent of an array that is being accessed. For now we # only supply a Reference (which is sufficient in Fortran). @@ -805,17 +805,17 @@ def tree_update(self): # and add them as children of the appropriate clauses. nodes_dict = OrderedDict() for sig in readers_list: - self.sig2ref(var_accesses, table, sig, nodes_dict) + self._sig2refs(var_accesses, table, sig, nodes_dict) if nodes_dict: self.addchild(ACCCopyInClause(children=list(nodes_dict.values()))) nodes_dict = OrderedDict() for sig in writers_list: - self.sig2ref(var_accesses, table, sig, nodes_dict) + self._sig2refs(var_accesses, table, sig, nodes_dict) if nodes_dict: self.addchild(ACCCopyOutClause(children=list(nodes_dict.values()))) nodes_dict = OrderedDict() for sig in readwrites_list: - self.sig2ref(var_accesses, table, sig, nodes_dict) + self._sig2refs(var_accesses, table, sig, nodes_dict) if nodes_dict: self.addchild(ACCCopyClause(children=list(nodes_dict.values()))) diff --git a/src/psyclone/tests/psyir/nodes/acc_directives_test.py b/src/psyclone/tests/psyir/nodes/acc_directives_test.py index b8874b64fa..7cd640d875 100644 --- a/src/psyclone/tests/psyir/nodes/acc_directives_test.py +++ b/src/psyclone/tests/psyir/nodes/acc_directives_test.py @@ -47,11 +47,15 @@ from psyclone.f2pygen import ModuleGen from psyclone.parse.algorithm import parse from psyclone.psyGen import PSyFactory -from psyclone.psyir.nodes import ACCRoutineDirective, \ - ACCKernelsDirective, Schedule, ACCUpdateDirective, ACCLoopDirective +from psyclone.psyir.nodes import (ACCKernelsDirective, + ACCLoopDirective, + ACCRoutineDirective, + ACCUpdateDirective) +from psyclone.psyir.nodes.loop import Loop +from psyclone.psyir.nodes.schedule import Schedule from psyclone.psyir.symbols import SymbolTable -from psyclone.transformations import ACCEnterDataTrans, ACCParallelTrans, \ - ACCKernelsTrans +from psyclone.transformations import (ACCDataTrans, ACCEnterDataTrans, + ACCParallelTrans, ACCKernelsTrans) BASE_PATH = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname( os.path.abspath(__file__)))), "test_files", "dynamo0p3") @@ -389,3 +393,42 @@ def test_accupdatedirective_equality(): # Check equality fails when different if_present settings directive5 = ACCUpdateDirective(sig, "device", if_present=False) assert directive1 != directive5 + + +def test_accdatadirective_clauses(fortran_reader, fortran_writer): + '''Test that the data movement clauses are constructed correctly for the + ACCDataDirective class.''' + psyir = fortran_reader.psyir_from_source( + "program dtype_read\n" + "use field_mod, only: fld_type\n" + "integer, parameter :: jpj = 10\n" + "type(fld_type), dimension(5) :: small_holding\n" + "real, dimension(jpj) :: sto_tmp\n" + "integer :: ji, jf\n" + "real, dimension(jpj) :: sfactor\n" + "sfactor(:) = 0.1\n" + "sto_tmp(:) = 0.0\n" + "jf = 3\n" + "do ji = 1,jpj\n" + " sto_tmp(ji) = sto_tmp(ji) + small_holding(3)%grid(jf)%data(ji)\n" + " sto_tmp(ji) = sfactor * sto_tmp(ji)\n" + "end do\n" + "end program dtype_read\n") + loop = psyir.walk(Loop)[0] + dtrans = ACCDataTrans() + dtrans.apply(loop) + output = fortran_writer(psyir) + expected = ("!$acc data copyin(sfactor,small_holding,small_holding(3)%grid" + ",small_holding(3)%grid(jf)%data), copy(sto_tmp)") + assert expected in output + # Check that calling tree_update explicitly has no effect as the tree has + # not changed. + loop.tree_update() + output = fortran_writer(psyir) + assert expected in output + # Now remove the second statement from the loop body. + del loop.loop_body.children[1] + output = fortran_writer(psyir) + # 'sfactor' should have been removed from the copyin() + assert ("!$acc data copyin(small_holding,small_holding(3)%grid," + "small_holding(3)%grid(jf)%data), copy(sto_tmp)" in output) From 69cf00759b808d85e49f565241fac0fa0632e0e1 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Mon, 24 Jul 2023 16:54:04 +0100 Subject: [PATCH 15/56] #2157 tidy code --- src/psyclone/core/signature.py | 122 +++++++++++---------- src/psyclone/psyir/nodes/acc_directives.py | 16 +-- src/psyclone/tests/core/signature_test.py | 16 ++- 3 files changed, 77 insertions(+), 77 deletions(-) diff --git a/src/psyclone/core/signature.py b/src/psyclone/core/signature.py index 32a4fb77d2..a987766779 100644 --- a/src/psyclone/core/signature.py +++ b/src/psyclone/core/signature.py @@ -109,79 +109,81 @@ def __str__(self): return "%".join(self._signature) # ------------------------------------------------------------------------ - def add_deep_copy_refs(self, node, table, refs_dict): + def create_deep_copy_refs(self, node, refs_dict): ''' Creates the References required to perform a deep copy of this - Signature. These are References are added to the supplied - dictionary. - - :param var_accesses: object holding information on the accesses - relating to the supplied signature. - :type var_accesses: :py:class:`psyclone.core.VariablesAccessInfo` - :param table: the most local symbol table. - :type table: :py:class:`psyclone.psyir.symbols.SymbolTable` - :param sig: the Signature to process for accesses. - :type sig: :py:class:`psyclone.core.Signature` - :param OrderedDict refs_dict: the dict of accesses to update. Contains - lists of References, indexed by Signature. + Signature in e.g. OpenACC or OpenMP. These References are added to the + supplied OrderedDict in the order in which they must be copied. + + :param node: PSyIR node containing an access with this Signature. + :type node: :py:class:`psyclone.psyir.nodes.Node` + :param refs_dict: the dict that will be updated. Contains + References indexed by Signatures. + :type refs_dict: OrderedDict[ + :py:class:`psyclone.core.Signature`, + :py:class:`psyclone.psyir.nodes.Reference`] + + :raises TypeError: if the supplied refs_dict is not an OrderedDict. ''' if not isinstance(refs_dict, OrderedDict): raise TypeError( - f"add_deep_copy_refs: dictionary to update must be an " + f"create_deep_copy_refs: dictionary to update must be an " f"OrderedDict but got '{type(refs_dict).__name__}'") - # Having this import at the top level causes a circular dependency. - # pylint: disable=import-outside-toplevel - from psyclone.psyir import nodes - sym = table.lookup(self.var_name) + sym = node.scope.symbol_table.lookup(self.var_name) if isinstance(sym.datatype, ScalarType): - # We ignore scalars as these are copied by value when launching - # kernels. + # We ignore scalars as these are typically copied by value. return - if isinstance(node, nodes.StructureReference): - # We have to do a 'deep copy' of any structure access. This - # means that if we have an access `a%b%c(i)` then we need to - # copy `a`, `a%b` and then `a%b%c`. - - # A Signature does not contain indexing information so we must - # lookup a PSyIR node that corresponds to this access. - _, index_lists = node.get_signature_and_indices() - - if Signature(node.symbol.name) not in refs_dict: - refs_dict[Signature(node.symbol.name)] = nodes.Reference(node.symbol) - - for depth in range(1, len(self)): - if self[:depth+1] not in refs_dict: - if node.is_array: - base_cls = nodes.ArrayOfStructuresReference - # Copy the indices so as not to modify the original - # node. - base_args = [node.symbol, - [idx.copy() for idx in node.indices]] - else: - base_cls = nodes.StructureReference - base_args = [node.symbol] - # Create the new lists of indices, one list for each member - # of the structure access apart from the last one where - # we assume the whole array (if it is an array) is - # accessed. Hence the loop is 1:depth and then we set the - # last one separately. - new_lists = [] - for idx_list in index_lists[1:depth]: - new_lists.append([idx.copy() for idx in idx_list]) - new_lists.append([]) - members = list(zip(self[1:depth+1], new_lists)) - refs_dict[self[:depth+1]] = base_cls.create( - *base_args, members) + # Having this import at the top level causes a circular dependency. + # pylint: disable=import-outside-toplevel + from psyclone.psyir import nodes + + if not isinstance(node, nodes.StructureReference): + # This must be an array. + # TODO #1396 - in languages such as C++ it will be necessary to + # supply the extent of an array that is being accessed. For now we + # only supply a Reference (which is sufficient in Fortran). + if self not in refs_dict: + refs_dict[self] = nodes.Reference(node.symbol) return - # TODO #1396 - in languages such as C++ it will be necessary to - # supply the extent of an array that is being accessed. For now we - # only supply a Reference (which is sufficient in Fortran). - if self not in refs_dict: - refs_dict[self] = nodes.Reference(node.symbol) + # We have a structure access and so we need the list of references + # required to do a 'deep copy'. This means that if we have an access + # `a%b%c(i)` then we need references to `a`, `a%b` and then `a%b%c`. + + # A Signature does not contain indexing information so we use the + # supplied PSyIR node that corresponds to this access. + _, index_lists = node.get_signature_and_indices() + + # First add the root access (`a` in the above example). + if Signature(node.symbol.name) not in refs_dict: + refs_dict[Signature(node.symbol.name)] = nodes.Reference( + node.symbol) + + # Then work our way down the various members. + for depth in range(1, len(self)): + if self[:depth+1] not in refs_dict: + if node.is_array: + base_cls = nodes.ArrayOfStructuresReference + # Copy the indices so as not to modify the original node. + base_args = [node.symbol, + [idx.copy() for idx in node.indices]] + else: + base_cls = nodes.StructureReference + base_args = [node.symbol] + # Create the new lists of indices, one list for each member of + # the structure access apart from the last one where we assume + # the whole array (if it is an array) is accessed. Hence the + # loop is 1:depth and then we set the last one separately. + new_lists = [] + for idx_list in index_lists[1:depth]: + new_lists.append([idx.copy() for idx in idx_list]) + new_lists.append([]) + members = list(zip(self[1:depth+1], new_lists)) + refs_dict[self[:depth+1]] = base_cls.create( + *base_args, members) # ------------------------------------------------------------------------ def to_language(self, component_indices=None, language_writer=None): diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index 84b8d9343d..7724d2e40d 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -712,7 +712,6 @@ def tree_update(self): # pylint: disable=import-outside-toplevel from psyclone.psyir.tools import DependencyTools dtools = DependencyTools() - table = self.scope.symbol_table in_outs = dtools.get_in_out_parameters(self.children) var_accesses = dtools.variable_access_info readers = in_outs.signatures_read @@ -726,25 +725,26 @@ def tree_update(self): # and add them as children of the appropriate clauses. nodes_dict = OrderedDict() for sig in readers_list: - sig.add_deep_copy_refs(var_accesses[sig].all_accesses[0].node, - table, nodes_dict) + sig.create_deep_copy_refs(var_accesses[sig].all_accesses[0].node, + nodes_dict) if nodes_dict: self.addchild(ACCCopyInClause(children=list(nodes_dict.values()))) nodes_dict = OrderedDict() for sig in writers_list: - sig.add_deep_copy_refs(var_accesses[sig].all_accesses[0].node, - table, nodes_dict) + sig.create_deep_copy_refs(var_accesses[sig].all_accesses[0].node, + nodes_dict) if nodes_dict: self.addchild(ACCCopyOutClause(children=list(nodes_dict.values()))) nodes_dict = OrderedDict() for sig in readwrites_list: - sig.add_deep_copy_refs(var_accesses[sig].all_accesses[0].node, - table, nodes_dict) + sig.create_deep_copy_refs(var_accesses[sig].all_accesses[0].node, + nodes_dict) if nodes_dict: self.addchild(ACCCopyClause(children=list(nodes_dict.values()))) - # Mark that we've left this method. + # Enable updates again now that we're leaving this method. self._disable_tree_update = False + # Propagate any changes on up the tree. super().tree_update() diff --git a/src/psyclone/tests/core/signature_test.py b/src/psyclone/tests/core/signature_test.py index 448cca3e3f..7da34a09d5 100644 --- a/src/psyclone/tests/core/signature_test.py +++ b/src/psyclone/tests/core/signature_test.py @@ -267,18 +267,18 @@ def test_add_deep_copy_refs(fortran_reader): # Wrong dictionary type. sig = Signature("a") with pytest.raises(TypeError) as err: - sig.add_deep_copy_refs(sched.children[0].lhs, sched.symbol_table, {}) - assert ("add_deep_copy_refs: dictionary to update must be an OrderedDict " - "but got 'dict'" in str(err.value)) + sig.create_deep_copy_refs(sched.children[0].lhs, {}) + assert ("create_deep_copy_refs: dictionary to update must be an " + "OrderedDict but got 'dict'" in str(err.value)) # Flat array. refs = OrderedDict() - sig.add_deep_copy_refs(sched.children[0].lhs, sched.symbol_table, refs) + sig.create_deep_copy_refs(sched.children[0].lhs, refs) assert isinstance(refs[sig], Reference) assert refs[sig].symbol.name == "a" # Structure access. node = sched.children[1].lhs sig, _ = node.get_signature_and_indices() - sig.add_deep_copy_refs(node, sched.symbol_table, refs) + sig.create_deep_copy_refs(node, refs) assert isinstance(refs[Signature("b")], Reference) assert isinstance(refs[Signature(("b", "grid"))], StructureReference) @@ -287,14 +287,12 @@ def test_add_deep_copy_refs(fortran_reader): # Array of structures access. node = sched.children[2].lhs sig, _ = node.get_signature_and_indices() - sig.add_deep_copy_refs(node, - sched.symbol_table, refs) + sig.create_deep_copy_refs(node, refs) assert isinstance(refs[Signature("d")], Reference) assert isinstance(refs[Signature(("d", "grid"))], StructureReference) assert isinstance(refs[Signature(("d", "grid", "data"))], StructureReference) # Scalars are excluded. - Signature("a_scalar").add_deep_copy_refs(sched.children[3].lhs, - sched.symbol_table, refs) + Signature("a_scalar").create_deep_copy_refs(sched.children[3].lhs, refs) assert Signature("a_scalar") not in refs From b5591a4a662a116f46d81c9435b8351b317a024f Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Thu, 10 Aug 2023 12:20:22 +0100 Subject: [PATCH 16/56] #1396 begin encapsulating tree-update mechanics inside Node [skip ci] --- src/psyclone/psyir/nodes/acc_directives.py | 45 +++++++------------ src/psyclone/psyir/nodes/node.py | 51 +++++++++++++++------- 2 files changed, 52 insertions(+), 44 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index 7724d2e40d..da1173626e 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -622,26 +622,24 @@ class ACCDataDirective(ACCRegionDirective): in the PSyIR. ''' - def __init__(self, children=None, parent=None): - self._disable_tree_update = True - super().__init__(children=children, parent=parent) + #def __init__(self, children=None, parent=None): + # super().__init__(children=children, parent=parent) + # + # self._signal_update() - self._disable_tree_update = False - self.tree_update() - - def _refine_copy(self, other): - ''' - Overrides the base implementation to ensure that tree-updating is - disabled during this operation (since it is a copy we know we - don't need to change the tree structure). + #def _refine_copy(self, other): + # ''' + # Overrides the base implementation to ensure that tree-updating is + # disabled during this operation (since it is a copy we know we + # don't need to change the tree structure). - :param other: the object we are copying from. - :type other: :py:class:`psyclone.psyir.node.Node` + # :param other: the object we are copying from. + # :type other: :py:class:`psyclone.psyir.node.Node` - ''' - self._disable_tree_update = True - super()._refine_copy(other) - self._disable_tree_update = False + # ''' + # self._disable_tree_update = True + # super()._refine_copy(other) + # self._disable_tree_update = False def gen_code(self, _): ''' @@ -689,18 +687,13 @@ def end_string(self): ''' return "acc end data" - def tree_update(self): + def update_node(self): ''' Called whenever there is a change in the PSyIR tree below this node. This may mean that the various copy[in/out] clauses need updating if the contents of the data region have changed. ''' - # Ensure that this method does not get called recursively. - if self._disable_tree_update: - return - self._disable_tree_update = True - # Remove the clauses that we will update. for child in self.children[:]: if isinstance(child, @@ -742,12 +735,6 @@ def tree_update(self): if nodes_dict: self.addchild(ACCCopyClause(children=list(nodes_dict.values()))) - # Enable updates again now that we're leaving this method. - self._disable_tree_update = False - - # Propagate any changes on up the tree. - super().tree_update() - class ACCUpdateDirective(ACCStandaloneDirective): ''' Class representing the OpenACC update directive in the PSyIR. It has diff --git a/src/psyclone/psyir/nodes/node.py b/src/psyclone/psyir/nodes/node.py index ace7268a69..390c6222b8 100644 --- a/src/psyclone/psyir/nodes/node.py +++ b/src/psyclone/psyir/nodes/node.py @@ -209,7 +209,7 @@ def append(self, item): self._check_is_orphan(item) super().append(item) self._set_parent_link(item) - self._node_reference.tree_update() + self._node_reference.update_signal() def __setitem__(self, index, item): ''' Extends list __setitem__ method with children node validation. @@ -224,7 +224,7 @@ def __setitem__(self, index, item): self._del_parent_link(self[index]) super().__setitem__(index, item) self._set_parent_link(item) - self._node_reference.tree_update() + self._node_reference.update_signal() def insert(self, index, item): ''' Extends list insert method with children node validation. @@ -242,7 +242,7 @@ def insert(self, index, item): self._validate_item(position + 1, self[position]) super().insert(index, item) self._set_parent_link(item) - self._node_reference.tree_update() + self._node_reference.update_signal() def extend(self, items): ''' Extends list extend method with children node validation. @@ -257,7 +257,7 @@ def extend(self, items): super().extend(items) for item in items: self._set_parent_link(item) - self._node_reference.tree_update() + self._node_reference.update_signal() # Methods below don't insert elements but have the potential to displace # or change the order of the items in-place. @@ -272,7 +272,7 @@ def __delitem__(self, index): self._validate_item(position - 1, self[position]) self._del_parent_link(self[index]) super().__delitem__(index) - self._node_reference.tree_update() + self._node_reference.update_signal() def remove(self, item): ''' Extends list remove method with children node validation. @@ -285,7 +285,7 @@ def remove(self, item): self._validate_item(position - 1, self[position]) self._del_parent_link(item) super().remove(item) - self._node_reference.tree_update() + self._node_reference.update_signal() def pop(self, index=-1): ''' Extends list pop method with children node validation. @@ -303,7 +303,7 @@ def pop(self, index=-1): self._validate_item(position - 1, self[position]) self._del_parent_link(self[index]) obj = super().pop(index) - self._node_reference.tree_update() + self._node_reference.update_signal() return obj def reverse(self): @@ -313,7 +313,7 @@ def reverse(self): super().reverse() # Reversing the order of e.g. Statements may alter the read/write # properties of any References. - self._node_reference.tree_update() + self._node_reference.update_signal() class Node(): @@ -357,6 +357,7 @@ def __init__(self, ast=None, children=None, parent=None, annotations=None): if parent and not isinstance(parent, Node): raise TypeError(f"The parent of a Node must also be a Node but " f"got '{type(parent).__name__}'") + self._disable_tree_update = True # Keep a record of whether a parent node was supplied when constructing # this object. In this case it still won't appear in the parent's # children list. When both ends of the reference are connected this @@ -383,6 +384,8 @@ def __init__(self, ast=None, children=None, parent=None, annotations=None): f"{self.__class__.__name__} with unrecognised " f"annotation '{annotation}', valid " f"annotations are: {self.valid_annotations}.") + self._disable_tree_update = False + self.update_signal() def __eq__(self, other): ''' @@ -1461,6 +1464,9 @@ def _refine_copy(self, other): :type other: :py:class:`psyclone.psyir.node.Node` ''' + # Disable tree-updating during this operation (since it is a copy we + # know we don't need to change the tree structure). + self._disable_update = True self._parent = None self._has_constructor_parent = False self._annotations = other.annotations[:] @@ -1469,6 +1475,7 @@ def _refine_copy(self, other): self._children_valid_format) # And make a recursive copy of each child instead self.children.extend([child.copy() for child in other.children]) + self._disable_update = False def copy(self): ''' Return a copy of this node. This is a bespoke implementation for @@ -1516,19 +1523,33 @@ def debug_string(self): from psyclone.psyir.backend.debug_writer import DebugWriter return DebugWriter()(self) - def tree_update(self): + def update_signal(self): ''' - Called when any of the nodes below this one in the tree are - changed. + Called whenever there is a change in the PSyIR tree below this node. + ''' + # Ensure that _update_node does not get called recursively. + if hasattr(self, "_disable_tree_update") and self._disable_tree_update: + return - This default implementation simply propagates the notification up - the tree by calling the corresponding method on its parent. + # Perform the update disabling the recursive call + self._disable_tree_update = True + self._update_node() + self._disable_tree_update = False - ''' # If we're in the middle of constructing a Node then it's # possible that it doesn't yet even have the _parent attribute. if hasattr(self, "_parent") and self._parent: - self._parent.tree_update() + self._parent.update_signal() + + def _update_node(self): + ''' + Specify how this node must be updated when an update_signal is + received. The modifications in this method will not trigger a + recursive signal (i.e. they won't cause this node to attempt to + update itself again). + + This base implementation does nothing. + ''' def path_from(self, ancestor): ''' Find the path in the psyir tree between ancestor and node and From 0a2442096783b98f5cdcf5d14832695a80cc38d0 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Thu, 10 Aug 2023 22:26:26 +0100 Subject: [PATCH 17/56] #2157 rm _text_name from ACCClause classes --- src/psyclone/psyir/nodes/acc_clauses.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_clauses.py b/src/psyclone/psyir/nodes/acc_clauses.py index ce4056dcba..5090b3a55f 100644 --- a/src/psyclone/psyir/nodes/acc_clauses.py +++ b/src/psyclone/psyir/nodes/acc_clauses.py @@ -49,7 +49,6 @@ class ACCCopyClause(Clause): ''' _children_valid_format = "Reference" - _text_name = "CopyClause" _clause_string = "copy" @staticmethod @@ -76,7 +75,6 @@ class ACCCopyInClause(Clause): ''' _children_valid_format = "Reference" - _text_name = "CopyInClause" _clause_string = "copyin" @staticmethod @@ -103,7 +101,6 @@ class ACCCopyOutClause(Clause): ''' _children_valid_format = "Reference" - _text_name = "CopyOutClause" _clause_string = "copyout" @staticmethod From 71b0f77438777fe6dd677c4ca4f1d05fac4f35e6 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Thu, 10 Aug 2023 22:31:32 +0100 Subject: [PATCH 18/56] #2157 finish moving tree update functionality into Node --- src/psyclone/psyir/nodes/acc_directives.py | 25 +++---------------- src/psyclone/psyir/nodes/directive.py | 10 ++++---- src/psyclone/psyir/nodes/node.py | 23 +++++++++++++---- src/psyclone/psyir/nodes/scoping_node.py | 3 +-- .../tests/psyir/nodes/acc_directives_test.py | 6 ++--- 5 files changed, 31 insertions(+), 36 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index da1173626e..f1087d4b3d 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -74,7 +74,9 @@ class ACCDirective(metaclass=abc.ABCMeta): class ACCRegionDirective(ACCDirective, RegionDirective, metaclass=abc.ABCMeta): - ''' Base class for all OpenACC region directive statements. ''' + ''' Base class for all OpenACC region directive statements. + + ''' def validate_global_constraints(self): ''' Perform validation checks for any global constraints. This can only @@ -622,25 +624,6 @@ class ACCDataDirective(ACCRegionDirective): in the PSyIR. ''' - #def __init__(self, children=None, parent=None): - # super().__init__(children=children, parent=parent) - # - # self._signal_update() - - #def _refine_copy(self, other): - # ''' - # Overrides the base implementation to ensure that tree-updating is - # disabled during this operation (since it is a copy we know we - # don't need to change the tree structure). - - # :param other: the object we are copying from. - # :type other: :py:class:`psyclone.psyir.node.Node` - - # ''' - # self._disable_tree_update = True - # super()._refine_copy(other) - # self._disable_tree_update = False - def gen_code(self, _): ''' :raises InternalError: the ACC data directive is currently only \ @@ -687,7 +670,7 @@ def end_string(self): ''' return "acc end data" - def update_node(self): + def _update_node(self): ''' Called whenever there is a change in the PSyIR tree below this node. This may mean that the various copy[in/out] clauses need updating if diff --git a/src/psyclone/psyir/nodes/directive.py b/src/psyclone/psyir/nodes/directive.py index e6aab441a0..44a8d3b5ad 100644 --- a/src/psyclone/psyir/nodes/directive.py +++ b/src/psyclone/psyir/nodes/directive.py @@ -77,14 +77,14 @@ class RegionDirective(Directive): All classes that generate RegionDirective statements (e.g. OpenMP, OpenACC, compiler-specific) inherit from this class. - :param ast: the entry in the fparser2 parse tree representing the code \ + :param ast: the entry in the fparser2 parse tree representing the code contained within this directive or None. - :type ast: :py:class:`fparser.two.Fortran2003.Base` or NoneType - :param children: list of PSyIR nodes that will be children of this \ + :type ast: Optional[:py:class:`fparser.two.Fortran2003.Base`] + :param children: the nodes that will be children of this Directive node or None. - :type children: list of :py:class:`psyclone.psyir.nodes.Node` or NoneType + :type children: Optional[List[:py:class:`psyclone.psyir.nodes.Node`]] :param parent: PSyIR node that is the parent of this Directive or None. - :type parent: :py:class:`psyclone.psyir.nodes.Node` or NoneType + :type parent: Optional[:py:class:`psyclone.psyir.nodes.Node`] ''' # Textual description of the node. diff --git a/src/psyclone/psyir/nodes/node.py b/src/psyclone/psyir/nodes/node.py index 390c6222b8..d802859afc 100644 --- a/src/psyclone/psyir/nodes/node.py +++ b/src/psyclone/psyir/nodes/node.py @@ -909,6 +909,10 @@ def children(self): :returns: the immediate children of this Node. :rtype: List[:py:class:`psyclone.psyir.nodes.Node`] ''' + # An incomplete node may not have the _children attribute so return + # an empty list in this case. + if not hasattr(self, "_children"): + return [] return self._children @children.setter @@ -1466,7 +1470,7 @@ def _refine_copy(self, other): ''' # Disable tree-updating during this operation (since it is a copy we # know we don't need to change the tree structure). - self._disable_update = True + self._disable_tree_update = True self._parent = None self._has_constructor_parent = False self._annotations = other.annotations[:] @@ -1475,7 +1479,7 @@ def _refine_copy(self, other): self._children_valid_format) # And make a recursive copy of each child instead self.children.extend([child.copy() for child in other.children]) - self._disable_update = False + self._disable_tree_update = False def copy(self): ''' Return a copy of this node. This is a bespoke implementation for @@ -1526,12 +1530,21 @@ def debug_string(self): def update_signal(self): ''' Called whenever there is a change in the PSyIR tree below this node. + It is responsible for ensuring that this method does not get + recursively and then calls the _update_node() method of the current + node. Finally, it propagates the update signal up to the parent node + (if any). + ''' - # Ensure that _update_node does not get called recursively. - if hasattr(self, "_disable_tree_update") and self._disable_tree_update: + # Ensure that update_signal does not get called recursively. If this + # node is still under construction then it might not have the + # _disable_tree_update attribute. If so, we also skip doing the update. + if (not hasattr(self, "_disable_tree_update") or + self._disable_tree_update): return - # Perform the update disabling the recursive call + # Perform the update, disabling the recursive call of this routine on + # this node. self._disable_tree_update = True self._update_node() self._disable_tree_update = False diff --git a/src/psyclone/psyir/nodes/scoping_node.py b/src/psyclone/psyir/nodes/scoping_node.py index 4ba90f36a3..07f721093f 100644 --- a/src/psyclone/psyir/nodes/scoping_node.py +++ b/src/psyclone/psyir/nodes/scoping_node.py @@ -62,8 +62,7 @@ class ScopingNode(Node): _symbol_table_class = SymbolTable def __init__(self, children=None, parent=None, symbol_table=None): - super(ScopingNode, self).__init__(self, children=children, - parent=parent) + super().__init__(self, children=children, parent=parent) self._symbol_table = None if symbol_table is not None: diff --git a/src/psyclone/tests/psyir/nodes/acc_directives_test.py b/src/psyclone/tests/psyir/nodes/acc_directives_test.py index 7cd640d875..e8b39b858c 100644 --- a/src/psyclone/tests/psyir/nodes/acc_directives_test.py +++ b/src/psyclone/tests/psyir/nodes/acc_directives_test.py @@ -421,9 +421,9 @@ def test_accdatadirective_clauses(fortran_reader, fortran_writer): expected = ("!$acc data copyin(sfactor,small_holding,small_holding(3)%grid" ",small_holding(3)%grid(jf)%data), copy(sto_tmp)") assert expected in output - # Check that calling tree_update explicitly has no effect as the tree has - # not changed. - loop.tree_update() + # Check that calling update_signal() explicitly has no effect as the tree + # has not changed. + loop.update_signal() output = fortran_writer(psyir) assert expected in output # Now remove the second statement from the loop body. From d9a5b1f6953fe6e833b08826c522cf375546b23c Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Mon, 14 Aug 2023 11:46:30 +0100 Subject: [PATCH 19/56] #1396 mv functionality back from Signature to Directive [skip ci] --- src/psyclone/core/signature.py | 80 +------------- src/psyclone/psyir/nodes/acc_directives.py | 44 ++------ src/psyclone/psyir/nodes/directive.py | 103 +++++++++++++++++- src/psyclone/tests/core/signature_test.py | 57 ---------- .../tests/psyir/nodes/directive_test.py | 52 +++++++++ src/psyclone/transformations.py | 5 +- 6 files changed, 167 insertions(+), 174 deletions(-) diff --git a/src/psyclone/core/signature.py b/src/psyclone/core/signature.py index a987766779..b1354f7bd9 100644 --- a/src/psyclone/core/signature.py +++ b/src/psyclone/core/signature.py @@ -38,10 +38,9 @@ '''This module provides management of variable access information.''' -from collections import OrderedDict from psyclone.errors import InternalError -from psyclone.psyir.symbols import DataSymbol, INTEGER_TYPE, ScalarType +from psyclone.psyir.symbols import DataSymbol, INTEGER_TYPE # ============================================================================= @@ -108,83 +107,6 @@ def __getitem__(self, indx): def __str__(self): return "%".join(self._signature) - # ------------------------------------------------------------------------ - def create_deep_copy_refs(self, node, refs_dict): - ''' - Creates the References required to perform a deep copy of this - Signature in e.g. OpenACC or OpenMP. These References are added to the - supplied OrderedDict in the order in which they must be copied. - - :param node: PSyIR node containing an access with this Signature. - :type node: :py:class:`psyclone.psyir.nodes.Node` - :param refs_dict: the dict that will be updated. Contains - References indexed by Signatures. - :type refs_dict: OrderedDict[ - :py:class:`psyclone.core.Signature`, - :py:class:`psyclone.psyir.nodes.Reference`] - - :raises TypeError: if the supplied refs_dict is not an OrderedDict. - - ''' - if not isinstance(refs_dict, OrderedDict): - raise TypeError( - f"create_deep_copy_refs: dictionary to update must be an " - f"OrderedDict but got '{type(refs_dict).__name__}'") - - sym = node.scope.symbol_table.lookup(self.var_name) - if isinstance(sym.datatype, ScalarType): - # We ignore scalars as these are typically copied by value. - return - - # Having this import at the top level causes a circular dependency. - # pylint: disable=import-outside-toplevel - from psyclone.psyir import nodes - - if not isinstance(node, nodes.StructureReference): - # This must be an array. - # TODO #1396 - in languages such as C++ it will be necessary to - # supply the extent of an array that is being accessed. For now we - # only supply a Reference (which is sufficient in Fortran). - if self not in refs_dict: - refs_dict[self] = nodes.Reference(node.symbol) - return - - # We have a structure access and so we need the list of references - # required to do a 'deep copy'. This means that if we have an access - # `a%b%c(i)` then we need references to `a`, `a%b` and then `a%b%c`. - - # A Signature does not contain indexing information so we use the - # supplied PSyIR node that corresponds to this access. - _, index_lists = node.get_signature_and_indices() - - # First add the root access (`a` in the above example). - if Signature(node.symbol.name) not in refs_dict: - refs_dict[Signature(node.symbol.name)] = nodes.Reference( - node.symbol) - - # Then work our way down the various members. - for depth in range(1, len(self)): - if self[:depth+1] not in refs_dict: - if node.is_array: - base_cls = nodes.ArrayOfStructuresReference - # Copy the indices so as not to modify the original node. - base_args = [node.symbol, - [idx.copy() for idx in node.indices]] - else: - base_cls = nodes.StructureReference - base_args = [node.symbol] - # Create the new lists of indices, one list for each member of - # the structure access apart from the last one where we assume - # the whole array (if it is an array) is accessed. Hence the - # loop is 1:depth and then we set the last one separately. - new_lists = [] - for idx_list in index_lists[1:depth]: - new_lists.append([idx.copy() for idx in idx_list]) - new_lists.append([]) - members = list(zip(self[1:depth+1], new_lists)) - refs_dict[self[:depth+1]] = base_cls.create( - *base_args, members) - # ------------------------------------------------------------------------ def to_language(self, component_indices=None, language_writer=None): # pylint: disable=too-many-locals diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index f1087d4b3d..16db4c9960 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -683,40 +683,16 @@ def _update_node(self): (ACCCopyInClause, ACCCopyOutClause, ACCCopyClause)): self.children.remove(child) - # Identify the inputs and outputs to the region (variables that - # are read and written). - # pylint: disable=import-outside-toplevel - from psyclone.psyir.tools import DependencyTools - dtools = DependencyTools() - in_outs = dtools.get_in_out_parameters(self.children) - var_accesses = dtools.variable_access_info - readers = in_outs.signatures_read - writers = in_outs.signatures_written - readwrites_list = in_outs.signatures_readwrite - readwrites = set(readwrites_list) - readers_list = sorted(list(set(readers) - readwrites)) - writers_list = sorted(list(set(writers) - readwrites)) - - # We now need to create PSyIR references for all of the signatures - # and add them as children of the appropriate clauses. - nodes_dict = OrderedDict() - for sig in readers_list: - sig.create_deep_copy_refs(var_accesses[sig].all_accesses[0].node, - nodes_dict) - if nodes_dict: - self.addchild(ACCCopyInClause(children=list(nodes_dict.values()))) - nodes_dict = OrderedDict() - for sig in writers_list: - sig.create_deep_copy_refs(var_accesses[sig].all_accesses[0].node, - nodes_dict) - if nodes_dict: - self.addchild(ACCCopyOutClause(children=list(nodes_dict.values()))) - nodes_dict = OrderedDict() - for sig in readwrites_list: - sig.create_deep_copy_refs(var_accesses[sig].all_accesses[0].node, - nodes_dict) - if nodes_dict: - self.addchild(ACCCopyClause(children=list(nodes_dict.values()))) + reads, writes, readwrites = self.create_data_movement_deep_copy_refs() + + if reads: + self.addchild(ACCCopyInClause(children=list(reads.values()))) + + if writes: + self.addchild(ACCCopyOutClause(children=list(writes.values()))) + + if readwrites: + self.addchild(ACCCopyClause(children=list(readwrites.values()))) class ACCUpdateDirective(ACCStandaloneDirective): diff --git a/src/psyclone/psyir/nodes/directive.py b/src/psyclone/psyir/nodes/directive.py index 44a8d3b5ad..6db03dc7f2 100644 --- a/src/psyclone/psyir/nodes/directive.py +++ b/src/psyclone/psyir/nodes/directive.py @@ -42,12 +42,20 @@ node implementation.''' import abc +from collections import OrderedDict + from psyclone.configuration import Config +from psyclone.core import Signature, VariablesAccessInfo from psyclone.errors import InternalError from psyclone.f2pygen import CommentGen from psyclone.psyir.nodes.loop import Loop -from psyclone.psyir.nodes.statement import Statement +from psyclone.psyir.nodes.reference import Reference +from psyclone.psyir.nodes.array_of_structures_reference import ( + ArrayOfStructuresReference) from psyclone.psyir.nodes.schedule import Schedule +from psyclone.psyir.nodes.statement import Statement +from psyclone.psyir.nodes.structure_reference import StructureReference +from psyclone.psyir.symbols.datatypes import ScalarType class Directive(Statement, metaclass=abc.ABCMeta): @@ -68,6 +76,99 @@ def clauses(self): :rtype: List of :py:class:`psyclone.psyir.nodes.Clause` ''' + def create_data_movement_deep_copy_refs(self): + ''' + Creates the References required to perform a deep copy of this + Signature in e.g. OpenACC or OpenMP. These References are added to the + returned OrderedDicts in the order in which they must be copied. + + :returns: a 3-tuple containing dicts describing the reads, writes and + readwrites. Each dict contains References indexed by Signatures. + :rtype: Tuple[OrderedDict[ + :py:class:`psyclone.core.Signature`, + :py:class:`psyclone.psyir.nodes.Reference`]] + + ''' + readwrites = OrderedDict() + reads = OrderedDict() + writes = OrderedDict() + table = self.scope.symbol_table + + var_info = VariablesAccessInfo() + self.reference_accesses(var_info) + + for sig in var_info.all_signatures: + vinfo = var_info[sig] + node = vinfo.all_accesses[0].node + sym = table.lookup(sig.var_name) + + if isinstance(sym.datatype, ScalarType): + # We ignore scalars as these are typically copied by value. + continue + + if var_info.has_read_write(sig): + if vinfo.is_written_first(): + access_dict = reads + else: + access_dict = readwrites + else: + if var_info.is_read(sig) and not vinfo.is_written_first(): + if var_info.is_written(sig): + access_dict = readwrites + else: + access_dict = reads + else: + access_dict = writes + + if not sig.is_structure: + # This must be an array. + # TODO #1396 - in languages such as C++ it will be necessary to + # supply the extent of an array that is being accessed. For now + # we only supply a Reference (which is sufficient in Fortran). + if sig not in access_dict: + access_dict[sig] = Reference(node.symbol) + continue + + # We have a structure access and so we need the list of + # references required to do a 'deep copy'. This means that if + # we have an access `a%b%c(i)` then we need references to `a`, + # `a%b` and then `a%b%c`. + + # A Signature does not contain indexing information so we use + # a PSyIR node that corresponds to this access. + _, index_lists = node.get_signature_and_indices() + + # First add the root access (`a` in the above example). + if Signature(node.symbol.name) not in access_dict: + access_dict[Signature(node.symbol.name)] = Reference( + node.symbol) + + # Then work our way down the various members. + for depth in range(1, len(sig)): + if sig[:depth+1] not in access_dict: + if node.is_array: + base_cls = ArrayOfStructuresReference + # Copy the indices so as not to modify the original + # node. + base_args = [node.symbol, + [idx.copy() for idx in node.indices]] + else: + base_cls = StructureReference + base_args = [node.symbol] + # Create the new lists of indices, one list for each + # member of the structure access apart from the last + # one where we assume the whole array (if it is an + # array) is accessed. Hence the loop is 1:depth and + # then we set the last one separately. + new_lists = [] + for idx_list in index_lists[1:depth]: + new_lists.append([idx.copy() for idx in idx_list]) + new_lists.append([]) + members = list(zip(sig[1:depth+1], new_lists)) + access_dict[sig[:depth+1]] = base_cls.create( + *base_args, members) + return reads, writes, readwrites + class RegionDirective(Directive): ''' diff --git a/src/psyclone/tests/core/signature_test.py b/src/psyclone/tests/core/signature_test.py index 7da34a09d5..8209f2743f 100644 --- a/src/psyclone/tests/core/signature_test.py +++ b/src/psyclone/tests/core/signature_test.py @@ -239,60 +239,3 @@ def test_output_languages(): assert sig.to_language(comp) == "a(1)%b%c(i,j)" assert sig.to_language(comp, f_writer) == "a(1)%b%c(i,j)" assert sig.to_language(comp, c_writer) == "a[1].b.c[i + j * cLEN1]" - - -def test_add_deep_copy_refs(fortran_reader): - '''Tests for the add_deep_copy_refs() method. This method is responsible - for creating the required list of References for deep-copying any given - type of Reference over to a remote address space (in e.g. OpenACC or - OpenMP). - - ''' - psyir = fortran_reader.psyir_from_source( - ''' -program my_prog - use some_mod - implicit None - integer :: ji = 1 - real :: a_scalar - real :: a(10) - type(my_type) :: b, d(5) - a(:) = 10.0 - b%grid(ji)%data(:) = 0.0 - d(ji)%grid(2)%data(:) = 3.0 - a_scalar = 1.0 -end program my_prog -''') - sched = psyir.walk(Routine)[0] - # Wrong dictionary type. - sig = Signature("a") - with pytest.raises(TypeError) as err: - sig.create_deep_copy_refs(sched.children[0].lhs, {}) - assert ("create_deep_copy_refs: dictionary to update must be an " - "OrderedDict but got 'dict'" in str(err.value)) - # Flat array. - refs = OrderedDict() - sig.create_deep_copy_refs(sched.children[0].lhs, refs) - assert isinstance(refs[sig], Reference) - assert refs[sig].symbol.name == "a" - # Structure access. - node = sched.children[1].lhs - sig, _ = node.get_signature_and_indices() - sig.create_deep_copy_refs(node, refs) - assert isinstance(refs[Signature("b")], Reference) - assert isinstance(refs[Signature(("b", "grid"))], - StructureReference) - assert isinstance(refs[Signature(("b", "grid", "data"))], - StructureReference) - # Array of structures access. - node = sched.children[2].lhs - sig, _ = node.get_signature_and_indices() - sig.create_deep_copy_refs(node, refs) - assert isinstance(refs[Signature("d")], Reference) - assert isinstance(refs[Signature(("d", "grid"))], - StructureReference) - assert isinstance(refs[Signature(("d", "grid", "data"))], - StructureReference) - # Scalars are excluded. - Signature("a_scalar").create_deep_copy_refs(sched.children[3].lhs, refs) - assert Signature("a_scalar") not in refs diff --git a/src/psyclone/tests/psyir/nodes/directive_test.py b/src/psyclone/tests/psyir/nodes/directive_test.py index 898f82a313..ce219c5977 100644 --- a/src/psyclone/tests/psyir/nodes/directive_test.py +++ b/src/psyclone/tests/psyir/nodes/directive_test.py @@ -98,6 +98,58 @@ def test_directive_backward_dependence(): assert omp2.backward_dependence() == omp1 +def test_create_data_movement_deep_copy_refs(fortran_reader): + '''Tests for the create_data_movement_deep_copy_refs() method. This method + is responsible for creating the required list of References for deep- + copying any given type of Reference over to a remote address space (in e.g. + OpenACC or OpenMP). + + ''' + psyir = fortran_reader.psyir_from_source( + ''' +program my_prog + use some_mod + implicit None + integer :: ji = 1 + real :: a_scalar + real :: a(10) + type(my_type) :: b, d(5) + a(:) = 10.0 + b%grid(ji)%data(:) = 0.0 + d(ji)%grid(2)%data(:) = 3.0 + a_scalar = 1.0 +end program my_prog +''') + sched = psyir.walk(Routine)[0] + # Flat array. + accesses = sched[0].lhs.create_data_movement_deep_copy_refs() + assert all(isinstance(obj, OrderedDict) for obj in accesses) + sig = Signature('a') + assert isinstance(accesses[0][sig], Reference) + assert accesses[0][sig].symbol.name == "a" + # Structure access. + node = sched[1].lhs + sig, _ = node.get_signature_and_indices() + sig.create_deep_copy_refs(node, refs) + assert isinstance(refs[Signature("b")], Reference) + assert isinstance(refs[Signature(("b", "grid"))], + StructureReference) + assert isinstance(refs[Signature(("b", "grid", "data"))], + StructureReference) + # Array of structures access. + node = sched.children[2].lhs + sig, _ = node.get_signature_and_indices() + sig.create_deep_copy_refs(node, refs) + assert isinstance(refs[Signature("d")], Reference) + assert isinstance(refs[Signature(("d", "grid"))], + StructureReference) + assert isinstance(refs[Signature(("d", "grid", "data"))], + StructureReference) + # Scalars are excluded. + Signature("a_scalar").create_deep_copy_refs(sched.children[3].lhs, refs) + assert Signature("a_scalar") not in refs + + def test_regiondirective_children_validation(): '''Test that children added to RegionDirective are validated. RegionDirective accepts 1 Schedule as child. diff --git a/src/psyclone/transformations.py b/src/psyclone/transformations.py index bb86f56f56..614ba6f077 100644 --- a/src/psyclone/transformations.py +++ b/src/psyclone/transformations.py @@ -56,7 +56,6 @@ from psyclone.nemo import NemoInvokeSchedule from psyclone.psyGen import Transformation, CodedKern, Kern, InvokeSchedule, \ BuiltIn -from psyclone.psyir.backend.debug_writer import DebugWriter from psyclone.psyir.nodes import ACCDataDirective, ACCDirective, \ ACCEnterDataDirective, ACCKernelsDirective, ACCLoopDirective, \ ACCParallelDirective, ACCRoutineDirective, Assignment, CodeBlock, \ @@ -2679,14 +2678,14 @@ def validate(self, nodes, options): if var not in var_accesses.all_signatures: continue # For an access such as my_struct(ii)%my_array(ji) - # then if we're inside a loop over it we'll actually + # then if we're inside a loop over it we would actually # need a loop to do the deep copy: # do ii = 1, N # !$acc data copyin(my_struct(ii)%my_array) # end do raise TransformationError( f"Data region contains a structure access " - f"'{DebugWriter()(sref)}' where component " + f"'{sref.debug_string()}' where component " f"'{access.name}' is an array and is iterated over" f" (variable '{var}'). Deep copying of data for " f"structures is only supported where the deepest " From 62e1dc8da491870bb6a746931b97a67ff6d7efe3 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Mon, 14 Aug 2023 16:59:36 +0100 Subject: [PATCH 20/56] #2157 fix and improve Directive test --- src/psyclone/psyir/nodes/directive.py | 17 +-- .../tests/psyir/nodes/directive_test.py | 102 +++++++++++------- 2 files changed, 71 insertions(+), 48 deletions(-) diff --git a/src/psyclone/psyir/nodes/directive.py b/src/psyclone/psyir/nodes/directive.py index 6db03dc7f2..021e61954b 100644 --- a/src/psyclone/psyir/nodes/directive.py +++ b/src/psyclone/psyir/nodes/directive.py @@ -107,14 +107,14 @@ def create_data_movement_deep_copy_refs(self): continue if var_info.has_read_write(sig): - if vinfo.is_written_first(): - access_dict = reads - else: - access_dict = readwrites + access_dict = readwrites else: - if var_info.is_read(sig) and not vinfo.is_written_first(): + if var_info.is_read(sig): if var_info.is_written(sig): - access_dict = readwrites + if vinfo.is_written_first(): + access_dict = writes + else: + access_dict = readwrites else: access_dict = reads else: @@ -163,8 +163,9 @@ def create_data_movement_deep_copy_refs(self): new_lists = [] for idx_list in index_lists[1:depth]: new_lists.append([idx.copy() for idx in idx_list]) - new_lists.append([]) - members = list(zip(sig[1:depth+1], new_lists)) + members = list(zip(sig[1:depth], new_lists)) + # The last member has no array indexing. + members.append(sig[depth]) access_dict[sig[:depth+1]] = base_cls.create( *base_args, members) return reads, writes, readwrites diff --git a/src/psyclone/tests/psyir/nodes/directive_test.py b/src/psyclone/tests/psyir/nodes/directive_test.py index ce219c5977..12e57bab5a 100644 --- a/src/psyclone/tests/psyir/nodes/directive_test.py +++ b/src/psyclone/tests/psyir/nodes/directive_test.py @@ -40,14 +40,16 @@ import os import pytest +from collections import OrderedDict + from psyclone import f2pygen +from psyclone.core import Signature from psyclone.parse.algorithm import parse from psyclone.psyGen import PSyFactory -from psyclone.psyir.nodes import (Literal, Schedule, Routine, Loop, - StandaloneDirective, RegionDirective) +from psyclone.psyir import nodes from psyclone.errors import GenerationError from psyclone.psyir.symbols import DataSymbol, INTEGER_TYPE -from psyclone.transformations import DynamoOMPParallelLoopTrans +from psyclone.transformations import ACCDataTrans, DynamoOMPParallelLoopTrans BASE_PATH = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname( os.path.abspath(__file__)))), "test_files", "dynamo0p3") @@ -111,43 +113,64 @@ def test_create_data_movement_deep_copy_refs(fortran_reader): use some_mod implicit None integer :: ji = 1 - real :: a_scalar + real :: a_scalar = 0.5 real :: a(10) type(my_type) :: b, d(5) a(:) = 10.0 - b%grid(ji)%data(:) = 0.0 + b%grid(ji)%data(:) = a(:) + a_scalar d(ji)%grid(2)%data(:) = 3.0 a_scalar = 1.0 + a(:) = a(:) + 1.0 + call some_sub(d) end program my_prog ''') - sched = psyir.walk(Routine)[0] + sched = psyir.walk(nodes.Routine)[0] + # Use the ACCDataTrans transformation to insert the directive to test. + data_trans = ACCDataTrans() # Flat array. - accesses = sched[0].lhs.create_data_movement_deep_copy_refs() - assert all(isinstance(obj, OrderedDict) for obj in accesses) + data_trans.apply(sched[0]) + reads, writes, readwrites = sched[0].create_data_movement_deep_copy_refs() + assert all(isinstance(obj, OrderedDict) for obj in + [reads, writes, readwrites]) sig = Signature('a') - assert isinstance(accesses[0][sig], Reference) - assert accesses[0][sig].symbol.name == "a" + assert isinstance(writes[sig], nodes.Reference) + assert writes[sig].symbol.name == "a" # Structure access. - node = sched[1].lhs - sig, _ = node.get_signature_and_indices() - sig.create_deep_copy_refs(node, refs) - assert isinstance(refs[Signature("b")], Reference) - assert isinstance(refs[Signature(("b", "grid"))], - StructureReference) - assert isinstance(refs[Signature(("b", "grid", "data"))], - StructureReference) + data_trans.apply(sched[1]) + reads, writes, readwrites = sched[1].create_data_movement_deep_copy_refs() + assert isinstance(reads[Signature("a")], nodes.Reference) + assert Signature("a_scalar") not in reads + assert isinstance(writes[Signature("b")], nodes.Reference) + assert isinstance(writes[Signature(("b", "grid"))], + nodes.StructureReference) + assert isinstance(writes[Signature(("b", "grid", "data"))], + nodes.StructureReference) # Array of structures access. - node = sched.children[2].lhs - sig, _ = node.get_signature_and_indices() - sig.create_deep_copy_refs(node, refs) - assert isinstance(refs[Signature("d")], Reference) - assert isinstance(refs[Signature(("d", "grid"))], - StructureReference) - assert isinstance(refs[Signature(("d", "grid", "data"))], - StructureReference) + data_trans.apply(sched[2]) + reads, writes, readwrites = sched[2].create_data_movement_deep_copy_refs() + assert isinstance(writes[Signature("d")], nodes.Reference) + assert isinstance(writes[Signature(("d", "grid"))], + nodes.StructureReference) + assert isinstance(writes[Signature(("d", "grid", "data"))], + nodes.StructureReference) # Scalars are excluded. - Signature("a_scalar").create_deep_copy_refs(sched.children[3].lhs, refs) - assert Signature("a_scalar") not in refs + data_trans.apply(sched[3]) + reads, writes, readwrites = sched[3].create_data_movement_deep_copy_refs() + assert not reads and not writes and not readwrites + data_trans.apply(sched[4]) + # Statement that reads and writes a variable. + reads, writes, readwrites = sched[4].create_data_movement_deep_copy_refs() + assert not reads and not writes + assert isinstance(readwrites[Signature("a")], nodes.Reference) + # Subroutine call - the argument is assumed to be read-write. + data_trans.apply(sched[5]) + reads, writes, readwrites = sched[5].create_data_movement_deep_copy_refs() + assert not writes + # TODO #446 - currently the reference_accesses() method falls through to + # the base implementation and so all arguments to a call are marked as + # having READ access. + if Signature("d") not in readwrites: + pytest.xfail("#446 - Call.reference_accesses() needs implementing") def test_regiondirective_children_validation(): @@ -155,9 +178,9 @@ def test_regiondirective_children_validation(): RegionDirective accepts 1 Schedule as child. ''' - directive = RegionDirective() - datanode = Literal("1", INTEGER_TYPE) - schedule = Schedule() + directive = nodes.RegionDirective() + datanode = nodes.Literal("1", INTEGER_TYPE) + schedule = nodes.Schedule() # First child with pytest.raises(GenerationError) as excinfo: @@ -180,15 +203,14 @@ def test_regiondirective_gen_post_region_code(): TODO #1648 - this can be removed when the gen_post_region_code() method is removed.''' temporary_module = f2pygen.ModuleGen("test") - subroutine = Routine("testsub") - directive = RegionDirective() + subroutine = nodes.Routine("testsub") + directive = nodes.RegionDirective() sym = subroutine.symbol_table.new_symbol( "i", symbol_type=DataSymbol, datatype=INTEGER_TYPE) - loop = Loop.create(sym, - Literal("1", INTEGER_TYPE), - Literal("10", INTEGER_TYPE), - Literal("1", INTEGER_TYPE), - []) + loop = nodes.Loop.create(sym, + nodes.Literal("1", INTEGER_TYPE), + nodes.Literal("10", INTEGER_TYPE), + nodes.Literal("1", INTEGER_TYPE), []) directive.dir_body.addchild(loop) subroutine.addchild(directive) directive.gen_post_region_code(temporary_module) @@ -199,8 +221,8 @@ def test_regiondirective_gen_post_region_code(): def test_standalonedirective_children_validation(): '''Test that children cannot be added to StandaloneDirective.''' - cdir = StandaloneDirective() - schedule = Schedule() + cdir = nodes.StandaloneDirective() + schedule = nodes.Schedule() # test adding child with pytest.raises(GenerationError) as excinfo: From 37cdf4eeeccbff57c8c4d4013361bc7c0c657b73 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Mon, 14 Aug 2023 17:13:16 +0100 Subject: [PATCH 21/56] #2157 revert un-needed changes are change to use reference_accesses() method --- src/psyclone/core/signature.py | 1 - src/psyclone/psyir/tools/dependency_tools.py | 26 +++++--------------- src/psyclone/psyir/tools/read_write_info.py | 20 ++------------- 3 files changed, 8 insertions(+), 39 deletions(-) diff --git a/src/psyclone/core/signature.py b/src/psyclone/core/signature.py index b1354f7bd9..b09ade0daa 100644 --- a/src/psyclone/core/signature.py +++ b/src/psyclone/core/signature.py @@ -38,7 +38,6 @@ '''This module provides management of variable access information.''' - from psyclone.errors import InternalError from psyclone.psyir.symbols import DataSymbol, INTEGER_TYPE diff --git a/src/psyclone/psyir/tools/dependency_tools.py b/src/psyclone/psyir/tools/dependency_tools.py index aa5308fea8..53e6cf9d4e 100644 --- a/src/psyclone/psyir/tools/dependency_tools.py +++ b/src/psyclone/psyir/tools/dependency_tools.py @@ -156,8 +156,6 @@ def __init__(self, loop_types_to_parallelise=None): else: self._loop_types_to_parallelise = [] self._clear_messages() - # Cache to hold most recently generated VariablesAccessInfo. - self._var_access_info = None # ------------------------------------------------------------------------- def _clear_messages(self): @@ -766,7 +764,7 @@ def can_loop_be_parallelised(self, loop, # Appropriate messages will have been added already, so just exit return False - self._var_access_info = VariablesAccessInfo(loop) + var_accesses = VariablesAccessInfo(loop) if not signatures_to_ignore: signatures_to_ignore = [] @@ -775,7 +773,7 @@ def can_loop_be_parallelised(self, loop, result = True # Now check all variables used in the loop - for signature in self._var_access_info.all_signatures: + for signature in var_accesses.all_signatures: # This string contains derived type information, e.g. # "a%b" var_string = str(signature) @@ -789,7 +787,7 @@ def can_loop_be_parallelised(self, loop, # This returns the first component of the signature, # i.e. in case of "a%b" it will only return "a" var_name = signature.var_name - var_info = self._var_access_info[signature] + var_info = var_accesses[signature] symbol_table = loop.scope.symbol_table symbol = symbol_table.lookup(var_name) # TODO #1270 - the is_array_access function might be moved @@ -839,7 +837,6 @@ def get_input_parameters(self, read_write_info, node_list, # Collect the information about all variables used: if not variables_info: variables_info = VariablesAccessInfo(node_list, options=options) - self._var_access_info = variables_info for signature in variables_info.all_signatures: # If the first access is a write, the variable is not an input @@ -877,7 +874,6 @@ def get_output_parameters(self, read_write_info, node_list, # Collect the information about all variables used: if not variables_info: variables_info = VariablesAccessInfo(node_list, options=options) - self._var_access_info = variables_info for signature in variables_info.all_signatures: if variables_info.is_written(signature): @@ -906,18 +902,8 @@ def get_in_out_parameters(self, node_list, options=None): :rtype: :py:class:`psyclone.psyir.tools.ReadWriteInfo` ''' - self._var_access_info = VariablesAccessInfo(node_list, options=options) + variables_info = VariablesAccessInfo(node_list, options=options) read_write_info = ReadWriteInfo() - self.get_input_parameters(read_write_info, node_list, - self._var_access_info) - self.get_output_parameters(read_write_info, node_list, - self._var_access_info) + self.get_input_parameters(read_write_info, node_list, variables_info) + self.get_output_parameters(read_write_info, node_list, variables_info) return read_write_info - - @property - def variable_access_info(self): - ''' - :returns: the most-recently collected information on variable accesses. - :rtype: :py:class:`psyclone.core.VariablesAccessInfo` - ''' - return self._var_access_info diff --git a/src/psyclone/psyir/tools/read_write_info.py b/src/psyclone/psyir/tools/read_write_info.py index 1e20922940..50ae78a51d 100644 --- a/src/psyclone/psyir/tools/read_write_info.py +++ b/src/psyclone/psyir/tools/read_write_info.py @@ -31,8 +31,7 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # ----------------------------------------------------------------------------- -# Authors: J. Henrichs, Bureau of Meteorology -# A. R. Porter, STFC Daresbury Lab +# Author J. Henrichs, Bureau of Meteorology # ----------------------------------------------------------------------------- ''' This module provides the class to store information about which variables @@ -101,27 +100,12 @@ def write_list(self): def signatures_written(self): '''Convenience function to return only the signatures written. - :returns: the list of all signatures written. + :returns the list of all signatures written. :rtype: List[:py:class:`psyclone.core.Signature`] ''' return [sig for _, sig in self.write_list] - # ------------------------------------------------------------------------- - @property - def signatures_readwrite(self): - '''Convenience function to return only those signatures that have - read-write access (i.e. read before write). - - :returns: the sorted list of all signatures with read-write access. - :rtype: List[:py:class:`psyclone.core.Signature`] - - ''' - readers = set(sig for _, sig in self._read_list) - writers = set(sig for _, sig in self._write_list) - readwrites = readers.intersection(writers) - return sorted(list(readwrites)) - # ------------------------------------------------------------------------- @property def set_of_all_used_vars(self): From 041c4d0fce38cd085681e1024e8d516ab0c73e1e Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Mon, 14 Aug 2023 20:22:46 +0100 Subject: [PATCH 22/56] #2157 revert un-needed changes to signature_test.py --- src/psyclone/tests/core/signature_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/psyclone/tests/core/signature_test.py b/src/psyclone/tests/core/signature_test.py index 8209f2743f..815983f5b0 100644 --- a/src/psyclone/tests/core/signature_test.py +++ b/src/psyclone/tests/core/signature_test.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2022-2023, Science and Technology Facilities Council. +# Copyright (c) 2022, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -36,14 +36,14 @@ '''This module tests the Signature class.''' -from collections import OrderedDict +from __future__ import absolute_import import pytest from psyclone.core import ComponentIndices, Signature from psyclone.errors import InternalError from psyclone.psyir.backend.c import CWriter from psyclone.psyir.backend.fortran import FortranWriter -from psyclone.psyir.nodes import Reference, Routine, StructureReference +from psyclone.psyir.nodes import Reference from psyclone.psyir.symbols import DataSymbol, INTEGER_SINGLE_TYPE From f74a61d899c705ec6a3e66333f46ee18e28dd266 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Mon, 14 Aug 2023 22:35:11 +0100 Subject: [PATCH 23/56] #2157 add tests for ChildrenList triggering update signal --- src/psyclone/psyir/nodes/node.py | 3 +- src/psyclone/tests/psyir/nodes/node_test.py | 57 +++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/psyclone/psyir/nodes/node.py b/src/psyclone/psyir/nodes/node.py index d802859afc..fdf3c52ed6 100644 --- a/src/psyclone/psyir/nodes/node.py +++ b/src/psyclone/psyir/nodes/node.py @@ -38,7 +38,8 @@ # ----------------------------------------------------------------------------- ''' -This module contains the abstract Node implementation. +This module contains the abstract Node implementation as well as +ChildrenList - a custom implementation of list. ''' import copy diff --git a/src/psyclone/tests/psyir/nodes/node_test.py b/src/psyclone/tests/psyir/nodes/node_test.py index 9fd9522cdb..b202e1fc02 100644 --- a/src/psyclone/tests/psyir/nodes/node_test.py +++ b/src/psyclone/tests/psyir/nodes/node_test.py @@ -1080,6 +1080,63 @@ def test_children_setter(): assert statement2.parent is None +def test_children_trigger_update(): + '''Test that various modifications of ChildrenList all trigger a tree + update. We do this by implementing a sub-class of Schedule that has a + bespoke signal handler. + + ''' + class TestingSched(Schedule): + ''' + Sub-class of Schedule that re-implements update_signal() so that it + (configurably) raises a GenerationError when called. + + ''' + def __init__(self, test_enable=True): + # Controls whether or not an exception is raised by update_signal. + self._test_enable = test_enable + super().__init__() + + def update_signal(self): + if self._test_enable: + raise GenerationError("signal called OK") + super().update_signal() + + # Set-up a Schedule with some children with the exception disabled. + sched = TestingSched(test_enable=False) + sched.addchild(Return()) + sched.addchild(Return()) + # Enable the exception in the test class. + sched._test_enable = True + # Various ways of adding children. + with pytest.raises(GenerationError) as err: + sched.addchild(Return()) + assert "signal called OK" in str(err.value) + with pytest.raises(GenerationError) as err: + sched.children.extend([Return()]) + assert "signal called OK" in str(err.value) + with pytest.raises(GenerationError) as err: + sched.children.insert(1, Return()) + assert "signal called OK" in str(err.value) + # Various ways of removing children. + with pytest.raises(GenerationError) as err: + sched.children.pop() + assert "signal called OK" in str(err.value) + with pytest.raises(GenerationError) as err: + del sched.children[1] + assert "signal called OK" in str(err.value) + with pytest.raises(GenerationError) as err: + sched.children.remove(sched.children[0]) + assert "signal called OK" in str(err.value) + # Modifying members of the list. + with pytest.raises(GenerationError) as err: + sched.children[1] = Return() + assert "signal called OK" in str(err.value) + with pytest.raises(GenerationError) as err: + sched.children.reverse() + assert "signal called OK" in str(err.value) + + def test_lower_to_language_level(monkeypatch): ''' Test that Node has a lower_to_language_level() method that \ recurses to the same method of its children. ''' From 0337e3bbadfa6ead1784cf4b914b6ad560e74420 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Tue, 15 Aug 2023 09:05:07 +0100 Subject: [PATCH 24/56] #2157 tidy test file --- src/psyclone/tests/psyir/nodes/directive_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/psyclone/tests/psyir/nodes/directive_test.py b/src/psyclone/tests/psyir/nodes/directive_test.py index 12e57bab5a..6f4b6c6f30 100644 --- a/src/psyclone/tests/psyir/nodes/directive_test.py +++ b/src/psyclone/tests/psyir/nodes/directive_test.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2021-2022, Science and Technology Facilities Council. +# Copyright (c) 2021-2023, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -44,10 +44,10 @@ from psyclone import f2pygen from psyclone.core import Signature +from psyclone.errors import GenerationError from psyclone.parse.algorithm import parse from psyclone.psyGen import PSyFactory from psyclone.psyir import nodes -from psyclone.errors import GenerationError from psyclone.psyir.symbols import DataSymbol, INTEGER_TYPE from psyclone.transformations import ACCDataTrans, DynamoOMPParallelLoopTrans From 7a5527d1e167647df7db0bbbee5faa6cf9a6ff14 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Tue, 15 Aug 2023 23:24:51 +1000 Subject: [PATCH 25/56] #2258 Added psy_data wrapper for TAU. --- examples/gocean/eg5/profile/Makefile | 20 +++- examples/gocean/eg5/profile/test.x90 | 2 +- lib/profiling/Makefile | 3 +- lib/profiling/tau/.gitignore | 1 + lib/profiling/tau/Makefile | 63 ++++++++++++ lib/profiling/tau/README.md | 98 +++++++++++++++++++ lib/profiling/tau/tau_psy.f90 | 140 +++++++++++++++++++++++++++ 7 files changed, 324 insertions(+), 3 deletions(-) create mode 100644 lib/profiling/tau/.gitignore create mode 100644 lib/profiling/tau/Makefile create mode 100644 lib/profiling/tau/README.md create mode 100644 lib/profiling/tau/tau_psy.f90 diff --git a/examples/gocean/eg5/profile/Makefile b/examples/gocean/eg5/profile/Makefile index 2a7bd176a6..4370ce2c61 100644 --- a/examples/gocean/eg5/profile/Makefile +++ b/examples/gocean/eg5/profile/Makefile @@ -65,7 +65,7 @@ run: compile compile: transform template transform: psy.f90 -all: template simple_timing drhook dl_timer lfric +all: template simple_timing drhook dl_timer lfric tau template: $(MAKE) WRAPPER_DIR="$(PROFILE_DIR)/template" \ @@ -87,6 +87,16 @@ drhook: PROFILE_LINK="-L $(DRHOOK_DIR)/build/lib -ldrhook" \ drhook_lib $(NAME).drhook +TAU_DIR?=$(ROOT_DIR)/../tau +# By adding the dependency to INF_LIB here, we will be invoking the original +# compiler, not tau_f90.sh (since we don't want to instrument the whole +# infrastructure library with tau) +tau: $(INF_LIB) + $(MAKE) WRAPPER_DIR="$(PROFILE_DIR)/tau" \ + WRAPPER_NAME="tau_psy" \ + PROFILE_LINK="-L $(TAU_DIR)/build/lib" \ + tau_lib $(NAME).tau + # The dl-timer library is available from: # https://bitbucket.org/apeg/dl_timer/src/master/ # As default assume dl_timer is installed 'next' to PSyclone. @@ -112,6 +122,11 @@ lfric: # in order to preserve temporary files: #.SECONDARY: +$(NAME).tau: $(INF_LIB) $(WRAPPER_DIR)/lib$(WRAPPER_NAME).a $(KERNELS) psy.o alg.o + tau_f90.sh $(F90FLAGS) $(KERNELS) psy.o alg.o -o $@ \ + -L $(WRAPPER_DIR) -l $(WRAPPER_NAME) \ + $(PROFILE_LINK) $(INF_LIB) + $(NAME).%: $(INF_LIB) $(WRAPPER_DIR)/lib$(WRAPPER_NAME).a $(KERNELS) psy.o alg.o $(F90) $(F90FLAGS) $(KERNELS) psy.o alg.o -o $@ \ -L $(WRAPPER_DIR) -l $(WRAPPER_NAME) \ @@ -131,6 +146,9 @@ $(INF_LIB): drhook_lib : $(MAKE) DRHOOK_ROOT=$(DRHOOK_DIR) -C $(WRAPPER_DIR) +tau_lib : + $(MAKE) F90=tau_f90.sh TAU_ROOT=$(TAU_DIR) -C $(WRAPPER_DIR) + dl_timer_lib: $(MAKE) DL_TIMER_ROOT=$(DL_TIMER_ROOT) -C $(WRAPPER_DIR) diff --git a/examples/gocean/eg5/profile/test.x90 b/examples/gocean/eg5/profile/test.x90 index 2619773ce5..ec1eae15d7 100644 --- a/examples/gocean/eg5/profile/test.x90 +++ b/examples/gocean/eg5/profile/test.x90 @@ -80,4 +80,4 @@ Program test print *,a_fld%data(1:5, 1:5) call profile_PSyDataShutdown() -end program test \ No newline at end of file +end program test diff --git a/lib/profiling/Makefile b/lib/profiling/Makefile index e3fa251681..49b2112546 100644 --- a/lib/profiling/Makefile +++ b/lib/profiling/Makefile @@ -43,7 +43,7 @@ F90FLAGS ?= -g # We don't build dl_timer, drhook and nvidia since they require # external libraries to be available. -ALL_LIBS = template simple_timing lfric_timer +ALL_LIBS = template simple_timing lfric_timer tau .PHONY: default all $(ALL_LIBS) clean allclean @@ -64,3 +64,4 @@ allclean: clean $(MAKE) -C nvidia clean $(MAKE) -C drhook clean $(MAKE) -C dl_timer clean + $(MAKE) -C tau clean diff --git a/lib/profiling/tau/.gitignore b/lib/profiling/tau/.gitignore new file mode 100644 index 0000000000..6e31c806df --- /dev/null +++ b/lib/profiling/tau/.gitignore @@ -0,0 +1 @@ +libtau_psy.a diff --git a/lib/profiling/tau/Makefile b/lib/profiling/tau/Makefile new file mode 100644 index 0000000000..62cbae4996 --- /dev/null +++ b/lib/profiling/tau/Makefile @@ -0,0 +1,63 @@ +# ----------------------------------------------------------------------------- +# BSD 3-Clause License +# +# Copyright (c) 2023, Science and Technology Facilities Council. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ----------------------------------------------------------------------------- +# Author J. Henrichs, Bureau of Meteorology + +# ----------- Default "make" values, can be overwritten by the user ----------- +# Hardcode the ta +F90 = tau_f90.sh +F90FLAGS = -optLinkOnly + +# ----------------------------------------------------------------------------- + +F90FLAGS += -I$(DRHOOK_INCLUDE) -I$(DRHOOK_MODULES) + +PSYDATA_LIB_NAME = tau_psy +PSYDATA_LIB = lib$(PSYDATA_LIB_NAME).a + +OBJS = tau_psy.o + +default: $(PSYDATA_LIB) + +.PHONY: default clean allclean + +$(PSYDATA_LIB): $(OBJS) + ar rs $(PSYDATA_LIB) $(OBJS) + +%.o: %.f90 + $(F90) $(F90FLAGS) -c $< + +clean: + rm -f *.o *.mod $(PSYDATA_LIB) *pomp.f90 *opari.inc + +allclean: clean diff --git a/lib/profiling/tau/README.md b/lib/profiling/tau/README.md new file mode 100644 index 0000000000..c035a2362a --- /dev/null +++ b/lib/profiling/tau/README.md @@ -0,0 +1,98 @@ +# PSyclone Wrapper Library for TAU + +This is a wrapper library that maps the [PSyclone profiling API]( +https://psyclone.readthedocs.io/en/stable/profiling.html#profiling) +to the TAU API. + +## Dependencies + +TAU must be installed. + +This profiling library uses the [PSyData API]( +https://psyclone.readthedocs.io/en/stable/psy_data.html) to interface with +the application. The library is based on the [PSyData base class]( +https://psyclone-dev.readthedocs.io/en/latest/psy_data.html#psydata-base-class), +which is included in PSyclone as a Jinja template, ``psy_data_base.jinja``. +Full documentation on using this template is provided in the PSyclone +[Developer Guide]( +https://psyclone-dev.readthedocs.io/en/latest/psy_data.html#jinja). + +The library uses the ``ProfileData`` type to store TAU's handle for each +region. + +## Compilation + +The library is compiled with ``make`` using the provided ``Makefile``. The +environment variables ``$F90`` and ``$F90FLAGS`` can be set to point to the +[Fortran compiler](./../../README.md#compilation) and flags to use. They +default to ``gfortran`` and the empty string. + +To compile the PSyclone wrapper library for TAU, use tau_f90.sh compiler +wrapper. + +The compilation process will create the wrapper library ``libtau_psy.a``. + +### Linking the wrapper library + +In order to use the wrapper with your application, you must provide the +location of the wrapper as an ``include`` path (so that the module file is found), +and link first with the wrapper library, then the DrHook library: + +In order to use the wrapper with your application, the location of this +library must be provided as an ``include`` path (so that the module file +is found), and linked first with the wrapper library, ``tau_psy``, +and then with the Dr Hook library: + +```shell +$(F90) -c ... -I /lib/profiling/tau somefile.f90 +tau_f90.sh -o a.out ... -L /lib/profiling/tau -ltau_psy +``` + +**Note:** + +- The ```` differs depending on whether the wrapper + library is compiled in a clone of PSyclone repository or in a PSyclone + [installation](./../../README.md#installation). + + + diff --git a/lib/profiling/tau/tau_psy.f90 b/lib/profiling/tau/tau_psy.f90 new file mode 100644 index 0000000000..eb57286ea8 --- /dev/null +++ b/lib/profiling/tau/tau_psy.f90 @@ -0,0 +1,140 @@ +! ----------------------------------------------------------------------------- +! BSD 3-Clause License +! +! Copyright (c) 2023, Science and Technology Facilities Council. +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions are met: +! +! * Redistributions of source code must retain the above copyright notice, this +! list of conditions and the following disclaimer. +! +! * Redistributions in binary form must reproduce the above copyright notice, +! this list of conditions and the following disclaimer in the documentation +! and/or other materials provided with the distribution. +! +! * Neither the name of the copyright holder nor the names of its +! contributors may be used to endorse or promote products derived from +! this software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +! DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +! FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +! SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +! CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +! OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! ----------------------------------------------------------------------------- +! Author J. Henrichs, Bureau of Meteorology + + +!> An implementation of the PSyData API for profiling which wraps the use of TAU. + +module profile_psy_data_mod + + implicit none + + type :: profile_PSyDataType + ! The TAU profiling handler + integer, dimension(2) :: profiler + + ! True if this instance of PSyDataType has the name already + ! initialised. This way the copy of subroutine name is only + ! done first time PreStart is called. + logical :: initialised = .false. + contains + ! The profiling API uses only the two following calls: + procedure :: PreStart + procedure :: PostEnd + end type profile_PSyDataType + +contains + + ! --------------------------------------------------------------------------- + !> The initialisation subroutine. It is not called directly from + !! any PSyclone created code, so a call to profile_PSyDataInit must be + !! inserted manually by the developer. In case of TAU an initialisation + !! is not necessary. + + subroutine profile_PSyDataInit() + implicit none + print *,"profile-psydatainit" + call TAU_PROFILE_INIT(); + end subroutine profile_PSyDataInit + + ! --------------------------------------------------------------------------- + !> Starts a profiling area. The module and region name can be used to create + !! a unique name for each region. + !! Parameters: + !! @param[in,out] this This PSyData instance. + !! @param[in] module_name Name of the module in which the region is + !! @param[in] region_name Name of the region (could be name of an invoke, or + !! subroutine name). + !! @param[in] num_pre_vars The number of variables that are declared and + !! written before the instrumented region. + !! @param[in] num_post_vars The number of variables that are also declared + !! before an instrumented region of code, but are written after + !! this region. + + subroutine PreStart(this, module_name, region_name, num_pre_vars, & + num_post_vars) + + implicit none + + class(profile_PSyDataType), intent(inout), target :: this + character(len=*), intent(in) :: module_name, region_name + integer, intent(in) :: num_pre_vars, num_post_vars + + if (.not. this%initialised) then + call TAU_PROFILE_TIMER(this%profiler, module_name//":"//region_name) + this%initialised = .true. + print *,"prestart1", module_name//":"//region_name + endif + call TAU_PROFILE_START(this%profiler) + print *,"prestart0", module_name//":"//region_name + + end subroutine PreStart + + ! --------------------------------------------------------------------------- + !! Ends a profiling area. It takes a PSyDataType type that corresponds to + !! to the PreStart call. + !! @param[in,out] this This PSyData instance. + ! + subroutine PostEnd(this) + + implicit none + + class(profile_PSyDataType), intent(inout), target :: this + + call TAU_PROFILE_STOP(this%profiler) + + end subroutine PostEnd + + ! --------------------------------------------------------------------------- + !> Called at the end of the execution of a program, usually to generate + !! all output for the profiling library. Not required in the case of TAU. + subroutine profile_PSyDataShutdown() + implicit none + end subroutine profile_PSyDataShutdown + + ! --------------------------------------------------------------------------- + !> Enable profiling + subroutine profile_PSyDataStart() + + implicit none + end subroutine profile_PSyDataStart + + ! --------------------------------------------------------------------------- + !> Disable profiling + subroutine profile_PSyDataStop() + + implicit none + + end subroutine profile_PSyDataStop + +end module profile_psy_data_mod + From 2b3f325d63e2318d108a960e8c145b37a1197b1a Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Wed, 16 Aug 2023 10:50:16 +1000 Subject: [PATCH 26/56] #2258 Updated documentation. --- doc/developer_guide/psy_data.rst | 8 ++++---- doc/user_guide/examples.rst | 2 +- doc/user_guide/libraries.rst | 2 +- doc/user_guide/profiling.rst | 15 ++++++++++----- lib/profiling/tau/README.md | 31 ++++++++++++++++--------------- 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/doc/developer_guide/psy_data.rst b/doc/developer_guide/psy_data.rst index d8a8b43a9c..792c9e7442 100644 --- a/doc/developer_guide/psy_data.rst +++ b/doc/developer_guide/psy_data.rst @@ -72,7 +72,7 @@ the same time as checking that read-only values are indeed not modified, different module names and data types must be used. PSyData divides its application into different classes. For example, -the class "profile" is used for all profiling tools (e.g. DrHook or the +the class "profile" is used for all profiling tools (e.g. TAU, DrHook or the NVIDIA profiling tools). This class name is used as a prefix for the module name, the ``PSyDataType`` and functions. So if a profiling application is linked the above code will actually look like this:: @@ -100,8 +100,8 @@ The class prefixes supported at the moment are: ======================= ======================================================= Class Prefix Description ======================= ======================================================= -profile All libraries related to profiling tools like DrHook, - NVIDIA's profiling tools etc. See +profile All libraries related to profiling tools like TAU, + DrHook, NVIDIA's profiling tools etc. See :ref:`user_guide:profiling` for details. extract For libraries used for kernel data extraction. See :ref:`user_guide:psyke` for details. @@ -967,7 +967,7 @@ an index used by the profiling tool in ``profile_PSyDataType``, or by storing pointers to the profiling data to be able to print all results in a ProfileFinalise() subroutine. Some of the wrapper libraries use the PSyData base class (e.g. dl_timer, -simple_timing, template), others do not (e.g. NVIDIA profiling, +simple_timing, template), others do not (e.g. NVIDIA profiling, TAU, DrHook wrapper). diff --git a/doc/user_guide/examples.rst b/doc/user_guide/examples.rst index 0533788a61..8c852c55df 100644 --- a/doc/user_guide/examples.rst +++ b/doc/user_guide/examples.rst @@ -265,7 +265,7 @@ Example 5.2: Profiling This example shows how to use the profiling support in PSyclone. It instruments two invoke statements and can link in with any of the following profiling wrapper libraries: template, -simple_timer, dl_timer, and DrHook (see +simple_timer, dl_timer, TAU, and DrHook (see :ref:`profiling_third_party_tools`). The ``README.md`` file contains detailed instructions on how to build the different executables. By default (i.e. just using ``make`` diff --git a/doc/user_guide/libraries.rst b/doc/user_guide/libraries.rst index a63001b8ea..a4ed05c7d5 100644 --- a/doc/user_guide/libraries.rst +++ b/doc/user_guide/libraries.rst @@ -70,7 +70,7 @@ Profiling ^^^^^^^^^ PSyclone provides wrapper libraries for some common performance profiling -tools, such as dl_timer and Dr Hook. More information can be found in +tools, such as dl_timer, TAU, and Dr Hook. More information can be found in the :ref:`Profiling ` section. Profiling libraries are located in the ``lib/profiling`` `directory diff --git a/doc/user_guide/profiling.rst b/doc/user_guide/profiling.rst index 853f39c262..446aa93d3c 100644 --- a/doc/user_guide/profiling.rst +++ b/doc/user_guide/profiling.rst @@ -51,7 +51,7 @@ transformation within a transformation script. PSyclone can be used with a variety of existing profiling tools. -It currently supports dl_timer, Dr Hook, the NVIDIA GPU profiling +It currently supports dl_timer, TAU, Dr Hook, the NVIDIA GPU profiling tools and it comes with a simple stand-alone timer library. The :ref:`PSyData API ` (see also the :ref:`Developer Guide `) @@ -77,7 +77,7 @@ Interface to Third Party Profiling Tools ---------------------------------------- PSyclone comes with :ref:`wrapper libraries ` to support -usage of Dr Hook, dl_timer, NVTX (NVIDIA Tools Extension library), +usage of TAU, Dr Hook, dl_timer, NVTX (NVIDIA Tools Extension library), and a simple non-thread-safe timing library. Support for further profiling libraries will be added in the future. To compile the wrapper libraries, change into the directory ``lib/profiling`` @@ -112,6 +112,10 @@ libraries that come with PSyclone: support. Additional link options might therefore be required (e.g. enabling OpenMP, or linking with MPI). +``lib/profiling/tau`` + This wrapper uses TAU profiling and tracing toolkit. It can be + downloaded from ``https://www.cs.uoregon.edu/research/tau``. + ``lib/profiling/drhook`` This wrapper uses the Dr Hook library. You need to contact ECMWF to obtain a copy of Dr Hook. @@ -145,9 +149,10 @@ module. The functions that need to be implemented are described in the developer's guide (:ref:`dev_guide:psy_data`). Most libraries in ``lib/profiling`` need to be linked in -with the corresponding 3rd party profiling tool. The -exceptions are the template and simple_timing libraries, -which are stand alone. The profiling example in +with the corresponding 3rd party profiling tool, or use a compiler +wrapper provided by the tool which will provided the required additional +compiler parameters. The exceptions are the template and simple_timing +libraries, which are stand alone. The profiling example in ``examples/gocean/eg5/profile`` can be used with any of the wrapper libraries (except ``nvidia``) to see how they work. diff --git a/lib/profiling/tau/README.md b/lib/profiling/tau/README.md index c035a2362a..e6cba33f08 100644 --- a/lib/profiling/tau/README.md +++ b/lib/profiling/tau/README.md @@ -6,7 +6,11 @@ to the TAU API. ## Dependencies -TAU must be installed. +TAU must be installed, and the ``tau_f90.sh`` compiler wrapper must +be available. Since tau can be used with different configurations +based on the setting of ``TAU_MAKEFILE``, it is recommended to make +sure that the same configuration is used to compile the TAU wrapper +and the application later. This profiling library uses the [PSyData API]( https://psyclone.readthedocs.io/en/stable/psy_data.html) to interface with @@ -22,26 +26,23 @@ region. ## Compilation -The library is compiled with ``make`` using the provided ``Makefile``. The -environment variables ``$F90`` and ``$F90FLAGS`` can be set to point to the -[Fortran compiler](./../../README.md#compilation) and flags to use. They -default to ``gfortran`` and the empty string. - -To compile the PSyclone wrapper library for TAU, use tau_f90.sh compiler -wrapper. +The library is compiled with ``make`` using the provided ``Makefile``. It +uses the ``tau_f90.sh`` compiler wrapper as Fortran compiler, so the +``$F90`` environment variable is ignored here. Additional compiler flags +can be provided by setting ``$F90FLAGS``. The compilation process will create the wrapper library ``libtau_psy.a``. ### Linking the wrapper library -In order to use the wrapper with your application, you must provide the -location of the wrapper as an ``include`` path (so that the module file is found), -and link first with the wrapper library, then the DrHook library: +In order to use the wrapper with your application, at compile time you must +provide the location of the wrapper as an ``include`` path (so that the +module file is found). It is not required to use the ``tau_f90.sh`` +compiler wrapper when compiling the application. -In order to use the wrapper with your application, the location of this -library must be provided as an ``include`` path (so that the module file -is found), and linked first with the wrapper library, ``tau_psy``, -and then with the Dr Hook library: +At link time, you need to link with the wrapper library ``libtau_psy.a``. +If you use the ``tau_f90.sh`` compiler wrapper, nothing else is required, +otherwise you need to add the required libraries from TAU at link time. ```shell $(F90) -c ... -I /lib/profiling/tau somefile.f90 From 76be168e4da7bd06ef83e7c95e8f09ec53a250a1 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 16 Aug 2023 08:36:46 +0100 Subject: [PATCH 27/56] #2157 revert change to node.children() --- src/psyclone/psyir/nodes/node.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/psyclone/psyir/nodes/node.py b/src/psyclone/psyir/nodes/node.py index fdf3c52ed6..0bf9e39661 100644 --- a/src/psyclone/psyir/nodes/node.py +++ b/src/psyclone/psyir/nodes/node.py @@ -910,10 +910,6 @@ def children(self): :returns: the immediate children of this Node. :rtype: List[:py:class:`psyclone.psyir.nodes.Node`] ''' - # An incomplete node may not have the _children attribute so return - # an empty list in this case. - if not hasattr(self, "_children"): - return [] return self._children @children.setter From bf42f5dd44bb635a83c8a6e6d98dd1576341d910 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 16 Aug 2023 09:37:36 +0100 Subject: [PATCH 28/56] #2157 add intermediate method to deal with data clauses --- src/psyclone/psyir/nodes/acc_directives.py | 17 +++++-- src/psyclone/psyir/nodes/scoping_node.py | 3 +- .../tests/psyir/nodes/acc_directives_test.py | 50 ++++++++++++++++++- 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/psyclone/psyir/nodes/acc_directives.py b/src/psyclone/psyir/nodes/acc_directives.py index 16db4c9960..0945979875 100644 --- a/src/psyclone/psyir/nodes/acc_directives.py +++ b/src/psyclone/psyir/nodes/acc_directives.py @@ -42,7 +42,6 @@ nodes.''' import abc -from collections import OrderedDict from psyclone.core import Signature from psyclone.f2pygen import DirectiveGen, CommentGen @@ -673,8 +672,18 @@ def end_string(self): def _update_node(self): ''' Called whenever there is a change in the PSyIR tree below this node. - This may mean that the various copy[in/out] clauses need updating if - the contents of the data region have changed. + + Ensures that the various data-movement clauses are up-to-date. + + ''' + self._update_data_movement_clauses() + + def _update_data_movement_clauses(self): + ''' + Updates the data-movement clauses on this directive. + + First removes any such clauses and then regenerates them using + dependence analysis to determine which variables (if any) need moving. ''' # Remove the clauses that we will update. @@ -683,6 +692,8 @@ def _update_node(self): (ACCCopyInClause, ACCCopyOutClause, ACCCopyClause)): self.children.remove(child) + # Use dependence analysis to identify the variables that are read, + # written and read+written within the tree below this node. reads, writes, readwrites = self.create_data_movement_deep_copy_refs() if reads: diff --git a/src/psyclone/psyir/nodes/scoping_node.py b/src/psyclone/psyir/nodes/scoping_node.py index 07f721093f..4ba90f36a3 100644 --- a/src/psyclone/psyir/nodes/scoping_node.py +++ b/src/psyclone/psyir/nodes/scoping_node.py @@ -62,7 +62,8 @@ class ScopingNode(Node): _symbol_table_class = SymbolTable def __init__(self, children=None, parent=None, symbol_table=None): - super().__init__(self, children=children, parent=parent) + super(ScopingNode, self).__init__(self, children=children, + parent=parent) self._symbol_table = None if symbol_table is not None: diff --git a/src/psyclone/tests/psyir/nodes/acc_directives_test.py b/src/psyclone/tests/psyir/nodes/acc_directives_test.py index e8b39b858c..a64cd50cb8 100644 --- a/src/psyclone/tests/psyir/nodes/acc_directives_test.py +++ b/src/psyclone/tests/psyir/nodes/acc_directives_test.py @@ -49,11 +49,16 @@ from psyclone.psyGen import PSyFactory from psyclone.psyir.nodes import (ACCKernelsDirective, ACCLoopDirective, + ACCRegionDirective, ACCRoutineDirective, - ACCUpdateDirective) + ACCUpdateDirective, + Assignment, + Literal, + Reference, + Routine) from psyclone.psyir.nodes.loop import Loop from psyclone.psyir.nodes.schedule import Schedule -from psyclone.psyir.symbols import SymbolTable +from psyclone.psyir.symbols import SymbolTable, DataSymbol, INTEGER_TYPE from psyclone.transformations import (ACCDataTrans, ACCEnterDataTrans, ACCParallelTrans, ACCKernelsTrans) @@ -69,6 +74,47 @@ def setup(): Config._instance = None +# Class ACCRegionDirective + +class MyACCRegion(ACCRegionDirective): + '''Concreate test class sub-classed from ACCRegionDirective.''' + + +def test_accregiondir_validate_global(fortran_reader): + '''Check that the validate_global_constraints() method rejects PSyDataNode + and CodeBlock nodes.''' + accnode = MyACCRegion() + cblock = fortran_reader.psyir_from_statement("write(*,*) 'hello'", + SymbolTable()) + accnode.dir_body.addchild(cblock) + with pytest.raises(GenerationError) as err: + accnode.validate_global_constraints() + assert ("Cannot include CodeBlocks or calls to PSyData routines within " + "OpenACC regions but found ['CodeBlock'] within a region enclosed " + "by an 'MyACCRegion'" in str(err.value)) + + +def test_accregiondir_signatures(): + '''Test the signatures property of ACCRegionDirective.''' + routine = Routine("test_prog") + accnode = MyACCRegion() + routine.addchild(accnode) + bob = DataSymbol("bob", INTEGER_TYPE) + richard = DataSymbol("richard", INTEGER_TYPE) + routine.symbol_table.add(bob) + accnode.dir_body.addchild( + Assignment.create(lhs=Reference(bob), rhs=Literal("1", INTEGER_TYPE))) + accnode.dir_body.addchild( + Assignment.create(lhs=Reference(bob), rhs=Literal("1", INTEGER_TYPE))) + accnode.dir_body.addchild( + Assignment.create(lhs=Reference(bob), rhs=Literal("1", INTEGER_TYPE))) + accnode.dir_body.addchild( + Assignment.create(lhs=Reference(bob), rhs=Reference(richard))) + # pylint: disable=unbalanced-tuple-unpacking + reads, writes = accnode.signatures + assert Signature("richard") in reads + assert Signature("bob") in writes + # Class ACCEnterDataDirective start From 304ee567a8874bfb92ec8bfc1bbb9d14c15df4ed Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 17 Aug 2023 16:22:03 +1000 Subject: [PATCH 29/56] #2258 Removed space between -I and path, since tau_f90.sh does not like it (it drops -I) --- examples/gocean/eg5/profile/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/gocean/eg5/profile/Makefile b/examples/gocean/eg5/profile/Makefile index 4370ce2c61..924f71b271 100644 --- a/examples/gocean/eg5/profile/Makefile +++ b/examples/gocean/eg5/profile/Makefile @@ -164,10 +164,10 @@ $(DEP_LIB): # Special rule to create psy_LIBNAME.o for each wrapper library (required # since PSyDataType will differ from one wrapper library to the next) psy.o: psy.f90 $(KERNELS) - $(F90) -o $@ $(F90FLAGS) -I $(INF_INC) -I $(WRAPPER_DIR) -c $< + $(F90) -o $@ $(F90FLAGS) -I$(INF_INC) -I$(WRAPPER_DIR) -c $< %.o: %.f90 - $(F90) $(F90FLAGS) -I $(INF_INC) -I $(WRAPPER_DIR) -c $< + $(F90) $(F90FLAGS) -I$(INF_INC) -I$(WRAPPER_DIR) -c $< allclean: clean ${MAKE} -C $(PROFILE_DIR) allclean From 63d99bca572d3c0e7bd29d74eaa2dbe23e8f7d67 Mon Sep 17 00:00:00 2001 From: Aidan Chalk <3043914+LonelyCat124@users.noreply.github.com> Date: Thu, 17 Aug 2023 11:13:08 +0100 Subject: [PATCH 30/56] Added and tested a get_ubound_expression function --- src/psyclone/psyir/nodes/array_mixin.py | 75 ++++++++ .../tests/psyir/nodes/array_mixin_test.py | 161 +++++++++++++++--- 2 files changed, 213 insertions(+), 23 deletions(-) diff --git a/src/psyclone/psyir/nodes/array_mixin.py b/src/psyclone/psyir/nodes/array_mixin.py index 6f2a802916..a0d0468ac6 100644 --- a/src/psyclone/psyir/nodes/array_mixin.py +++ b/src/psyclone/psyir/nodes/array_mixin.py @@ -34,6 +34,7 @@ # Authors R. W. Ford, A. R. Porter, S. Siso and N. Nobre, STFC Daresbury Lab # I. Kavcic, Met Office # J. Henrichs, Bureau of Meteorology +# Modified: A. B. G. Chalk, STFC Daresbury Lab # ----------------------------------------------------------------------------- ''' This module contains the implementation of the abstract ArrayMixin. ''' @@ -243,6 +244,80 @@ def get_lbound_expression(self, pos): return BinaryOperation.create(BinaryOperation.Operator.LBOUND, ref, Literal(str(pos+1), INTEGER_TYPE)) + def get_ubound_expression(self, pos): + ''' + Lookup the upper bound of this ArrayMixin. If we don't have the + necessary type information then a call to the UBOUND intrinsic is + constructed and returned. + + :param int pos: the dimension of the array for which to lookup the \ + upper bound. + + :returns: the declared upper bound for the specified dimension of \ + the array accesed or a call to the UBOUND intrinsic if it is \ + unknown. + :rtype: :py:class:`psyclone.psyir.nodes.Node` + + ''' + # First, walk up to the parent reference and get its type. For a simple + # ArrayReference this will just be self. + root_ref = self.ancestor(Reference, include_self=True) + cursor_type = root_ref.symbol.datatype + + # Walk back down the structure, looking up the type information as we + # go. We also collect the necessary information for creating a new + # Reference as argument to the UBOUND intrinsic in case the type + # information is not available. + cnames = [] + cursor = root_ref + while cursor is not self: + cursor = cursor.member + # Collect member information. + if isinstance(cursor, ArrayMixin): + new_indices = [idx.copy() for idx in cursor.indices] + cnames.append((cursor.name, new_indices)) + else: + cnames.append(cursor.name) + # Continue to resolve datatype unless we hit an + # UnknownType or DeferredType. + if isinstance(cursor_type, ArrayType): + cursor_type = cursor_type.intrinsic + if isinstance(cursor_type, DataTypeSymbol): + cursor_type = cursor_type.datatype + if isinstance(cursor_type, (UnknownType, DeferredType)): + continue + cursor_type = cursor_type.components[cursor.name].datatype + + if (isinstance(cursor_type, ArrayType) and + cursor_type.shape[pos] not in [ArrayType.Extent.DEFERRED, + ArrayType.Extent.ATTRIBUTE]): + # We have the full type information and the upper bound is known. + return cursor_type.shape[pos].upper.copy() + + # We've either failed to resolve the type or we don't know the extent + # of the array dimension so construct a call to the UBOUND intrinsic. + if cnames: + # We have some sort of structure access - remove any indexing + # information from the ultimate member of the structure access. + if len(cnames[-1]) == 2: + cnames[-1] = cnames[-1][0] + # Have to import here to avoid circular dependencies. + # pylint: disable=import-outside-toplevel + from psyclone.psyir.nodes import (ArrayOfStructuresReference, + StructureReference) + if isinstance(root_ref, ArrayMixin): + new_indices = [idx.copy() for idx in root_ref.indices] + ref = ArrayOfStructuresReference.create( + root_ref.symbol, new_indices, cnames) + else: + ref = StructureReference.create(root_ref.symbol, cnames) + else: + # A simple Reference. + ref = Reference(root_ref.symbol) + + return BinaryOperation.create(BinaryOperation.Operator.UBOUND, ref, + Literal(str(pos+1), INTEGER_TYPE)) + def is_upper_bound(self, index): '''Returns whether this array access includes the upper bound of the array for the specified index. Returns True if it is and False diff --git a/src/psyclone/tests/psyir/nodes/array_mixin_test.py b/src/psyclone/tests/psyir/nodes/array_mixin_test.py index b7dc4d6ef4..ae95c4103a 100644 --- a/src/psyclone/tests/psyir/nodes/array_mixin_test.py +++ b/src/psyclone/tests/psyir/nodes/array_mixin_test.py @@ -33,6 +33,7 @@ # ----------------------------------------------------------------------------- # Author S. Siso, STFC Daresbury Lab # Modified: R. W. Ford and A. R. Porter, STFC Daresbury Lab +# Modified: A. B. G. Chalk, STFC Daresbury Lab # ----------------------------------------------------------------------------- ''' Performs py.test tests of the ArrayMixin PSyIR nodes trait. ''' @@ -59,26 +60,25 @@ def test_is_bound_op(): class. ''' - one = Literal("1", INTEGER_TYPE) array = DataSymbol("my_symbol", ArrayType(INTEGER_TYPE, [10])) array2 = DataSymbol("my_symbol2", ArrayType(INTEGER_TYPE, [10])) scalar = DataSymbol("tmp", INTEGER_TYPE) ubound = BinaryOperation.create( - BinaryOperation.Operator.UBOUND, Reference(array), one) - my_range = Range.create(one.copy(), ubound) + BinaryOperation.Operator.UBOUND, Reference(array), _ONE.copy()) + my_range = Range.create(_ONE.copy(), ubound) array_ref = ArrayReference.create(array, [my_range]) array2_ref = ArrayReference.create(array2, [my_range.copy()]) # not a binary operation oper = None assert not array_ref._is_bound_op( - oper, BinaryOperation.Operator.UBOUND, one) + oper, BinaryOperation.Operator.UBOUND, _ONE) # not a match with the binary operator oper = BinaryOperation.create( - BinaryOperation.Operator.LBOUND, array_ref, one.copy()) + BinaryOperation.Operator.LBOUND, array_ref, _ONE.copy()) assert not array_ref._is_bound_op(oper, BinaryOperation.Operator.UBOUND, 0) # 1st dimension of the bound is not the same array oper = BinaryOperation.create( - BinaryOperation.Operator.UBOUND, array2_ref, one.copy()) + BinaryOperation.Operator.UBOUND, array2_ref, _ONE.copy()) assert not array_ref._is_bound_op(oper, BinaryOperation.Operator.UBOUND, 0) # 2nd dimension of the bound not a literal oper = BinaryOperation.create( @@ -96,7 +96,7 @@ def test_is_bound_op(): assert not array_ref._is_bound_op(oper, BinaryOperation.Operator.UBOUND, 0) # OK oper = BinaryOperation.create( - BinaryOperation.Operator.UBOUND, array_ref.copy(), one.copy()) + BinaryOperation.Operator.UBOUND, array_ref.copy(), _ONE.copy()) assert array_ref._is_bound_op(oper, BinaryOperation.Operator.UBOUND, 0) @@ -318,6 +318,40 @@ def test_get_lbound_expression(): assert lbnd.children[1] == Literal("2", INTEGER_TYPE) +def test_get_ubound_expression(): + ''' + Tests for the get_ubound_expression method on an ArrayReference defined + by an ArrayType. + + ''' + # Symbol is of ArrayType. + ubound = DataSymbol("jmin", INTEGER_TYPE, is_constant=True, + initial_value=Literal("10", INTEGER_TYPE)) + ubnd_ref = Reference(ubound) + symbol = DataSymbol("my_symbol", ArrayType(INTEGER_TYPE, + [1, (1, 2), (1, ubnd_ref)])) + aref = ArrayReference.create(symbol, + [_ONE.copy(), _ONE.copy(), _ONE.copy()]) + assert aref.get_ubound_expression(0) == _ONE + assert aref.get_ubound_expression(1) == _TWO + ub2 = aref.get_ubound_expression(2) + assert isinstance(ub2, Reference) + # Returned lower bound should be a *copy* of the original. + assert ub2 is not ubnd_ref + assert ub2 == ubnd_ref + + # Symbol is of DeferredType so the result should be an instance of the + # UBOUND intrinsic. + dtsym = DataSymbol("oops", DeferredType()) + dtref = ArrayReference.create(dtsym, + [_ONE.copy(), _ONE.copy(), _ONE.copy()]) + ubnd = dtref.get_ubound_expression(1) + assert isinstance(ubnd, BinaryOperation) + assert ubnd.operator == BinaryOperation.Operator.UBOUND + assert ubnd.children[0].symbol is dtsym + assert ubnd.children[1] == Literal("2", INTEGER_TYPE) + + @pytest.mark.parametrize("extent", [ArrayType.Extent.DEFERRED, ArrayType.Extent.ATTRIBUTE]) def test_get_lbound_expression_unknown_size(extent): @@ -335,6 +369,23 @@ def test_get_lbound_expression_unknown_size(extent): assert lbnd.children[0].symbol is symbol +@pytest.mark.parametrize("extent", [ArrayType.Extent.DEFERRED, + ArrayType.Extent.ATTRIBUTE]) +def test_get_ubound_expression_unknown_size(extent): + ''' + Test the get_ubound_expression when we have the definition of the + array type but its dimensions are unknown. + + ''' + symbol = DataSymbol("my_symbol", ArrayType(INTEGER_TYPE, + [extent, extent])) + aref = ArrayReference.create(symbol, [_ONE.copy(), _ONE.copy()]) + ubnd = aref.get_ubound_expression(1) + assert isinstance(ubnd, BinaryOperation) + assert ubnd.operator == BinaryOperation.Operator.UBOUND + assert ubnd.children[0].symbol is symbol + + def test_aref_to_aos_lbound_expression(): ''' Test the get_lbound_expression() method for an ArrayReference to an array @@ -345,37 +396,53 @@ def test_aref_to_aos_lbound_expression(): [("id", INTEGER_TYPE, Symbol.Visibility.PUBLIC)]) sgrid_type_sym = DataTypeSymbol("subgrid_type", sgrid_type) sym = DataSymbol("subgrids", ArrayType(sgrid_type_sym, [(3, 10)])) - one = Literal("1", INTEGER_TYPE) lbound = BinaryOperation.create(BinaryOperation.Operator.LBOUND, - Reference(sym), one) + Reference(sym), _ONE.copy()) ubound = BinaryOperation.create(BinaryOperation.Operator.UBOUND, - Reference(sym), one.copy()) + Reference(sym), _ONE.copy()) array = ArrayReference.create(sym, [Range.create(lbound, ubound)]) lbnd = array.get_lbound_expression(0) assert lbnd.value == "3" +def test_aref_to_aos_ubound_expression(): + ''' + Test the get_ubound_expression method for an ArrayReference to an array + of structures. + + ''' + sgrid_type = StructureType.create( + [("id", INTEGER_TYPE, Symbol.Visibility.PUBLIC)]) + sgrid_type_sym = DataTypeSymbol("subgrid_type", sgrid_type) + sym = DataSymbol("subgrids", ArrayType(sgrid_type_sym, [(3, 10)])) + lbound = BinaryOperation.create(BinaryOperation.Operator.LBOUND, + Reference(sym), _ONE.copy()) + ubound = BinaryOperation.create(BinaryOperation.Operator.UBOUND, + Reference(sym), _ONE.copy()) + array = ArrayReference.create(sym, [Range.create(lbound, ubound)]) + ubnd = array.get_ubound_expression(0) + assert ubnd.value == "10" + + def test_member_get_lbound_expression(fortran_writer): ''' Tests for the get_lbound_expression() method when used with a sub-class of Member. ''' - one = Literal("1", INTEGER_TYPE) - two = Literal("2", INTEGER_TYPE) # First, test when we don't have type information. grid_type = DataTypeSymbol("grid_type", DeferredType()) sym = DataSymbol("grid_var", grid_type) - ref = StructureReference.create(sym, [("data", [one.copy()])]) + ref = StructureReference.create(sym, [("data", [_ONE.copy()])]) lbnd = ref.member.get_lbound_expression(0) assert isinstance(lbnd, BinaryOperation) out = fortran_writer(lbnd).lower() assert out == "lbound(grid_var%data, 1)" usym = DataSymbol("uvar", DeferredType()) ref = ArrayOfStructuresReference.create( - usym, [one.copy()], - [("map", [one.copy(), two.copy()]), - ("data", [one.copy()])]) + usym, [_ONE.copy()], + [("map", [_ONE.copy(), _TWO.copy()]), + ("data", [_ONE.copy()])]) lbnd = ref.member.member.get_lbound_expression(0) assert isinstance(lbnd, BinaryOperation) out = fortran_writer(lbnd).lower() @@ -395,14 +462,62 @@ def test_member_get_lbound_expression(fortran_writer): ssym = DataSymbol("var", stypedef2) sref = StructureReference.create(ssym, ["grid", - ("map", [two.copy(), two.copy()])]) - assert sref.member.member.get_lbound_expression(0) == one - assert sref.member.member.get_lbound_expression(1) == two + ("map", [_TWO.copy(), _TWO.copy()])]) + assert sref.member.member.get_lbound_expression(0) == _ONE + assert sref.member.member.get_lbound_expression(1) == _TWO + sref2 = StructureReference.create( + ssym, [("subgrids", [_TWO.copy(), _TWO.copy()]), + ("map", [_TWO.copy(), _TWO.copy()])]) + assert sref2.member.get_lbound_expression(1) == _TWO + assert sref2.member.member.get_lbound_expression(1) == _TWO + + +def test_member_get_ubound_expression(fortran_writer): + ''' + Tests for the get_ubound_expression method when used with a + sub-class of Member. + + ''' + # First, test when we don't have type information. + grid_type = DataTypeSymbol("grid_type", DeferredType()) + sym = DataSymbol("grid_var", grid_type) + ref = StructureReference.create(sym, [("data", [_ONE.copy()])]) + ubnd = ref.member.get_ubound_expression(0) + assert isinstance(ubnd, BinaryOperation) + out = fortran_writer(ubnd).lower() + assert out == "ubound(grid_var%data, 1)" + usym = DataSymbol("uvar", DeferredType()) + ref = ArrayOfStructuresReference.create( + usym, [_ONE.copy()], + [("map", [_ONE.copy(), _TWO.copy()]), + ("data", [_ONE.copy()])]) + ubnd = ref.member.member.get_ubound_expression(0) + assert isinstance(ubnd, BinaryOperation) + out = fortran_writer(ubnd).lower() + assert out == "ubound(uvar(1)%map(1,2)%data, 1)" + # Second, test when we do have type information. + a2d = ArrayType(REAL_TYPE, [2, (2, 8)]) + # Structure that contains "map" which is a 2D array. + stypedef = StructureType.create( + [("map", a2d, Symbol.Visibility.PUBLIC)]) + stypedefsym = DataTypeSymbol("map_type", stypedef) + # Structure containing a structure of stypedef and an array of such + # structures. + stypedef2 = StructureType.create( + [("grid", stypedef, Symbol.Visibility.PUBLIC), + ("subgrids", ArrayType(stypedefsym, [3, (2, 6)]), + Symbol.Visibility.PUBLIC)]) + ssym = DataSymbol("var", stypedef2) + sref = StructureReference.create(ssym, + ["grid", + ("map", [_TWO.copy(), _TWO.copy()])]) + assert sref.member.member.get_ubound_expression(0).value == "2" + assert sref.member.member.get_ubound_expression(1).value == "8" sref2 = StructureReference.create( - ssym, [("subgrids", [two.copy(), two.copy()]), - ("map", [two.copy(), two.copy()])]) - assert sref2.member.get_lbound_expression(1) == two - assert sref2.member.member.get_lbound_expression(1) == two + ssym, [("subgrids", [_TWO.copy(), _TWO.copy()]), + ("map", [_TWO.copy(), _TWO.copy()])]) + assert sref2.member.get_ubound_expression(1).value == "6" + assert sref2.member.member.get_ubound_expression(1).value == "8" # _get_effective_shape From e6386bc33c29450eb416ce01762e549c6b11cc37 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Fri, 18 Aug 2023 11:18:30 +1000 Subject: [PATCH 31/56] #2258 Removed debug output. --- lib/profiling/tau/tau_psy.f90 | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/profiling/tau/tau_psy.f90 b/lib/profiling/tau/tau_psy.f90 index eb57286ea8..68f9c37ada 100644 --- a/lib/profiling/tau/tau_psy.f90 +++ b/lib/profiling/tau/tau_psy.f90 @@ -62,7 +62,6 @@ module profile_psy_data_mod subroutine profile_PSyDataInit() implicit none - print *,"profile-psydatainit" call TAU_PROFILE_INIT(); end subroutine profile_PSyDataInit @@ -92,10 +91,8 @@ subroutine PreStart(this, module_name, region_name, num_pre_vars, & if (.not. this%initialised) then call TAU_PROFILE_TIMER(this%profiler, module_name//":"//region_name) this%initialised = .true. - print *,"prestart1", module_name//":"//region_name endif call TAU_PROFILE_START(this%profiler) - print *,"prestart0", module_name//":"//region_name end subroutine PreStart From bbf9b8d6b6b10dd8e709a7d2e5cd2bef825b66d0 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Fri, 18 Aug 2023 14:49:35 +1000 Subject: [PATCH 32/56] #2258 Allow to use any compiler for the wrapper, it does not have to be tau_f90.sh. --- lib/profiling/tau/Makefile | 7 ++----- lib/profiling/tau/README.md | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/lib/profiling/tau/Makefile b/lib/profiling/tau/Makefile index 62cbae4996..c9093a73fd 100644 --- a/lib/profiling/tau/Makefile +++ b/lib/profiling/tau/Makefile @@ -34,14 +34,11 @@ # Author J. Henrichs, Bureau of Meteorology # ----------- Default "make" values, can be overwritten by the user ----------- -# Hardcode the ta -F90 = tau_f90.sh -F90FLAGS = -optLinkOnly +F90 ?= gfortran +F90FLAGS ?= # ----------------------------------------------------------------------------- -F90FLAGS += -I$(DRHOOK_INCLUDE) -I$(DRHOOK_MODULES) - PSYDATA_LIB_NAME = tau_psy PSYDATA_LIB = lib$(PSYDATA_LIB_NAME).a diff --git a/lib/profiling/tau/README.md b/lib/profiling/tau/README.md index e6cba33f08..ad56915468 100644 --- a/lib/profiling/tau/README.md +++ b/lib/profiling/tau/README.md @@ -6,11 +6,8 @@ to the TAU API. ## Dependencies -TAU must be installed, and the ``tau_f90.sh`` compiler wrapper must -be available. Since tau can be used with different configurations -based on the setting of ``TAU_MAKEFILE``, it is recommended to make -sure that the same configuration is used to compile the TAU wrapper -and the application later. +TAU must be installed at link time, though not when compiling the +PSyData wrapper. This profiling library uses the [PSyData API]( https://psyclone.readthedocs.io/en/stable/psy_data.html) to interface with @@ -26,10 +23,15 @@ region. ## Compilation -The library is compiled with ``make`` using the provided ``Makefile``. It -uses the ``tau_f90.sh`` compiler wrapper as Fortran compiler, so the -``$F90`` environment variable is ignored here. Additional compiler flags -can be provided by setting ``$F90FLAGS``. +The library is compiled with ``make`` using the provided ``Makefile``. The +environment variables ``$F90`` and ``$F90FLAGS`` can be set to point to the +[Fortran compiler](./../../README.md#compilation) and flags to use. They +default to ``gfortran`` and the empty string. + +The compiler used here should be the same that was used to compile TAU. You +can use ``tau_f90.sh -optVerbose`` to see which compiler will be invoked +by TAU's compiler wrapper. + The compilation process will create the wrapper library ``libtau_psy.a``. @@ -63,7 +65,7 @@ tau_f90.sh -o a.out ... -L /lib/profiling/tau -ltau_psy BSD 3-Clause License -Copyright (c) 2019-2021, Science and Technology Facilities Council. +Copyright (c) 2019-2023, Science and Technology Facilities Council. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -95,5 +97,4 @@ POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------- Authors: J. Henrichs, Bureau of Meteorology, - I. Kavcic, Met Office --> From b27d602b0d77f7c4b2cbfbc9fa04ae10a6936141 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Mon, 21 Aug 2023 10:05:22 +1000 Subject: [PATCH 33/56] #2258 Added initialisation to 0. --- lib/profiling/tau/tau_psy.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/profiling/tau/tau_psy.f90 b/lib/profiling/tau/tau_psy.f90 index 68f9c37ada..8b3e78e526 100644 --- a/lib/profiling/tau/tau_psy.f90 +++ b/lib/profiling/tau/tau_psy.f90 @@ -40,7 +40,7 @@ module profile_psy_data_mod type :: profile_PSyDataType ! The TAU profiling handler - integer, dimension(2) :: profiler + integer, dimension(2) :: profiler = (/0,0/) ! True if this instance of PSyDataType has the name already ! initialised. This way the copy of subroutine name is only From 26ad5007d615cc875a5c42e99c723cbcd50840c1 Mon Sep 17 00:00:00 2001 From: Aidan Chalk <3043914+LonelyCat124@users.noreply.github.com> Date: Mon, 21 Aug 2023 14:16:15 +0100 Subject: [PATCH 34/56] Additional fix for #2286 --- src/psyclone/psyir/nodes/array_mixin.py | 12 ++++++------ src/psyclone/tests/psyir/nodes/array_mixin_test.py | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/psyclone/psyir/nodes/array_mixin.py b/src/psyclone/psyir/nodes/array_mixin.py index a0d0468ac6..b2da9eca8b 100644 --- a/src/psyclone/psyir/nodes/array_mixin.py +++ b/src/psyclone/psyir/nodes/array_mixin.py @@ -201,9 +201,9 @@ def get_lbound_expression(self, pos): # Collect member information. if isinstance(cursor, ArrayMixin): new_indices = [idx.copy() for idx in cursor.indices] - cnames.append((cursor.name, new_indices)) + cnames.append((cursor.name.lower(), new_indices)) else: - cnames.append(cursor.name) + cnames.append(cursor.name.lower()) # Continue to resolve datatype unless we hit an # UnknownType or DeferredType. if isinstance(cursor_type, ArrayType): @@ -212,7 +212,7 @@ def get_lbound_expression(self, pos): cursor_type = cursor_type.datatype if isinstance(cursor_type, (UnknownType, DeferredType)): continue - cursor_type = cursor_type.components[cursor.name].datatype + cursor_type = cursor_type.components[cursor.name.lower()].datatype if (isinstance(cursor_type, ArrayType) and cursor_type.shape[pos] not in [ArrayType.Extent.DEFERRED, @@ -275,9 +275,9 @@ def get_ubound_expression(self, pos): # Collect member information. if isinstance(cursor, ArrayMixin): new_indices = [idx.copy() for idx in cursor.indices] - cnames.append((cursor.name, new_indices)) + cnames.append((cursor.name.lower(), new_indices)) else: - cnames.append(cursor.name) + cnames.append(cursor.name.lower()) # Continue to resolve datatype unless we hit an # UnknownType or DeferredType. if isinstance(cursor_type, ArrayType): @@ -286,7 +286,7 @@ def get_ubound_expression(self, pos): cursor_type = cursor_type.datatype if isinstance(cursor_type, (UnknownType, DeferredType)): continue - cursor_type = cursor_type.components[cursor.name].datatype + cursor_type = cursor_type.components[cursor.name.lower()].datatype if (isinstance(cursor_type, ArrayType) and cursor_type.shape[pos] not in [ArrayType.Extent.DEFERRED, diff --git a/src/psyclone/tests/psyir/nodes/array_mixin_test.py b/src/psyclone/tests/psyir/nodes/array_mixin_test.py index ae95c4103a..69e6747dff 100644 --- a/src/psyclone/tests/psyir/nodes/array_mixin_test.py +++ b/src/psyclone/tests/psyir/nodes/array_mixin_test.py @@ -393,7 +393,7 @@ def test_aref_to_aos_lbound_expression(): ''' sgrid_type = StructureType.create( - [("id", INTEGER_TYPE, Symbol.Visibility.PUBLIC)]) + [("ID", INTEGER_TYPE, Symbol.Visibility.PUBLIC)]) sgrid_type_sym = DataTypeSymbol("subgrid_type", sgrid_type) sym = DataSymbol("subgrids", ArrayType(sgrid_type_sym, [(3, 10)])) lbound = BinaryOperation.create(BinaryOperation.Operator.LBOUND, @@ -412,7 +412,7 @@ def test_aref_to_aos_ubound_expression(): ''' sgrid_type = StructureType.create( - [("id", INTEGER_TYPE, Symbol.Visibility.PUBLIC)]) + [("ID", INTEGER_TYPE, Symbol.Visibility.PUBLIC)]) sgrid_type_sym = DataTypeSymbol("subgrid_type", sgrid_type) sym = DataSymbol("subgrids", ArrayType(sgrid_type_sym, [(3, 10)])) lbound = BinaryOperation.create(BinaryOperation.Operator.LBOUND, @@ -433,7 +433,7 @@ def test_member_get_lbound_expression(fortran_writer): # First, test when we don't have type information. grid_type = DataTypeSymbol("grid_type", DeferredType()) sym = DataSymbol("grid_var", grid_type) - ref = StructureReference.create(sym, [("data", [_ONE.copy()])]) + ref = StructureReference.create(sym, [("DATA", [_ONE.copy()])]) lbnd = ref.member.get_lbound_expression(0) assert isinstance(lbnd, BinaryOperation) out = fortran_writer(lbnd).lower() From b378f592ed5bf8c5e73eb4fa5a442dc164723949 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 23 Aug 2023 10:46:45 +0100 Subject: [PATCH 35/56] #2157 add clear and sort methods to ChildrenList and test --- src/psyclone/psyir/nodes/__init__.py | 7 ++- src/psyclone/psyir/nodes/directive.py | 45 +++++++------- src/psyclone/psyir/nodes/node.py | 35 +++++++---- .../tests/psyir/nodes/acc_clauses_test.py | 60 +++++++++++++++++++ .../tests/psyir/nodes/acc_directives_test.py | 8 ++- .../tests/psyir/nodes/directive_test.py | 9 +-- src/psyclone/tests/psyir/nodes/node_test.py | 22 +++++++ 7 files changed, 147 insertions(+), 39 deletions(-) create mode 100644 src/psyclone/tests/psyir/nodes/acc_clauses_test.py diff --git a/src/psyclone/psyir/nodes/__init__.py b/src/psyclone/psyir/nodes/__init__.py index 9b343ecd6b..f449756669 100644 --- a/src/psyclone/psyir/nodes/__init__.py +++ b/src/psyclone/psyir/nodes/__init__.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2020-2022, Science and Technology Facilities Council. +# Copyright (c) 2020-2023, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -39,6 +39,8 @@ ''' PSyIR nodes package module ''' +from psyclone.psyir.nodes.acc_clauses import (ACCCopyClause, ACCCopyInClause, + ACCCopyOutClause) from psyclone.psyir.nodes.array_reference import ArrayReference from psyclone.psyir.nodes.array_of_structures_reference import ( ArrayOfStructuresReference) @@ -98,6 +100,9 @@ # this package e.g. 'from psyclone.psyir.nodes import Literal' __all__ = [ 'colored', + 'ACCCopyClause', + 'ACCCopyInClause', + 'ACCCopyOutClause', 'ArrayMember', 'ArrayReference', 'ArrayOfStructuresMember', diff --git a/src/psyclone/psyir/nodes/directive.py b/src/psyclone/psyir/nodes/directive.py index 021e61954b..e3b3eae9e5 100644 --- a/src/psyclone/psyir/nodes/directive.py +++ b/src/psyclone/psyir/nodes/directive.py @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2021-2022, Science and Technology Facilities Council. +# Copyright (c) 2021-2023, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -48,10 +48,10 @@ from psyclone.core import Signature, VariablesAccessInfo from psyclone.errors import InternalError from psyclone.f2pygen import CommentGen -from psyclone.psyir.nodes.loop import Loop -from psyclone.psyir.nodes.reference import Reference from psyclone.psyir.nodes.array_of_structures_reference import ( ArrayOfStructuresReference) +from psyclone.psyir.nodes.loop import Loop +from psyclone.psyir.nodes.reference import Reference from psyclone.psyir.nodes.schedule import Schedule from psyclone.psyir.nodes.statement import Statement from psyclone.psyir.nodes.structure_reference import StructureReference @@ -78,20 +78,23 @@ def clauses(self): def create_data_movement_deep_copy_refs(self): ''' - Creates the References required to perform a deep copy of this - Signature in e.g. OpenACC or OpenMP. These References are added to the - returned OrderedDicts in the order in which they must be copied. - - :returns: a 3-tuple containing dicts describing the reads, writes and - readwrites. Each dict contains References indexed by Signatures. - :rtype: Tuple[OrderedDict[ - :py:class:`psyclone.core.Signature`, - :py:class:`psyclone.psyir.nodes.Reference`]] + Creates the References required to perform a deep copy (in e.g. + OpenACC or OpenMP) of all of the quantities accessed in Nodes below + this one in the tree. It distringuishes between those quantities that + are only read, only written or are both read and written. The necessary + References are added to the returned OrderedDicts in the order in which + they must be copied. + + :returns: a 3-tuple containing dicts describing the quantities that + are read-only, write-only and readwrite. Each dict contains + References indexed by Signatures. + :rtype: Tuple[OrderedDict[:py:class:`psyclone.core.Signature`, + :py:class:`psyclone.psyir.nodes.Reference`]] ''' readwrites = OrderedDict() - reads = OrderedDict() - writes = OrderedDict() + read_only = OrderedDict() + write_only = OrderedDict() table = self.scope.symbol_table var_info = VariablesAccessInfo() @@ -112,13 +115,13 @@ def create_data_movement_deep_copy_refs(self): if var_info.is_read(sig): if var_info.is_written(sig): if vinfo.is_written_first(): - access_dict = writes + access_dict = write_only else: access_dict = readwrites else: - access_dict = reads + access_dict = read_only else: - access_dict = writes + access_dict = write_only if not sig.is_structure: # This must be an array. @@ -168,7 +171,7 @@ def create_data_movement_deep_copy_refs(self): members.append(sig[depth]) access_dict[sig[:depth+1]] = base_cls.create( *base_args, members) - return reads, writes, readwrites + return read_only, write_only, readwrites class RegionDirective(Directive): @@ -194,8 +197,10 @@ class RegionDirective(Directive): def __init__(self, ast=None, children=None, parent=None): # A Directive always contains a Schedule - sched = Schedule(children=children, parent=self) - super().__init__(ast, children=[sched], parent=parent) + #sched = Schedule(children=children, parent=self) + #super().__init__(ast, children=[sched], parent=parent) + super().__init__(ast, parent=parent) + self.addchild(Schedule(children=children)) @staticmethod def _validate_child(position, child): diff --git a/src/psyclone/psyir/nodes/node.py b/src/psyclone/psyir/nodes/node.py index 0bf9e39661..642c93f942 100644 --- a/src/psyclone/psyir/nodes/node.py +++ b/src/psyclone/psyir/nodes/node.py @@ -316,6 +316,24 @@ def reverse(self): # properties of any References. self._node_reference.update_signal() + def clear(self): + ''' Wipes the list. ''' + for item in self: + self._del_parent_link(item) + super().clear() + # Signal that the tree has changed. + self._node_reference.update_signal() + + def sort(self, reverse=False, key=None): + '''Override the default sort() implementation as this is not supported + for a ChildrenList. + + :raises NotImplementedError: it makes no sense to sort the Children of + a Node. + ''' + raise NotImplementedError("Sorting the Children of a Node is not " + "supported.") + class Node(): ''' @@ -1527,17 +1545,15 @@ def debug_string(self): def update_signal(self): ''' Called whenever there is a change in the PSyIR tree below this node. - It is responsible for ensuring that this method does not get + It is responsible for ensuring that this method does not get called recursively and then calls the _update_node() method of the current - node. Finally, it propagates the update signal up to the parent node + node (which is the only part that subclasses should specialise). + Finally, it propagates the update signal up to the parent node (if any). ''' - # Ensure that update_signal does not get called recursively. If this - # node is still under construction then it might not have the - # _disable_tree_update attribute. If so, we also skip doing the update. - if (not hasattr(self, "_disable_tree_update") or - self._disable_tree_update): + # Ensure that update_signal does not get called recursively. + if self._disable_tree_update: return # Perform the update, disabling the recursive call of this routine on @@ -1546,9 +1562,8 @@ def update_signal(self): self._update_node() self._disable_tree_update = False - # If we're in the middle of constructing a Node then it's - # possible that it doesn't yet even have the _parent attribute. - if hasattr(self, "_parent") and self._parent: + # Propagate the signal up the tree. + if self._parent: self._parent.update_signal() def _update_node(self): diff --git a/src/psyclone/tests/psyir/nodes/acc_clauses_test.py b/src/psyclone/tests/psyir/nodes/acc_clauses_test.py new file mode 100644 index 0000000000..cafb86937a --- /dev/null +++ b/src/psyclone/tests/psyir/nodes/acc_clauses_test.py @@ -0,0 +1,60 @@ +# ----------------------------------------------------------------------------- +# BSD 3-Clause License +# +# Copyright (c) 2023, Science and Technology Facilities Council. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ----------------------------------------------------------------------------- +# Author: A. R. Porter, STFC Daresbury Lab +# ----------------------------------------------------------------------------- + +''' This module contains the pytest test battery for the various OpenACC + Directive Clause nodes.''' + +import pytest + +from psyclone.psyir.nodes import (ACCCopyClause, ACCCopyInClause, + ACCCopyOutClause, Literal, Reference) +from psyclone.psyir.symbols import DataSymbol, INTEGER_TYPE + + +@pytest.mark.parametrize("cls, string", [(ACCCopyClause, "copy"), + (ACCCopyInClause, "copyin"), + (ACCCopyOutClause, "copyout")]) +def test_acccopyclause(cls, string): + ''' + Test the various ACCCopyXXXX clause nodes. + ''' + clause = cls() + assert clause._children_valid_format == "Reference" + assert clause.clause_string == string + # The only permitted child type is Reference. + assert not clause._validate_child(0, Literal("1", INTEGER_TYPE)) + assert clause._validate_child(0, Reference(DataSymbol("var", + INTEGER_TYPE))) diff --git a/src/psyclone/tests/psyir/nodes/acc_directives_test.py b/src/psyclone/tests/psyir/nodes/acc_directives_test.py index a64cd50cb8..bccc8c23d7 100644 --- a/src/psyclone/tests/psyir/nodes/acc_directives_test.py +++ b/src/psyclone/tests/psyir/nodes/acc_directives_test.py @@ -441,9 +441,13 @@ def test_accupdatedirective_equality(): assert directive1 != directive5 -def test_accdatadirective_clauses(fortran_reader, fortran_writer): +def test_accdatadirective_update_data_movement_clauses(fortran_reader, + fortran_writer): '''Test that the data movement clauses are constructed correctly for the - ACCDataDirective class.''' + ACCDataDirective class and that they are updated appropriately when the + tree beneath them is changed. + + ''' psyir = fortran_reader.psyir_from_source( "program dtype_read\n" "use field_mod, only: fld_type\n" diff --git a/src/psyclone/tests/psyir/nodes/directive_test.py b/src/psyclone/tests/psyir/nodes/directive_test.py index 6f4b6c6f30..eaea1172b2 100644 --- a/src/psyclone/tests/psyir/nodes/directive_test.py +++ b/src/psyclone/tests/psyir/nodes/directive_test.py @@ -162,15 +162,12 @@ def test_create_data_movement_deep_copy_refs(fortran_reader): reads, writes, readwrites = sched[4].create_data_movement_deep_copy_refs() assert not reads and not writes assert isinstance(readwrites[Signature("a")], nodes.Reference) - # Subroutine call - the argument is assumed to be read-write. + # Subroutine call - the arg. is conservatively assumed to be read-write. data_trans.apply(sched[5]) reads, writes, readwrites = sched[5].create_data_movement_deep_copy_refs() assert not writes - # TODO #446 - currently the reference_accesses() method falls through to - # the base implementation and so all arguments to a call are marked as - # having READ access. - if Signature("d") not in readwrites: - pytest.xfail("#446 - Call.reference_accesses() needs implementing") + assert not reads + assert Signature("d") in readwrites def test_regiondirective_children_validation(): diff --git a/src/psyclone/tests/psyir/nodes/node_test.py b/src/psyclone/tests/psyir/nodes/node_test.py index b202e1fc02..386ae0720b 100644 --- a/src/psyclone/tests/psyir/nodes/node_test.py +++ b/src/psyclone/tests/psyir/nodes/node_test.py @@ -1080,6 +1080,25 @@ def test_children_setter(): assert statement2.parent is None +def test_children_clear(): + '''Test that the clear() method works correctly for a ChildrenList.''' + testnode = Schedule() + testnode.addchild(Statement()) + testnode.addchild(Statement()) + assert len(testnode.children) == 2 + testnode.children.clear() + assert len(testnode.children) == 0 + + +def test_children_sort(): + '''Check that the sort() method of ChildrenList has been overridden and + raises an appropriate error.''' + testnode = Schedule() + with pytest.raises(NotImplementedError) as err: + testnode.children.sort() + assert "Sorting the Children of a Node is not supported" in str(err.value) + + def test_children_trigger_update(): '''Test that various modifications of ChildrenList all trigger a tree update. We do this by implementing a sub-class of Schedule that has a @@ -1135,6 +1154,9 @@ def update_signal(self): with pytest.raises(GenerationError) as err: sched.children.reverse() assert "signal called OK" in str(err.value) + with pytest.raises(GenerationError) as err: + sched.children.clear() + assert "signal called OK" in str(err.value) def test_lower_to_language_level(monkeypatch): From 725fdafd7b4149d5a8f884e53993f02d935969b7 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 23 Aug 2023 10:47:09 +0100 Subject: [PATCH 36/56] #2157 update test name --- .../tests/nemo/transformations/openacc/data_directive_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py b/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py index aba7e46c46..ff80cfd4f2 100644 --- a/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py +++ b/src/psyclone/tests/nemo/transformations/openacc/data_directive_test.py @@ -295,7 +295,7 @@ def test_multi_array_derived_type(fortran_reader, fortran_writer): "copyout(sto_tmp)" in gen_code) -def test_multi_array_derived_type_error(fortran_reader, fortran_writer): +def test_multi_array_derived_type_error(fortran_reader): ''' Check that we raise the expected error if the derived-type contains more than one array access and they are both iterated over. From 7c47e987bf5ef2ac1d63a6470eee5faf9b0925b6 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 23 Aug 2023 11:02:52 +0100 Subject: [PATCH 37/56] #2157 improve testing of tree update --- src/psyclone/tests/psyir/nodes/node_test.py | 42 ++++++++++++--------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/psyclone/tests/psyir/nodes/node_test.py b/src/psyclone/tests/psyir/nodes/node_test.py index 386ae0720b..67d53869cb 100644 --- a/src/psyclone/tests/psyir/nodes/node_test.py +++ b/src/psyclone/tests/psyir/nodes/node_test.py @@ -646,7 +646,7 @@ def test_node_ancestor_shared_with(fortran_reader): assert (two_lit.ancestor(BinaryOperation, shared_with=mul_binop, include_self=False) is add_binop) assert (two_lit.ancestor(Node, shared_with=one_lit, - excluding=(BinaryOperation)) is assignment) + excluding=BinaryOperation) is assignment) # Check the inverse of previous statements is the same. assert (three_lit.ancestor(BinaryOperation, shared_with=two_lit) is mul_binop) @@ -655,7 +655,7 @@ def test_node_ancestor_shared_with(fortran_reader): assert (mul_binop.ancestor(BinaryOperation, shared_with=two_lit, include_self=False) is add_binop) assert (one_lit.ancestor(Node, shared_with=two_lit, - excluding=(BinaryOperation)) is assignment) + excluding=BinaryOperation) is assignment) # Check cases where we don't find a valid ancestor assert (two_lit.ancestor(BinaryOperation, shared_with=one_lit, @@ -1102,24 +1102,28 @@ def test_children_sort(): def test_children_trigger_update(): '''Test that various modifications of ChildrenList all trigger a tree update. We do this by implementing a sub-class of Schedule that has a - bespoke signal handler. + bespoke update handler. ''' class TestingSched(Schedule): ''' - Sub-class of Schedule that re-implements update_signal() so that it + Sub-class of Schedule that re-implements _update_node() so that it (configurably) raises a GenerationError when called. ''' def __init__(self, test_enable=True): - # Controls whether or not an exception is raised by update_signal. + # Controls whether or not an exception is raised by _update_node. self._test_enable = test_enable super().__init__() - def update_signal(self): + def _update_node(self): if self._test_enable: - raise GenerationError("signal called OK") - super().update_signal() + # Manually unset this flag here as we're about to break out + # of the updating code which would otherwise leave this flag + # set to True and would mean we couldn't use the same object + # in subsequent tests. + self._disable_tree_update = False + raise GenerationError("update called OK") # Set-up a Schedule with some children with the exception disabled. sched = TestingSched(test_enable=False) @@ -1130,33 +1134,37 @@ def update_signal(self): # Various ways of adding children. with pytest.raises(GenerationError) as err: sched.addchild(Return()) - assert "signal called OK" in str(err.value) + assert "update called OK" in str(err.value) with pytest.raises(GenerationError) as err: sched.children.extend([Return()]) - assert "signal called OK" in str(err.value) + assert "update called OK" in str(err.value) with pytest.raises(GenerationError) as err: sched.children.insert(1, Return()) - assert "signal called OK" in str(err.value) + assert "update called OK" in str(err.value) # Various ways of removing children. with pytest.raises(GenerationError) as err: sched.children.pop() - assert "signal called OK" in str(err.value) + assert "update called OK" in str(err.value) with pytest.raises(GenerationError) as err: del sched.children[1] - assert "signal called OK" in str(err.value) + assert "update called OK" in str(err.value) with pytest.raises(GenerationError) as err: sched.children.remove(sched.children[0]) - assert "signal called OK" in str(err.value) + assert "update called OK" in str(err.value) # Modifying members of the list. with pytest.raises(GenerationError) as err: sched.children[1] = Return() - assert "signal called OK" in str(err.value) + assert "update called OK" in str(err.value) with pytest.raises(GenerationError) as err: sched.children.reverse() - assert "signal called OK" in str(err.value) + assert "update called OK" in str(err.value) with pytest.raises(GenerationError) as err: sched.children.clear() - assert "signal called OK" in str(err.value) + assert "update called OK" in str(err.value) + # Check that disabling the tree update in the sched class means that + # the update method is no longer called. + sched._disable_tree_update = True + sched.children.clear() def test_lower_to_language_level(monkeypatch): From 88f5322d613e0f4b3eb63a47e911f341261691b7 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 23 Aug 2023 11:07:23 +0100 Subject: [PATCH 38/56] #2157 rm commented-out code --- src/psyclone/psyir/nodes/directive.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/psyclone/psyir/nodes/directive.py b/src/psyclone/psyir/nodes/directive.py index e3b3eae9e5..ef775d6cbb 100644 --- a/src/psyclone/psyir/nodes/directive.py +++ b/src/psyclone/psyir/nodes/directive.py @@ -197,8 +197,6 @@ class RegionDirective(Directive): def __init__(self, ast=None, children=None, parent=None): # A Directive always contains a Schedule - #sched = Schedule(children=children, parent=self) - #super().__init__(ast, children=[sched], parent=parent) super().__init__(ast, parent=parent) self.addchild(Schedule(children=children)) From affc901a63c39e248342dae4a75b5e56f5bdbc1f Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Fri, 14 Apr 2023 15:24:23 +1000 Subject: [PATCH 39/56] #2294 Support character types in extraction. --- lib/extract/netcdf/Makefile | 2 +- lib/extract/netcdf/extract_netcdf_base.jinja | 2 + lib/extract/netcdf/lfric/Makefile | 2 +- lib/extract/netcdf/read_kernel_data_mod.f90 | 269 +++++++++++ lib/extract/netcdf/read_kernel_data_mod.jinja | 5 + lib/extract/standalone/Makefile | 2 +- .../standalone/extract_standalone_base.jinja | 4 +- lib/extract/standalone/lfric/Makefile | 2 +- .../standalone/read_kernel_data_mod.f90 | 440 ++++++++++++++++++ .../standalone/read_kernel_data_mod.jinja | 6 + 10 files changed, 729 insertions(+), 5 deletions(-) diff --git a/lib/extract/netcdf/Makefile b/lib/extract/netcdf/Makefile index c40a067827..3baced155c 100644 --- a/lib/extract/netcdf/Makefile +++ b/lib/extract/netcdf/Makefile @@ -53,7 +53,7 @@ F90FLAGS += $$(nf-config --fflags) # The extract library is implemented for int, real and # double scalars and 1- to 4-dimensional arrays -PROCESS_ARGS = -prefix=extract_ -types=int,long,logical,real,double \ +PROCESS_ARGS = -prefix=extract_ -types=char,int,long,logical,real,double \ -dims=1,2,3,4 PROCESS = $$($(PSYDATA_LIB_DIR)/get_python.sh) $(PSYDATA_LIB_DIR)/process.py diff --git a/lib/extract/netcdf/extract_netcdf_base.jinja b/lib/extract/netcdf/extract_netcdf_base.jinja index b79091d69a..2c580d162d 100644 --- a/lib/extract/netcdf/extract_netcdf_base.jinja +++ b/lib/extract/netcdf/extract_netcdf_base.jinja @@ -35,6 +35,7 @@ {% if ALL_TYPES is not defined -%} {% set ALL_TYPES = [ ("Double", "real(kind=real64)", 64), ("Real", "real(kind=real32)", 32), + ("Character", "character(*)", 32), ("Long", "real(kind=int64)", 64), ("Int", "integer(kind=int32)", 32) ] %} {% endif -%} @@ -279,6 +280,7 @@ contains {% set NCDF_TYPE_MAPPING = { "Double": "NF90_DOUBLE", "Real": "NF90_REAL", "Logical":"NF90_INT", + "Char": "NF90_CHAR", "Long": "NF90_INT64", "Int": "NF90_INT"} -%} diff --git a/lib/extract/netcdf/lfric/Makefile b/lib/extract/netcdf/lfric/Makefile index 5c98bade9e..3d889788a5 100644 --- a/lib/extract/netcdf/lfric/Makefile +++ b/lib/extract/netcdf/lfric/Makefile @@ -65,7 +65,7 @@ LFRIC_INCLUDE_FLAGS += $$(nf-config --fflags) PSYDATA_LIB_NAME = _extract PSYDATA_LIB = lib$(PSYDATA_LIB_NAME).a -PROCESS_ARGS = -prefix=extract_ -types=int,logical,real,double \ +PROCESS_ARGS = -prefix=extract_ -types=char,int,logical,real,double \ -dims=1,2,3,4 PROCESS = $$($(PSYDATA_LIB_DIR)/get_python.sh) $(PSYDATA_LIB_DIR)/process.py diff --git a/lib/extract/netcdf/read_kernel_data_mod.f90 b/lib/extract/netcdf/read_kernel_data_mod.f90 index cacc131bf2..c353a2c09f 100644 --- a/lib/extract/netcdf/read_kernel_data_mod.f90 +++ b/lib/extract/netcdf/read_kernel_data_mod.f90 @@ -66,6 +66,11 @@ module read_kernel_data_mod ! The various procedures used procedure :: OpenRead + procedure :: ReadScalarChar + procedure :: ReadArray1dChar + procedure :: ReadArray2dChar + procedure :: ReadArray3dChar + procedure :: ReadArray4dChar procedure :: ReadScalarInt procedure :: ReadArray1dInt procedure :: ReadArray2dInt @@ -96,6 +101,11 @@ module read_kernel_data_mod !! This is not part of the official PSyData API, but is used in !! the drivers created by PSyclone. generic, public :: ReadVariable => & + ReadScalarChar, & + ReadArray1dChar, & + ReadArray2dChar, & + ReadArray3dChar, & + ReadArray4dChar, & ReadScalarInt, & ReadArray1dInt, & ReadArray2dInt, & @@ -177,6 +187,265 @@ subroutine OpenRead(this, module_name, region_name) end subroutine OpenRead + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the value of a scalar character(*) + !! variable from the NetCDF file and returns it to the user. Note that + !! this function is not part of the PSyData API, but it is convenient to + !! have these functions together here. The driver can then be linked with + !! this PSyData library and will be able to read the files. + !! @param[in,out] this The instance of the ReadKernelDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value The read value is stored here. + subroutine ReadScalarChar(this, name, value) + + use netcdf, only : nf90_inq_varid, nf90_get_var + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + character(*), intent(out) :: value + + integer :: retval, varid + + retval = CheckError(nf90_inq_varid(this%ncid, name, varid)) + retval = CheckError(nf90_get_var(this%ncid, varid, value)) + + end subroutine ReadScalarChar + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 1D array of character(*) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray1dChar(this, name, value) + + use netcdf + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + character(*), dimension(:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1 + integer :: ierr + + ! First query the dimensions of the original array from the + ! NetCDF file + retval = CheckError(nf90_inq_dimid(this%ncid, trim(name//"dim%1"), & + dim_id)) + retval = CheckError(nf90_inquire_dimension(this%ncid, dim_id, & + len=dim_size1)) + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1, & + " in ReadArray1dChar." + stop + endif + + retval = CheckError(nf90_inq_varid(this%ncid, name, varid)) + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = "" + retval = CheckError(nf90_get_var(this%ncid, varid, value)) + + end subroutine ReadArray1dChar + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 2D array of character(*) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray2dChar(this, name, value) + + use netcdf + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + character(*), dimension(:,:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1,dim_size2 + integer :: ierr + + ! First query the dimensions of the original array from the + ! NetCDF file + retval = CheckError(nf90_inq_dimid(this%ncid, trim(name//"dim%1"), & + dim_id)) + retval = CheckError(nf90_inquire_dimension(this%ncid, dim_id, & + len=dim_size1)) + retval = CheckError(nf90_inq_dimid(this%ncid, trim(name//"dim%2"), & + dim_id)) + retval = CheckError(nf90_inquire_dimension(this%ncid, dim_id, & + len=dim_size2)) + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1,dim_size2), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1,dim_size2, & + " in ReadArray2dChar." + stop + endif + + retval = CheckError(nf90_inq_varid(this%ncid, name, varid)) + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = "" + retval = CheckError(nf90_get_var(this%ncid, varid, value)) + + end subroutine ReadArray2dChar + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 3D array of character(*) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray3dChar(this, name, value) + + use netcdf + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + character(*), dimension(:,:,:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1,dim_size2,dim_size3 + integer :: ierr + + ! First query the dimensions of the original array from the + ! NetCDF file + retval = CheckError(nf90_inq_dimid(this%ncid, trim(name//"dim%1"), & + dim_id)) + retval = CheckError(nf90_inquire_dimension(this%ncid, dim_id, & + len=dim_size1)) + retval = CheckError(nf90_inq_dimid(this%ncid, trim(name//"dim%2"), & + dim_id)) + retval = CheckError(nf90_inquire_dimension(this%ncid, dim_id, & + len=dim_size2)) + retval = CheckError(nf90_inq_dimid(this%ncid, trim(name//"dim%3"), & + dim_id)) + retval = CheckError(nf90_inquire_dimension(this%ncid, dim_id, & + len=dim_size3)) + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1,dim_size2,dim_size3), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1,dim_size2,dim_size3, & + " in ReadArray3dChar." + stop + endif + + retval = CheckError(nf90_inq_varid(this%ncid, name, varid)) + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = "" + retval = CheckError(nf90_get_var(this%ncid, varid, value)) + + end subroutine ReadArray3dChar + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 4D array of character(*) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray4dChar(this, name, value) + + use netcdf + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + character(*), dimension(:,:,:,:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1,dim_size2,dim_size3,dim_size4 + integer :: ierr + + ! First query the dimensions of the original array from the + ! NetCDF file + retval = CheckError(nf90_inq_dimid(this%ncid, trim(name//"dim%1"), & + dim_id)) + retval = CheckError(nf90_inquire_dimension(this%ncid, dim_id, & + len=dim_size1)) + retval = CheckError(nf90_inq_dimid(this%ncid, trim(name//"dim%2"), & + dim_id)) + retval = CheckError(nf90_inquire_dimension(this%ncid, dim_id, & + len=dim_size2)) + retval = CheckError(nf90_inq_dimid(this%ncid, trim(name//"dim%3"), & + dim_id)) + retval = CheckError(nf90_inquire_dimension(this%ncid, dim_id, & + len=dim_size3)) + retval = CheckError(nf90_inq_dimid(this%ncid, trim(name//"dim%4"), & + dim_id)) + retval = CheckError(nf90_inquire_dimension(this%ncid, dim_id, & + len=dim_size4)) + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1,dim_size2,dim_size3,dim_size4), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1,dim_size2,dim_size3,dim_size4, & + " in ReadArray4dChar." + stop + endif + + retval = CheckError(nf90_inq_varid(this%ncid, name, varid)) + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = "" + retval = CheckError(nf90_get_var(this%ncid, varid, value)) + + end subroutine ReadArray4dChar + + ! ------------------------------------------------------------------------- !> @brief This subroutine reads the value of a scalar integer(kind=int32) !! variable from the NetCDF file and returns it to the user. Note that diff --git a/lib/extract/netcdf/read_kernel_data_mod.jinja b/lib/extract/netcdf/read_kernel_data_mod.jinja index 41aab93a7f..890b5bc3a8 100644 --- a/lib/extract/netcdf/read_kernel_data_mod.jinja +++ b/lib/extract/netcdf/read_kernel_data_mod.jinja @@ -28,6 +28,7 @@ {% if ALL_TYPES is not defined -%} {% set ALL_TYPES = [ ("Double", "real(kind=real64)", 64), ("Real", "real(kind=real32)", 32), + ("Char", "character(*)", 8), ("Logical","integer(kind=real32)",32), ("Int", "integer(kind=int32)", 32) ] %} {% endif -%} @@ -292,7 +293,11 @@ contains ! even though e.g. boundary areas or so might not be set at all. ! The compiler will convert the double precision value to the right ! type (e.g. int or single precision). + {% if name == "Char" %} + value = "" + {% else %} value = 0.0d0 + {% endif %} retval = CheckError(nf90_get_var(this%ncid, varid, value)) {% endif %} diff --git a/lib/extract/standalone/Makefile b/lib/extract/standalone/Makefile index 7ffb68b4e0..7dda790ac5 100644 --- a/lib/extract/standalone/Makefile +++ b/lib/extract/standalone/Makefile @@ -51,7 +51,7 @@ PSYDATA_LIB_DIR ?= ./../.. # The extract library is implemented for int, real and # double scalars and 1- to 4-dimensional arrays -PROCESS_ARGS = -prefix=extract_ -types=int,logical,real,double \ +PROCESS_ARGS = -prefix=extract_ -types=char,int,long,logical,real,double \ -dims=1,2,3,4 PROCESS = $$($(PSYDATA_LIB_DIR)/get_python.sh) $(PSYDATA_LIB_DIR)/process.py diff --git a/lib/extract/standalone/extract_standalone_base.jinja b/lib/extract/standalone/extract_standalone_base.jinja index 7acbf32db9..9318810645 100644 --- a/lib/extract/standalone/extract_standalone_base.jinja +++ b/lib/extract/standalone/extract_standalone_base.jinja @@ -35,6 +35,8 @@ {% if ALL_TYPES is not defined -%} {% set ALL_TYPES = [ ("Double", "real(kind=real64)", 64), ("Real", "real(kind=real32)", 32), + ("Character", "character(*)", 8), + ("Long", "real(kind=int64)", 64), ("Int", "integer(kind=int32)", 32) ] %} {% endif -%} @@ -42,7 +44,7 @@ ! ----------------------------------------------------------------------------- ! BSD 3-Clause License ! -! Copyright (c) 2022, Science and Technology Facilities Council. +! Copyright (c) 2022-2023, Science and Technology Facilities Council. ! All rights reserved. ! ! Redistribution and use in source and binary forms, with or without diff --git a/lib/extract/standalone/lfric/Makefile b/lib/extract/standalone/lfric/Makefile index 4dbcd324c7..fae082a3fb 100644 --- a/lib/extract/standalone/lfric/Makefile +++ b/lib/extract/standalone/lfric/Makefile @@ -61,7 +61,7 @@ include $(LFRIC_PATH)/lfric_include_flags.inc PSYDATA_LIB_NAME = _extract PSYDATA_LIB = lib$(PSYDATA_LIB_NAME).a -PROCESS_ARGS = -prefix=extract_ -types=int,logical,real,double \ +PROCESS_ARGS = -prefix=extract_ -types=char,int,logical,real,double \ -dims=1,2,3,4 PROCESS = $$($(PSYDATA_LIB_DIR)/get_python.sh) $(PSYDATA_LIB_DIR)/process.py diff --git a/lib/extract/standalone/read_kernel_data_mod.f90 b/lib/extract/standalone/read_kernel_data_mod.f90 index 83aeed3b61..69285cce78 100644 --- a/lib/extract/standalone/read_kernel_data_mod.f90 +++ b/lib/extract/standalone/read_kernel_data_mod.f90 @@ -68,11 +68,21 @@ module read_kernel_data_mod ! The various procedures used procedure :: OpenRead + procedure :: ReadScalarChar + procedure :: ReadArray1dChar + procedure :: ReadArray2dChar + procedure :: ReadArray3dChar + procedure :: ReadArray4dChar procedure :: ReadScalarInt procedure :: ReadArray1dInt procedure :: ReadArray2dInt procedure :: ReadArray3dInt procedure :: ReadArray4dInt + procedure :: ReadScalarLong + procedure :: ReadArray1dLong + procedure :: ReadArray2dLong + procedure :: ReadArray3dLong + procedure :: ReadArray4dLong procedure :: ReadScalarLogical procedure :: ReadArray1dLogical procedure :: ReadArray2dLogical @@ -93,11 +103,21 @@ module read_kernel_data_mod !! This is not part of the official PSyData API, but is used in !! the drivers created by PSyclone. generic, public :: ReadVariable => & + ReadScalarChar, & + ReadArray1dChar, & + ReadArray2dChar, & + ReadArray3dChar, & + ReadArray4dChar, & ReadScalarInt, & ReadArray1dInt, & ReadArray2dInt, & ReadArray3dInt, & ReadArray4dInt, & + ReadScalarLong, & + ReadArray1dLong, & + ReadArray2dLong, & + ReadArray3dLong, & + ReadArray4dLong, & ReadScalarLogical, & ReadArray1dLogical, & ReadArray2dLogical, & @@ -143,6 +163,216 @@ subroutine OpenRead(this, module_name, region_name) end subroutine OpenRead + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the value of a scalar character(*) + !! variable from the binary file and returns it to the user. Note that + !! this function is not part of the PSyData API, but it is convenient to + !! have these functions together here. The driver can then be linked with + !! this PSyData library and will be able to read the files. + !! @param[in,out] this The instance of the ReadKernelDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value The read value is stored here. + subroutine ReadScalarChar(this, name, value) + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + character(*), intent(out) :: value + + integer :: retval, varid + + read(this%unit_number) value + + end subroutine ReadScalarChar + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 1D array of character(*) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray1dChar(this, name, value) + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + character(*), dimension(:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1 + integer :: ierr + + ! First read in the sizes: + read(this%unit_number) dim_size1 + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1, & + " in ReadArray1dChar." + stop + endif + + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = "" + read(this%unit_number) value + + end subroutine ReadArray1dChar + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 2D array of character(*) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray2dChar(this, name, value) + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + character(*), dimension(:,:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1,dim_size2 + integer :: ierr + + ! First read in the sizes: + read(this%unit_number) dim_size1 + read(this%unit_number) dim_size2 + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1,dim_size2), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1,dim_size2, & + " in ReadArray2dChar." + stop + endif + + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = "" + read(this%unit_number) value + + end subroutine ReadArray2dChar + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 3D array of character(*) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray3dChar(this, name, value) + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + character(*), dimension(:,:,:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1,dim_size2,dim_size3 + integer :: ierr + + ! First read in the sizes: + read(this%unit_number) dim_size1 + read(this%unit_number) dim_size2 + read(this%unit_number) dim_size3 + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1,dim_size2,dim_size3), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1,dim_size2,dim_size3, & + " in ReadArray3dChar." + stop + endif + + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = "" + read(this%unit_number) value + + end subroutine ReadArray3dChar + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 4D array of character(*) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray4dChar(this, name, value) + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + character(*), dimension(:,:,:,:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1,dim_size2,dim_size3,dim_size4 + integer :: ierr + + ! First read in the sizes: + read(this%unit_number) dim_size1 + read(this%unit_number) dim_size2 + read(this%unit_number) dim_size3 + read(this%unit_number) dim_size4 + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1,dim_size2,dim_size3,dim_size4), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1,dim_size2,dim_size3,dim_size4, & + " in ReadArray4dChar." + stop + endif + + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = "" + read(this%unit_number) value + + end subroutine ReadArray4dChar + + ! ------------------------------------------------------------------------- !> @brief This subroutine reads the value of a scalar integer(kind=int32) !! variable from the binary file and returns it to the user. Note that @@ -353,6 +583,216 @@ subroutine ReadArray4dInt(this, name, value) end subroutine ReadArray4dInt + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the value of a scalar integer(kind=int64) + !! variable from the binary file and returns it to the user. Note that + !! this function is not part of the PSyData API, but it is convenient to + !! have these functions together here. The driver can then be linked with + !! this PSyData library and will be able to read the files. + !! @param[in,out] this The instance of the ReadKernelDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value The read value is stored here. + subroutine ReadScalarLong(this, name, value) + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + integer(kind=int64), intent(out) :: value + + integer :: retval, varid + + read(this%unit_number) value + + end subroutine ReadScalarLong + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 1D array of integer(kind=int64) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray1dLong(this, name, value) + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + integer(kind=int64), dimension(:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1 + integer :: ierr + + ! First read in the sizes: + read(this%unit_number) dim_size1 + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1, & + " in ReadArray1dLong." + stop + endif + + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = 0.0d0 + read(this%unit_number) value + + end subroutine ReadArray1dLong + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 2D array of integer(kind=int64) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray2dLong(this, name, value) + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + integer(kind=int64), dimension(:,:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1,dim_size2 + integer :: ierr + + ! First read in the sizes: + read(this%unit_number) dim_size1 + read(this%unit_number) dim_size2 + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1,dim_size2), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1,dim_size2, & + " in ReadArray2dLong." + stop + endif + + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = 0.0d0 + read(this%unit_number) value + + end subroutine ReadArray2dLong + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 3D array of integer(kind=int64) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray3dLong(this, name, value) + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + integer(kind=int64), dimension(:,:,:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1,dim_size2,dim_size3 + integer :: ierr + + ! First read in the sizes: + read(this%unit_number) dim_size1 + read(this%unit_number) dim_size2 + read(this%unit_number) dim_size3 + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1,dim_size2,dim_size3), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1,dim_size2,dim_size3, & + " in ReadArray3dLong." + stop + endif + + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = 0.0d0 + read(this%unit_number) value + + end subroutine ReadArray3dLong + + + + ! ------------------------------------------------------------------------- + !> @brief This subroutine reads the values of a 4D array of integer(kind=int64) + !! It allocates memory for the allocatable parameter 'value' to store the + !! read values which is then returned to the caller. If the memory for the + !! array cannot be allocated, the application will be stopped. + !! @param[in,out] this The instance of the extract_PsyDataType. + !! @param[in] name The name of the variable (string). + !! @param[out] value An allocatable, unallocated 2d-double precision array + !! which is allocated here and stores the values read. + subroutine ReadArray4dLong(this, name, value) + + implicit none + + class(ReadKernelDataType), intent(inout), target :: this + character(*), intent(in) :: name + integer(kind=int64), dimension(:,:,:,:), allocatable, intent(out) :: value + + integer :: retval, varid + integer :: dim_id + integer :: dim_size1,dim_size2,dim_size3,dim_size4 + integer :: ierr + + ! First read in the sizes: + read(this%unit_number) dim_size1 + read(this%unit_number) dim_size2 + read(this%unit_number) dim_size3 + read(this%unit_number) dim_size4 + + ! Allocate enough space to store the values to be read: + allocate(value(dim_size1,dim_size2,dim_size3,dim_size4), Stat=ierr) + if (ierr /= 0) then + write(stderr,*) "Cannot allocate array for ", name, & + " of size ", dim_size1,dim_size2,dim_size3,dim_size4, & + " in ReadArray4dLong." + stop + endif + + ! Initialise it with 0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. + ! The compiler will convert the double precision value to the right + ! type (e.g. int or single precision). + value = 0.0d0 + read(this%unit_number) value + + end subroutine ReadArray4dLong + + ! ------------------------------------------------------------------------- !> @brief This subroutine reads the value of a scalar Logical(kind=4) !! variable from the binary file and returns it to the user. Note that diff --git a/lib/extract/standalone/read_kernel_data_mod.jinja b/lib/extract/standalone/read_kernel_data_mod.jinja index 1182efe329..53442e3232 100644 --- a/lib/extract/standalone/read_kernel_data_mod.jinja +++ b/lib/extract/standalone/read_kernel_data_mod.jinja @@ -28,6 +28,8 @@ {% if ALL_TYPES is not defined -%} {% set ALL_TYPES = [ ("Double", "real(kind=real64)", 64), ("Real", "real(kind=real32)", 32), + ("Char", "character(*)", 8), + ("Logical","integer(kind=real32)",32), ("Int", "integer(kind=int32)", 32) ] %} {% endif -%} @@ -222,8 +224,12 @@ contains {% if name == "Logical" %} value = .false. {% else %} + {% if name == "Char" %} + value = "" + {% else %} value = 0.0d0 {% endif %} + {% endif %} read(this%unit_number) value end subroutine ReadArray{{dim}}d{{name}} From ad51108834ab59b55b77ddd2d6ff35a6ed3cd923 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Fri, 14 Apr 2023 17:43:08 +1000 Subject: [PATCH 40/56] #2294 Added file missed when updating the extraction libraries. --- lib/process.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/process.py b/lib/process.py index be538728b9..37352cd212 100755 --- a/lib/process.py +++ b/lib/process.py @@ -3,7 +3,7 @@ # ----------------------------------------------------------------------------- # BSD 3-Clause License # -# Copyright (c) 2020-2022, Science and Technology Facilities Council. +# Copyright (c) 2020-2023, Science and Technology Facilities Council. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -46,7 +46,6 @@ used to add a prefix to static functions defined in the template. ''' -from __future__ import print_function import argparse import sys from jinja2 import Environment @@ -105,6 +104,7 @@ TYPE_DATA = {"real": ("Real", "real(kind=real32)", 32), "double": ("Double", "real(kind=real64)", 64), "int": ("Int", "integer(kind=int32)", 32), + "char": ("Char", "character(*)", 8), "logical": ("Logical", "Logical(kind=4)", 4), "long": ("Long", "integer(kind=int64)", 64)} From 1a2e54b6924f3a9ab05340732f72a4ae35ca6551 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 31 Aug 2023 13:14:05 +1000 Subject: [PATCH 41/56] #2258 Fixed documentation issues raised in review. --- doc/user_guide/profiling.rst | 2 +- examples/gocean/eg5/profile/README.md | 8 +++++- lib/profiling/README.md | 35 +++++++++++++++++++++++---- lib/profiling/tau/README.md | 13 ++++++---- 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/doc/user_guide/profiling.rst b/doc/user_guide/profiling.rst index 446aa93d3c..6a0db5f6fd 100644 --- a/doc/user_guide/profiling.rst +++ b/doc/user_guide/profiling.rst @@ -150,7 +150,7 @@ the developer's guide (:ref:`dev_guide:psy_data`). Most libraries in ``lib/profiling`` need to be linked in with the corresponding 3rd party profiling tool, or use a compiler -wrapper provided by the tool which will provided the required additional +wrapper provided by the tool which will provide the required additional compiler parameters. The exceptions are the template and simple_timing libraries, which are stand alone. The profiling example in ``examples/gocean/eg5/profile`` can be used with any of the diff --git a/examples/gocean/eg5/profile/README.md b/examples/gocean/eg5/profile/README.md index 6b2ae14a97..f7dbf650c0 100644 --- a/examples/gocean/eg5/profile/README.md +++ b/examples/gocean/eg5/profile/README.md @@ -16,6 +16,7 @@ profile wrapper libraries: - dl_timer - drhook - lfric +- tau By default (``make`` without an argument) the ``template`` library will be used, which just prints the name of the regions called. @@ -37,6 +38,11 @@ uses the "template" profiling library in ``lib/profiling/template``. More detailed instructions for compiling these libraries are are given in the corresponding subdirectories. +If you are using the TAU profiling library, you need to install +it yourself, and make sure that the ``tau_f90.sh`` compiler wrapper +is in your path. The Makefile will automatically call ``tau_f90.sh``, there +is no need to set ``$F90`` in this case. + If you are using ``dl_timer`` or ``drhook``, you need to compile these libraries yourself first, and modify the ``Makefile`` in this directory to specify the required linking parameters. The ``Makefile`` @@ -97,7 +103,7 @@ library, you should see: BSD 3-Clause License -Copyright (c) 2020-2021, Science and Technology Facilities Council. +Copyright (c) 2020-2023, Science and Technology Facilities Council. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/lib/profiling/README.md b/lib/profiling/README.md index b0959cbadd..88daaf1b88 100644 --- a/lib/profiling/README.md +++ b/lib/profiling/README.md @@ -164,15 +164,40 @@ it should already exist. For example: ||psy_test:invoke_1_update_field:u|| 0.00|| 0.00|| 0.00|| 1|| 44.47|| 0.00|| ``` +### [TAU](./tau) + +This wrapper library uses the [TAU profiling library](https://www.cs.uoregon.edu/research/tau). +Detailed linking instructions are in [``tau/README.md``](./tau/README.md). + +The output is written several files called ``profile.x.y.z``, one for each process and thread. +Simple textual output can be seen by using ``pprof``: + +``` + Reading Profile files in profile.* + + NODE 0;CONTEXT 0;THREAD 0: + --------------------------------------------------------------------------------------- + %Time Exclusive Inclusive #Call #Subrs Inclusive Name + msec total msec usec/call + --------------------------------------------------------------------------------------- + 100.0 0.343 0.375 1 2 375 .TAU application + 8.0 0.03 0.03 1 0 30 invoke_0:r0 + 0.5 0.002 0.002 1 0 2 invoke_1_update_field:r0 + +``` +In general is recommended to first pack the profiling output files into one file using +``paraprof --pack``, and then using ``paraprof`` to visualise the profiling results in the GUI. + + ## Compilation The top level ``Makefile`` can be used to compile the profiling-library interfaces included in PSyclone. The command ``make TARGET`` where ``TARGET`` -is one of ``template``, ``simple_timing``, ``dl_timer``, ``drhook``, ``nvidia`` -or ``lfric_timer`` will only compile the corresponding library interface. +is one of ``template``, ``simple_timing``, ``dl_timer``, ``drhook``, ``nvidia``, +``lfric_timer``, or ``tau``, will only compile the corresponding library interface. -**Note** that compilation currently does not include ``dl_timer``, ``drhook`` -and ``nvidia`` profiling-library interfaces since they require external +**Note** that compilation currently does not include ``dl_timer``, ``drhook``, +``tau``, and ``nvidia`` profiling-library interfaces since they require external libraries to be available. For the same reason, the ``all`` target ```shell @@ -207,7 +232,7 @@ source. BSD 3-Clause License -Copyright (c) 2020-2021, Science and Technology Facilities Council. +Copyright (c) 2020-2023, Science and Technology Facilities Council. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/lib/profiling/tau/README.md b/lib/profiling/tau/README.md index ad56915468..b5dfbbf5ae 100644 --- a/lib/profiling/tau/README.md +++ b/lib/profiling/tau/README.md @@ -6,7 +6,7 @@ to the TAU API. ## Dependencies -TAU must be installed at link time, though not when compiling the +TAU must be available at link time but is not actually required when compiling the PSyData wrapper. This profiling library uses the [PSyData API]( @@ -40,21 +40,24 @@ The compilation process will create the wrapper library ``libtau_psy.a``. In order to use the wrapper with your application, at compile time you must provide the location of the wrapper as an ``include`` path (so that the module file is found). It is not required to use the ``tau_f90.sh`` -compiler wrapper when compiling the application. +compiler wrapper when compiling the application, e.g.: + +```shell +$(F90) -c ... -I /lib/profiling/tau somefile.f90 +``` At link time, you need to link with the wrapper library ``libtau_psy.a``. If you use the ``tau_f90.sh`` compiler wrapper, nothing else is required, otherwise you need to add the required libraries from TAU at link time. ```shell -$(F90) -c ... -I /lib/profiling/tau somefile.f90 tau_f90.sh -o a.out ... -L /lib/profiling/tau -ltau_psy ``` **Note:** - The ```` differs depending on whether the wrapper - library is compiled in a clone of PSyclone repository or in a PSyclone + library is compiled in a clone of the PSyclone repository or in a PSyclone [installation](./../../README.md#installation). @@ -65,7 +68,7 @@ tau_f90.sh -o a.out ... -L /lib/profiling/tau -ltau_psy BSD 3-Clause License -Copyright (c) 2019-2023, Science and Technology Facilities Council. +Copyright (c) 2023, Science and Technology Facilities Council. All rights reserved. Redistribution and use in source and binary forms, with or without From ad36e27c4dfb6ae625268571a133368de7070df9 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 31 Aug 2023 13:16:17 +1000 Subject: [PATCH 42/56] #2258 Support disabling and enabling profiling. --- lib/profiling/tau/tau_psy.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/profiling/tau/tau_psy.f90 b/lib/profiling/tau/tau_psy.f90 index 8b3e78e526..40fa7512f9 100644 --- a/lib/profiling/tau/tau_psy.f90 +++ b/lib/profiling/tau/tau_psy.f90 @@ -123,6 +123,7 @@ end subroutine profile_PSyDataShutdown subroutine profile_PSyDataStart() implicit none + call TAU_ENABLE_INSTRUMENTATION() end subroutine profile_PSyDataStart ! --------------------------------------------------------------------------- @@ -130,6 +131,7 @@ end subroutine profile_PSyDataStart subroutine profile_PSyDataStop() implicit none + call TAU_DISABLE_INSTRUMENTATION() end subroutine profile_PSyDataStop From a8d20a2620566b6cbb09da70f23111682995c2e6 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 31 Aug 2023 13:17:03 +1000 Subject: [PATCH 43/56] #2258 Don't compile tau by default, since tau might not be installed. --- lib/profiling/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/profiling/Makefile b/lib/profiling/Makefile index 49b2112546..e4bc426c58 100644 --- a/lib/profiling/Makefile +++ b/lib/profiling/Makefile @@ -41,9 +41,9 @@ F90 ?= gfortran F90FLAGS ?= -g # ----------------------------------------------------------------------------- -# We don't build dl_timer, drhook and nvidia since they require +# We don't build dl_timer, drhook, tau, and nvidia since they require # external libraries to be available. -ALL_LIBS = template simple_timing lfric_timer tau +ALL_LIBS = template simple_timing lfric_timer .PHONY: default all $(ALL_LIBS) clean allclean From cd1419ecf08705b3bd1b57bdbc294e6b4b3e335a Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 31 Aug 2023 16:09:00 +1000 Subject: [PATCH 44/56] #2258 Fixed typo. --- lib/profiling/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/profiling/README.md b/lib/profiling/README.md index 88daaf1b88..c7c2922fff 100644 --- a/lib/profiling/README.md +++ b/lib/profiling/README.md @@ -169,7 +169,7 @@ it should already exist. For example: This wrapper library uses the [TAU profiling library](https://www.cs.uoregon.edu/research/tau). Detailed linking instructions are in [``tau/README.md``](./tau/README.md). -The output is written several files called ``profile.x.y.z``, one for each process and thread. +The output is written to several files called ``profile.x.y.z``, one for each process and thread. Simple textual output can be seen by using ``pprof``: ``` From a0a8018969366746f687cfc94c7893729b16b049 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 31 Aug 2023 17:20:50 +1000 Subject: [PATCH 45/56] #2258 Updated README. --- lib/profiling/tau/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/profiling/tau/README.md b/lib/profiling/tau/README.md index b5dfbbf5ae..ed7e882123 100644 --- a/lib/profiling/tau/README.md +++ b/lib/profiling/tau/README.md @@ -26,7 +26,9 @@ region. The library is compiled with ``make`` using the provided ``Makefile``. The environment variables ``$F90`` and ``$F90FLAGS`` can be set to point to the [Fortran compiler](./../../README.md#compilation) and flags to use. They -default to ``gfortran`` and the empty string. +default to ``gfortran`` and the empty string. Do not set ``$F90`` to +``tau_f90.sh``, since then the PSydata wrapper would be instrumented as well +and you end up with additional entries in your profiling results. The compiler used here should be the same that was used to compile TAU. You can use ``tau_f90.sh -optVerbose`` to see which compiler will be invoked From 7677f63e111c34eb0be2feacd8473b791e54ba72 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 31 Aug 2023 17:43:31 +1000 Subject: [PATCH 46/56] #2294 Fixed documentation issues raised in review. --- doc/developer_guide/psy_data.rst | 2 ++ lib/extract/netcdf/read_kernel_data_mod.jinja | 7 ++++--- lib/extract/standalone/read_kernel_data_mod.jinja | 12 ++++++++---- lib/process.py | 3 ++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/doc/developer_guide/psy_data.rst b/doc/developer_guide/psy_data.rst index d8a8b43a9c..a02719c6ac 100644 --- a/doc/developer_guide/psy_data.rst +++ b/doc/developer_guide/psy_data.rst @@ -654,6 +654,8 @@ takes the following parameters: 64-bit integer value ``logical``: 32-bit logical value + ``char``: + A default string value Default value is ``real,double,int``. diff --git a/lib/extract/netcdf/read_kernel_data_mod.jinja b/lib/extract/netcdf/read_kernel_data_mod.jinja index 890b5bc3a8..7328c8976f 100644 --- a/lib/extract/netcdf/read_kernel_data_mod.jinja +++ b/lib/extract/netcdf/read_kernel_data_mod.jinja @@ -289,13 +289,14 @@ contains value = tmp == 1 deallocate(tmp) {% else %} + {% if name == "Char" %} + ! Initialise the whole array with "". + value = "" + {% else %} ! Initialise it with 0, so that an array comparison will work ! even though e.g. boundary areas or so might not be set at all. ! The compiler will convert the double precision value to the right ! type (e.g. int or single precision). - {% if name == "Char" %} - value = "" - {% else %} value = 0.0d0 {% endif %} retval = CheckError(nf90_get_var(this%ncid, varid, value)) diff --git a/lib/extract/standalone/read_kernel_data_mod.jinja b/lib/extract/standalone/read_kernel_data_mod.jinja index 53442e3232..390e305329 100644 --- a/lib/extract/standalone/read_kernel_data_mod.jinja +++ b/lib/extract/standalone/read_kernel_data_mod.jinja @@ -217,16 +217,20 @@ contains stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). {% if name == "Logical" %} + ! Initialise it with false, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. value = .false. {% else %} {% if name == "Char" %} + ! Initialise it with "", so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. value = "" {% else %} + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right + ! type (e.g. int or single precision). value = 0.0d0 {% endif %} {% endif %} diff --git a/lib/process.py b/lib/process.py index 37352cd212..fbed6ea70c 100755 --- a/lib/process.py +++ b/lib/process.py @@ -58,7 +58,8 @@ parser.add_argument('template_name', help="Name of the template file to process.") parser.add_argument('-types', help="Comma-separated list of types, " - "e.g. real,int,double (no spaces).", + "e.g. real,int,double,char,logical,long " + "(no spaces).", default="real,int,double") parser.add_argument("-dims", help="Comma-separated list of dimensions, " "e.g. 1,2,4 (no spaces)", From 56979a10c6e7f20ebd7d4885eb163e39176fbf51 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 31 Aug 2023 19:22:47 +1000 Subject: [PATCH 47/56] #2294 Added the pre-processed files. --- lib/extract/netcdf/read_kernel_data_mod.f90 | 20 +-- .../standalone/read_kernel_data_mod.f90 | 128 ++++++++---------- 2 files changed, 60 insertions(+), 88 deletions(-) diff --git a/lib/extract/netcdf/read_kernel_data_mod.f90 b/lib/extract/netcdf/read_kernel_data_mod.f90 index c353a2c09f..aad87ddf86 100644 --- a/lib/extract/netcdf/read_kernel_data_mod.f90 +++ b/lib/extract/netcdf/read_kernel_data_mod.f90 @@ -256,10 +256,7 @@ subroutine ReadArray1dChar(this, name, value) endif retval = CheckError(nf90_inq_varid(this%ncid, name, varid)) - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). + ! Initialise the whole array with "". value = "" retval = CheckError(nf90_get_var(this%ncid, varid, value)) @@ -312,10 +309,7 @@ subroutine ReadArray2dChar(this, name, value) endif retval = CheckError(nf90_inq_varid(this%ncid, name, varid)) - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). + ! Initialise the whole array with "". value = "" retval = CheckError(nf90_get_var(this%ncid, varid, value)) @@ -372,10 +366,7 @@ subroutine ReadArray3dChar(this, name, value) endif retval = CheckError(nf90_inq_varid(this%ncid, name, varid)) - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). + ! Initialise the whole array with "". value = "" retval = CheckError(nf90_get_var(this%ncid, varid, value)) @@ -436,10 +427,7 @@ subroutine ReadArray4dChar(this, name, value) endif retval = CheckError(nf90_inq_varid(this%ncid, name, varid)) - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). + ! Initialise the whole array with "". value = "" retval = CheckError(nf90_get_var(this%ncid, varid, value)) diff --git a/lib/extract/standalone/read_kernel_data_mod.f90 b/lib/extract/standalone/read_kernel_data_mod.f90 index 69285cce78..50cffd3b9f 100644 --- a/lib/extract/standalone/read_kernel_data_mod.f90 +++ b/lib/extract/standalone/read_kernel_data_mod.f90 @@ -222,10 +222,8 @@ subroutine ReadArray1dChar(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work + ! Initialise it with "", so that an array comparison will work ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). value = "" read(this%unit_number) value @@ -268,10 +266,8 @@ subroutine ReadArray2dChar(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work + ! Initialise it with "", so that an array comparison will work ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). value = "" read(this%unit_number) value @@ -315,10 +311,8 @@ subroutine ReadArray3dChar(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work + ! Initialise it with "", so that an array comparison will work ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). value = "" read(this%unit_number) value @@ -363,10 +357,8 @@ subroutine ReadArray4dChar(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work + ! Initialise it with "", so that an array comparison will work ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). value = "" read(this%unit_number) value @@ -432,9 +424,9 @@ subroutine ReadArray1dInt(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -478,9 +470,9 @@ subroutine ReadArray2dInt(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -525,9 +517,9 @@ subroutine ReadArray3dInt(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -573,9 +565,9 @@ subroutine ReadArray4dInt(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -642,9 +634,9 @@ subroutine ReadArray1dLong(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -688,9 +680,9 @@ subroutine ReadArray2dLong(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -735,9 +727,9 @@ subroutine ReadArray3dLong(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -783,9 +775,9 @@ subroutine ReadArray4dLong(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -852,10 +844,8 @@ subroutine ReadArray1dLogical(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work + ! Initialise it with false, so that an array comparison will work ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). value = .false. read(this%unit_number) value @@ -898,10 +888,8 @@ subroutine ReadArray2dLogical(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work + ! Initialise it with false, so that an array comparison will work ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). value = .false. read(this%unit_number) value @@ -945,10 +933,8 @@ subroutine ReadArray3dLogical(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work + ! Initialise it with false, so that an array comparison will work ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). value = .false. read(this%unit_number) value @@ -993,10 +979,8 @@ subroutine ReadArray4dLogical(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work + ! Initialise it with false, so that an array comparison will work ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right - ! type (e.g. int or single precision). value = .false. read(this%unit_number) value @@ -1062,9 +1046,9 @@ subroutine ReadArray1dReal(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -1108,9 +1092,9 @@ subroutine ReadArray2dReal(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -1155,9 +1139,9 @@ subroutine ReadArray3dReal(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -1203,9 +1187,9 @@ subroutine ReadArray4dReal(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -1272,9 +1256,9 @@ subroutine ReadArray1dDouble(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -1318,9 +1302,9 @@ subroutine ReadArray2dDouble(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -1365,9 +1349,9 @@ subroutine ReadArray3dDouble(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value @@ -1413,9 +1397,9 @@ subroutine ReadArray4dDouble(this, name, value) stop endif - ! Initialise it with 0, so that an array comparison will work - ! even though e.g. boundary areas or so might not be set at all. - ! The compiler will convert the double precision value to the right + ! Initialise it with 0.0d0, so that an array comparison will work + ! even though e.g. boundary areas or so might not be set at all. Note + ! that the compiler will convert the double precision value to the right ! type (e.g. int or single precision). value = 0.0d0 read(this%unit_number) value From 4974faec9843f2063a51719acdb39283b227595d Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Thu, 31 Aug 2023 11:58:12 +0100 Subject: [PATCH 48/56] #2295 update changelog and UG --- changelog | 3 +++ psyclone.pdf | Bin 1435325 -> 1435657 bytes 2 files changed, 3 insertions(+) diff --git a/changelog b/changelog index 9dfe20ad2a..85e7c25b5b 100644 --- a/changelog +++ b/changelog @@ -575,6 +575,9 @@ 193) PR #2260 for #2245. Splits LFRicLoopBounds class from dynamo0.3.py. + 194) PR #2295 for #2294. Extends the PSyData extraction library + to support character variables. + release 2.3.1 17th of June 2022 1) PR #1747 for #1720. Adds support for If blocks to PSyAD. diff --git a/psyclone.pdf b/psyclone.pdf index 47b6f30bd77f7d867bf7ac1c7a5ef789c46973e7..868102f765df390ce1683731c54ab745fbcb439b 100644 GIT binary patch delta 103301 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�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 Xe}+5q$U_Q5 z=a<{Qc!(qrK8z3(oNxzcT(wj$@DX58Fc>LP?0vVw`^(%;@1{%ktW zJ-jlpNT#oBkSO~11HKRY<$J055|9p08-YUcQ;@8+N|HlE+i7Sr{sgYzel?)&2UFkf zqdV91T}4~6q{oYd`nk(jcw9G+o%ykgZns&yKdz+L-BbCu5=@xJkEdd&{(?|8V&7vr zY>}6R8JK25M9>eNN*~hTB*?_y;IH!O%$k^N_lF zVccD-iCy2&Kp}8ANK~I{FBLlzc?5U6&nfEa71>2Jgy|EE8WoWc+<+Ot<~@<8GXf9OLlI zfAyyUH|uN0iia4%dHJszY%XGT%+k1<`7?xz+gH(I`QK)89u#p>eBcWZcGDaZO=a&L z{zCOyTsX_dM(f|i_(Xudnybo&Ni)pz&J&x`V$wmyBUa|~vv+e!CADdW=VxEfYK&!O z0&Bk2Qxvq`wrkWBAIlE;P-~H=oR*!V2pLbKGPl{Y!eC>Hgj-3=WyoLDBEw;mt;mxN zYY!wnHzP^z*-{+_6(wyyoce%bEq>gqxgnOQX|alYY}U&l1y2KBrs>PP4NQ6&^Pe^v zAhXb^?jy+%%D*6mDaf_Cd};9WllGBw)HZHNvE~&N6`K4^jKtL`&d9EU^(Rw}nI<2B zPVAYYUc)LN9HS<{Ror@ z75h^|<@=Kj*;xzarlxI&qC%|8dBAzkjL^>=i*6fco#A>SInijPcPQ6CySeDmRh^BS zy?Tj%o<$H=3RNI*ZsrB6<`(=N7gwf6B_CQC*1`lSF69{zb1kvkT8p$;Mu4-&v^>$H zX)Xyy!um^@8U{vhLUOu5xiNh!xBnE;5aJfSP=R*EuOtIT1<{G^r#uPApUo0hw@nS-EVp zm2ir}@kQ4_<{3On_B@nHUuzFKY)E_lOFa%$G-atquO}zGG5CV?);t!RyDl!IxrTwb?n6a8^O$7a+tN!!gAHznDpi;QUf(O*kQD)O`rR zJ27PNbj5|2!Ya+8yolzNVvr2^!~&o3Vk`J@K6qxi3Ztf{!OJxwUB=0|pTq3=xzPiu zk*;R|88jP=VGzk;**Hg}tDSBs2tW={E^UC#^PYE1*I*fm5rYO+ELth9dtKmc0Epyi z@YxirizrSh=|X8*1D;-gYq}D1CP>9=<~|XPhyQClj0aMMCwiZ!3mU7r&Mz||RaDG= zj0=0Go7?vzShpNTsY$2&-p(hk41_Wn5)n+m*d558w-$nh9!b9Djknr7!FG=ndglVa zg2C|SK1L^FF*urJsk2=6^^Fra7L8jub&Kh)Td!GLt}f~QIKzygbQYX#9o7N zaRE<`6o(w3f=fz4PUk^I%Vc9T@15Hq-OPCgjv!L#?k{)OF&h}Ipr*XoDZyBD=T{ZL zfMJ4D()y+>#duhRy?6*i;#lST%6hQJ0Q%gD6nd_nHaffPIIkVQ?1VgNCN%i!|=4p%K|7vP(a3&?DY*WDd?2-U%3nFSHSdm0-aq=8XXbYF`=nNOGacWCMRtJuFhyDA zo!n8yS7+2*Msa}8s-Nqg*U^t?+z24L2r}{p{=@xRKKYdK7C0deF?|}8=bQ)t!vw!* zb$^GHE4v6)9{Ft8P{wQdZhdQ`BdPVvJF;j5OBz=F4g2&1cCmodTYMGX#g8q(g|xEC|y(4+cu>%uq4nweC`Gb%#?V;_Dbs7O^b_& zU|5A^;#j0!Zm#B{AbN)EDWbEKy|Ln=)bnp1mNs%huO?wTQZTntr>wInnz1?)!e6c;}%v!3(RWdR?7`_-o8VrD#I zk@fZuYmXrjm}?PFn8Xzr?!*%W^>o7>x9&HG%{^X+)$UUOdyk)&A!9{INKV@QguB z1EA5$o%uUcO11Eomr>40ED%b%f1HMk%1Q_1$klcEiq&0u^8hS7cAr{mGvB7{cR%!Y z%JTAvlghTzq~zpq6@)kN$2~uUnr>auA!{NR#Fdn3x2pSk1j^NL4z?hqh*t3Dyby{q zk{XwL9otZaQKL8kmI6dmM(+!PSay9+gNY#Wvn{@Q zgeI)7W4iVDyFJA_o612V7gT=vW9E2jx@|)vS_C0|-7H;v;o%%{5%#bg#q>1OuMUNY zsDRrVPTv771sP7xzL_+q5SlFb0b^&ug1)XK9(8Iw)#SL9>F0J(MQY+vf*$ZgKxG4= z#7iJ6ZUCCf@Sq;gGDovB-&qKqc0k}E;#VgNX+!~#!IJY)v5O>T8P(xHD zTID%yQ=FtuthHz}0f`4eyn4n)zKG$9J6{Mww1B{E!Haa;#3Fz>sq$~Ej`P-IaH)${ zK`KGmTdcl#Y(35oYcl&KO-O9CbkMo8b8;4g#8-8GG4b*{FuWllUY=JexIU32k(M6o zA%aIFW<0(7v^C>S8}JF4L9XBFmEMV^)vu*j1cfz6b|cF)paworPQi(1Fj<>2Ur+{% z&VW|{rGaf50TN^EH}xjLQEgxOIM9Rdw_GYEX^la96YDpJy)jY_uW;hhEzALKV0BNS z#FN#Xkr;7#tWBlP7y_|i2n@j;!Vvkbu;c`oKDyh)!8=d6k(UhHvC#;}-mv1&Oy-1) zmgc^_C;9R=YK5Rg2%{hck_^$1#em{eJU|emP#ezsG<_LY3}s~-^_S?bds$`x55Y;= z$)Tq0{vT;Jr{p!YHRj(??Ed#SPeM&SRf+m`5 z0B`}YA+Sl3Tx~OXw`)k`=G8h6uw|}H%hEfv&8uH6IGis@a_ESzAjR>5!;e7+MSyC} zM9{LjeKJA~#p#&<{Xi4eJ%Wvd>^4&^F&WcCTAgA4=5#|yN8>pz>_wuIVs=`O-A86F{p~#VW`-`&sxsELVikt)?PfYQmd@6 zE1`UOg_IX`$R^9=s^iyzCFt-eD%Tuqlg|+so%uN!~;o@pC#og|K-5s@5j&%4zi)rY8Kr zC~&Wpq(O}KxHnl)*k@Z4#XqRb^B?-_RFbhuOuz-p`ck5RE z6Iams-5q`t#6efgKrt4CBE4iUctSgE4h~M~owISmOnPK-Xk{lxXgtAicD+-%@lh;C z=7Vhv6AZ&`o)3!VMM=~b#Yh)*;7Ig&z&zKB<31=5C=_04{f)~au<;Hwbeq(HId%V<$%6{{C$t{+?zjsf*3VfMc}XbwIuKwNUh`XEvC#5 z*epz#KZhPl?y{xQ0f?o8rbQAhH5*i-!T8h1H1lb%d|=Ivf1*LYQUNGD7V|vjgRfjv zyw?7f{;q1`kaUsLZloPjMtJsx_?`^jAMuwLxj=i&)+B}E+}B1RxbpM?~`Q%gg$(l2ylPKQd`iH>4cU^>u~P8nJ@#YiC$(z25xFs5wNI0 z9#HeY(2F=M5L{Q!&;U&2Mo@Dg#|l9CPv#c%i*Ql$B9lpzr|xLuC<>{P#YOWAHC0mO zjVcRe>I%ppBsmIg+^uxmpc0G>X7(28Q=NTjk%LV*qU3+=lbVo{t=U+T$O|~1cH{5B zQ0r=&QWN1oYafIR^T0gV1nT0JJBsURA+Il0cS4(p;+Srs%(WCuL z_95?>qJDUSi4pb;vj!U5L2CHGoowxBj#?O(G!ms<$UU&}g*t8F^(v1cBh+m9fsUph zUE?n07~f}<#{jC*igGP|hlKrGlzG|LE7py#ftxV`w^8eV{Ic8o@wj*!cxlCzbE^yo z29G=kN{tCuhW5a;3}H_0urmRGKTS>t@?vbdd=pQvXWQ39L!%2LeIMNEe9E=+$BF+xwWyE70KZC0c zz9ESH9GITo_9`PUU+gmxMGk?~kI0;z@{!-n8fQS39(Tmo{T6`znJnbQAIeL(yuroC zATHKHfu%ak9a6ywb65e(G9GwmKHf3C`K(FVvTt+k;Lo;>=4r1gt)Vj5f;6e^k- zQDTArK68N$D?L0`7$wpX#y)(J8{$^Ub;I3JP7&N!RW?V3Ng%(>iJI>5GNa$tHOE>& zAbf2Tg1r{07lWY$X{EJ2x6RkZ<&JVFK{OK5`vrCUea;I-WcGeQe-rb|4hYEdVYi_#b5_T0=L=%n-o!%30DT+5z37B6_Jpd+}dAm5w6D)`7l z5dWn=n8=X-!T0-qhdCtZk!k;DX3l~9`9Bv^1(A`V{;RM2PKSg;em4+K$+$35AbL<@9lSz+A1 ze#k#uQl)PsvGL-Jh1EL9cdM!MKd87o@fhc`jABcKfB*IJQ@bh|C+uP=UW>0J7RIP= zYM0j16cMot#r>JZKsT&m;}Od|fpU?GGp2NjOcO~w>C6Kd#3$Bh*|YRXm5v|HAUVaO zyqYq&2-QL>VMZEFsuk6RSGq`;DmB$sM8uO)gR7kDblT zhZWLH+e{lCtxLf-{B_nb^n--@EMb_guqTg#&O!v~g(y8r9F5#%WVCIDCZn^00*6dp z+(2m*f*ctTRVj&H%k{SphonH3BqH>%G;$zxTT}^~7-vXhJVk>ojhO@-JC4Ymqt40s zrf3|_fjR7)wAT_1ez9jaJ7GLi(}T7j4(<$pEEMl=8wtP4xkwyA(KU0}J$5}A?JOwy z5Ac=hdDG?DI0u?kEED)djeD8Fl5HTQL`iT)T(W)ujVO(aP!O2O9}~sVLiSQBA}3LC zF-NsilAn2)B*l5;=f6W$0_zH*RduE!r3_U_w^8hkB&ZCnQ6#}nQXH}U7p(`-kXX>s zQOSdVNzijMDj_{X@=NYo1pZRR8_>sIMj5!eB3f3;WXtURjp zw1c-m#8(XGF`QeZ$O7-@K9MB&n7sPYm|Fh|c(A;wKAjkm(){DeYFC{caoX{^wx++o z<(6XOwf0_GW}C5fv@|B>?%v);9caV_Ia zVEas?tLtkgg!Dbh=DlL`cQOkYpuDX6YcEF-VjL0sPu#%9!$ZgrZ{KH)X7${O<4jos z097>${Rzd zyZmxV8+XV0vG7NkZ{O-eo=srWsJo(1eTVkM*)Q49!prK1fray-1G_Sf@?0*~c>ssD zVS{tSS@b{yJO%?9{ViI&9_IG%4B_*1fR1|o=3#Q=Z~xtnne*+rUd!oZH*vFR$xu0` z0?cg_Re&!ZWqrHrOQGI8t+(EK%nX%IrE_~aefrec!i3DC`JzU;{#1IAErH-kPn7tq zIM-x?D_I;uE-C|T1%1$0MwD%VirDzaThXn9-L^pknB`POPzOF%FQ|AZszT^7;7Hct zkCW<$$BS+0w#U{4qgk^}=j`9D^3wh5L6Myky=VlB-}^OlBelK$l=;Zhy|+Ewfx?xr z)f8Z6RQZ8_N}!2HmLo#iuyQ#RrD7xaesJKCyI*K*0* zu|;|iC7XDn%*SRfiH~l;GToq;0Yf)n=U32Nd_q-_+W6c>lkwA<#i+>-i47)mlOFi^ z0+tV6{a=b963owhppGm&NpNhWn6a6Oem>A4C2lwNFz=2FdYeA8cL%Zy4LL^(D=+Dr zWv;4A3lkOoYbx|u_Ac!0RkrG^GHf}zoD0>(cGZUq#qH&15#<9ZF?R=I0NvIYq5+?k z0C^F`EKk3r(81~3dVGB2FITLZHw9msspWvy0zG2uF0#gn85e!IF7GAOTIvL!G!d}& zGbDcmr_d0b{-&J9Uf-msO<^{#rr5zZ=VNak=T?>dDhj#N1E?C!4j!&38N$trh6GeY zup@~tlSo5fe*o|PqvP@^0OOM69Dw=B!Tr@DI^nSoP8ULMb07$9$H4JPxZK|x+tZ3# z%*2?2p;e`i1x!RMC&fD@4?=Pd_QG_3jdtrt)V(mGH4=StAk;M#gvebv6}fjpd_LQs zt~fN)FP=R!L}lFIw`i(c6=OXQ-XJb9w)NPsA(m_gJa+~~XX35{hy>*!@kn~hD`oAc z1~J^#O(kPRq8Pd8BXj8`mB(hq!sdr;{S-N`0S5Co4oev;D5$@wc9k^F6d<`pju!H2 z%@&!xieq3lN6C2g4=i&0)h-$!&R!hj#X=z_q=m)B4I@_RD;*ky4-Z!RNq_@o@K77V2rzlE zKVnWC?eaHP68NwE;8sNMumj}JS|>5;>PY3x46KAJF;E6)6-K<%~$7aCn-Af zHHbVW$@&b(2K$(BReWI@zgsNVIr$kzaX)gIHm{x~v9>Pv#qLgCd=YevJKx$muF>)Q z+^%#FB*6FZiChq3Il(!UJ%y9oIrhDUNns>(%3n_}c;X+hlL%pg@@S>})bVXH zZq*U2^#;em2E#PC4a3q=wPYqYNhrJEvzoe%lZhhURR!e=V4(sf_%kLO1Q5rJtKkSZwAtLgH$kYD= zA^Wbe!~#xH{0E?BP>$>b`rnrxRUsn*|92y74RSy5fAkTw=Dk{EbYM_s_WvEhW&S^r z5O$7#Be*mv^0L4XfJ=R$?JgadK

    QXC*AieFj-C!D{$;G;>@qf09b$jg@%f%DJ)b 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 H{%%|VgA~B^ From 058cbf42f961299a581fa06a00812e673d59bcad Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 6 Sep 2023 12:51:00 +0100 Subject: [PATCH 49/56] #2157 add section to Dev Guide --- doc/developer_guide/psyir.rst | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/doc/developer_guide/psyir.rst b/doc/developer_guide/psyir.rst index 5a94ee6ace..7e11f88099 100644 --- a/doc/developer_guide/psyir.rst +++ b/doc/developer_guide/psyir.rst @@ -192,7 +192,8 @@ For a full list of methods available in any PSyIR node see the To achieve this, we sub-classed the Python list and redefined all methods that modify the list by calling first the PSyIR provided validation method and subsequently, if valid, calling the associated - list method. + list method and triggering an 'update' signal (see + :ref:`update_signals_label`). .. _nodesinfo-label: @@ -256,6 +257,26 @@ relationship. Methods like ``node.detach()``, ``node.copy()`` and ``node.pop_all_children()`` can be used to move or replicate existing children into different nodes. +.. _update_signals_label: + +Dynamic Tree Updates +==================== + +Certain modifications to a PSyIR tree will require that parent nodes +also be updated. For instance, if nodes are added to or removed from +an OpenACC data region, then the clauses describing the +necessary data movement (to/from the accelerator device) may have to +change. To support such use cases, the PSyIR Node has the +``update_signal`` method which is used to signal that the tree has +been modified. This signal is propagated up the tree (i.e. from parent +to parent). The default handler for this signal, ``Node._update_node``, does +nothing. If a sub-class must take action when the tree below it is +modified then it must override the ``_update_node`` method as appropriate. + +Note that the signalling mechanism is fully contained within the ``Node`` +class and takes care of avoiding recursive updates to the same Node instance. +It should therefore only be necessary for a class to implement the +``_update_node`` handler. Selected Node Descriptions ========================== From c82a7d9d6d1fac9da0df10fe121b94f9e9107bc8 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Wed, 6 Sep 2023 13:00:56 +0100 Subject: [PATCH 50/56] #2157 tidying for review --- src/psyclone/psyir/nodes/__init__.py | 9 ++++++--- src/psyclone/tests/psyir/nodes/node_test.py | 10 ++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/psyclone/psyir/nodes/__init__.py b/src/psyclone/psyir/nodes/__init__.py index f449756669..066b700748 100644 --- a/src/psyclone/psyir/nodes/__init__.py +++ b/src/psyclone/psyir/nodes/__init__.py @@ -100,9 +100,6 @@ # this package e.g. 'from psyclone.psyir.nodes import Literal' __all__ = [ 'colored', - 'ACCCopyClause', - 'ACCCopyInClause', - 'ACCCopyOutClause', 'ArrayMember', 'ArrayReference', 'ArrayOfStructuresMember', @@ -147,6 +144,7 @@ 'Directive', 'RegionDirective', 'StandaloneDirective', + # OpenACC Directive Nodes 'ACCDirective', 'ACCRegionDirective', 'ACCStandaloneDirective', @@ -157,6 +155,11 @@ 'ACCKernelsDirective', 'ACCUpdateDirective', 'ACCRoutineDirective', + # OpenACC Clause Nodes + 'ACCCopyClause', + 'ACCCopyInClause', + 'ACCCopyOutClause', + # OpenMP Directive Nodes 'OMPDirective', 'OMPRegionDirective', 'OMPStandaloneDirective', diff --git a/src/psyclone/tests/psyir/nodes/node_test.py b/src/psyclone/tests/psyir/nodes/node_test.py index 67d53869cb..68de62b384 100644 --- a/src/psyclone/tests/psyir/nodes/node_test.py +++ b/src/psyclone/tests/psyir/nodes/node_test.py @@ -1083,11 +1083,17 @@ def test_children_setter(): def test_children_clear(): '''Test that the clear() method works correctly for a ChildrenList.''' testnode = Schedule() - testnode.addchild(Statement()) - testnode.addchild(Statement()) + stmt1 = Statement() + stmt2 = Statement() + testnode.addchild(stmt1) + testnode.addchild(stmt2) assert len(testnode.children) == 2 + assert stmt1.parent is testnode + assert stmt2.parent is testnode testnode.children.clear() assert len(testnode.children) == 0 + assert stmt1.parent is None + assert stmt2.parent is None def test_children_sort(): From bdb398046c96750b60023efa4f89e2c70cb8c6cc Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 7 Sep 2023 08:44:25 +1000 Subject: [PATCH 51/56] #2258 Addressed issues raised in review. --- lib/profiling/Makefile | 9 +++++---- lib/profiling/README.md | 20 ++++++-------------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/lib/profiling/Makefile b/lib/profiling/Makefile index e4bc426c58..8ca31945a7 100644 --- a/lib/profiling/Makefile +++ b/lib/profiling/Makefile @@ -41,9 +41,9 @@ F90 ?= gfortran F90FLAGS ?= -g # ----------------------------------------------------------------------------- -# We don't build dl_timer, drhook, tau, and nvidia since they require +# We don't build dl_timer, drhook, nvidia, and tau since they require # external libraries to be available. -ALL_LIBS = template simple_timing lfric_timer +ALL_LIBS = lfric_timer simple_timing template .PHONY: default all $(ALL_LIBS) clean allclean @@ -51,8 +51,9 @@ default: all all: $(ALL_LIBS) -# Invoke make in the corresponding subdirectory -$(ALL_LIBS): +# Invoke make in the corresponding subdirectory, and also support +# the wrapper that need additional software to be installed +$(ALL_LIBS) dl_timer drhook nvidia tau: $(MAKE) -C $@ clean: diff --git a/lib/profiling/README.md b/lib/profiling/README.md index c7c2922fff..6b76a9f3d3 100644 --- a/lib/profiling/README.md +++ b/lib/profiling/README.md @@ -6,8 +6,8 @@ https://psyclone.readthedocs.io/en/stable/profiling.html#profiling). All profiling-library interfaces use the the [PSyData API]( https://psyclone.readthedocs.io/en/stable/psy_data.html). The profiling wrappers included in PSyclone are: ``template``, -``simple_timing``, ``dl_timer``, ``drhook``, ``nvidia`` and -``lfric_timer``. the overview is given below (for more information please +``simple_timing``, ``dl_timer``, ``drhook``, ``nvidia``, ``tau`` and +``lfric_timer``. The overview is given below (for more information please refer to the linked individual ``README.md`` documents). ## Profiling Wrappers @@ -194,18 +194,10 @@ In general is recommended to first pack the profiling output files into one file The top level ``Makefile`` can be used to compile the profiling-library interfaces included in PSyclone. The command ``make TARGET`` where ``TARGET`` is one of ``template``, ``simple_timing``, ``dl_timer``, ``drhook``, ``nvidia``, -``lfric_timer``, or ``tau``, will only compile the corresponding library interface. - -**Note** that compilation currently does not include ``dl_timer``, ``drhook``, -``tau``, and ``nvidia`` profiling-library interfaces since they require external -libraries to be available. For the same reason, the ``all`` target - -```shell -make all -``` - -will only compile ``template``, ``simple_timing`` and ``lfric_timer`` -libraries. +``lfric_timer`` or ``tau``, will only compile the corresponding library interface. +The target ``make all``, which is also the default, will compile all libraries +that do not need additional software or libraries to be installed, i.e. +``lfric_timer``, ``simple_timing`` and ``template``. The following ``Makefile`` variables are used and can be overwritten on the command line (e.g. ``F90=mpif90 make``): From 07d55bf2a34707abadcb98dfc789f0cc8a0ae6be Mon Sep 17 00:00:00 2001 From: Sergi Siso Date: Mon, 11 Sep 2023 11:28:06 +0100 Subject: [PATCH 52/56] #2157 Update changelog and replace TODO --- changelog | 7 +++++-- src/psyclone/psyir/nodes/directive.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/changelog b/changelog index 3d96640bc6..ccfdcdcae8 100644 --- a/changelog +++ b/changelog @@ -579,8 +579,11 @@ same as Python keywords when using sympy within PSyclone, e.g. in comparisons between expressions. - 195) PR #2295 for #2294. Extends the PSyData extraction library - to support character variables + 195) PR #2295 for #2294. Extends the PSyData extraction library + to support character variables + + 196) PR #2157 for #1396. Add tree-update mechanism and new ACCClause + nodes for data movement. release 2.3.1 17th of June 2022 diff --git a/src/psyclone/psyir/nodes/directive.py b/src/psyclone/psyir/nodes/directive.py index ef775d6cbb..fead302b59 100644 --- a/src/psyclone/psyir/nodes/directive.py +++ b/src/psyclone/psyir/nodes/directive.py @@ -125,7 +125,7 @@ def create_data_movement_deep_copy_refs(self): if not sig.is_structure: # This must be an array. - # TODO #1396 - in languages such as C++ it will be necessary to + # TODO #2304 - in languages such as C++ it will be necessary to # supply the extent of an array that is being accessed. For now # we only supply a Reference (which is sufficient in Fortran). if sig not in access_dict: From b9bd039a14fb185c975998cb3bb693ede00918a8 Mon Sep 17 00:00:00 2001 From: Aidan Chalk <3043914+LonelyCat124@users.noreply.github.com> Date: Mon, 11 Sep 2023 11:38:13 +0100 Subject: [PATCH 53/56] Updates for review --- src/psyclone/psyir/nodes/array_mixin.py | 118 +++++++----------- .../tests/psyir/nodes/array_mixin_test.py | 110 ++++++++-------- 2 files changed, 93 insertions(+), 135 deletions(-) diff --git a/src/psyclone/psyir/nodes/array_mixin.py b/src/psyclone/psyir/nodes/array_mixin.py index b2da9eca8b..cf5e7b6f98 100644 --- a/src/psyclone/psyir/nodes/array_mixin.py +++ b/src/psyclone/psyir/nodes/array_mixin.py @@ -170,21 +170,24 @@ def is_lower_bound(self, index): ''' return self._is_bound(index, "lower") - def get_lbound_expression(self, pos): + def _get_bound_expression(self, pos, bound): ''' - Lookup the lower bound of this ArrayMixin. If we don't have the - necessary type information then a call to the LBOUND intrinsic is - constructed and returned. + Lookup the upper or lower bound of this ArrayMixin. - :param int pos: the dimension of the array for which to lookup the \ + :param int pos: the dimension of the array for which to lookup the lower bound. + :param str bound: "upper" or "lower" - the bound which to lookup. - :returns: the declared lower bound for the specified dimension of \ - the array accesed or a call to the LBOUND intrinsic if it is \ - unknown. + :returns: the declared bound for the specified dimension of this array + or a call to the {U/L}BOUND intrinsic if it is unknown. :rtype: :py:class:`psyclone.psyir.nodes.Node` + :raises InternalError: if bound is neither upper or lower. ''' + if bound not in ("upper", "lower"): + raise InternalError(f"'bound' argument must be 'lower' or 'upper. " + f"Found '{bound}'.") + # First, walk up to the parent reference and get its type. For a simple # ArrayReference this will just be self. root_ref = self.ancestor(Reference, include_self=True) @@ -192,7 +195,7 @@ def get_lbound_expression(self, pos): # Walk back down the structure, looking up the type information as we # go. We also collect the necessary information for creating a new - # Reference as argument to the LBOUND intrinsic in case the type + # Reference as argument to the {U/L}BOUND intrinsic in case the type # information is not available. cnames = [] cursor = root_ref @@ -217,11 +220,13 @@ def get_lbound_expression(self, pos): if (isinstance(cursor_type, ArrayType) and cursor_type.shape[pos] not in [ArrayType.Extent.DEFERRED, ArrayType.Extent.ATTRIBUTE]): - # We have the full type information and the lower bound is known. - return cursor_type.shape[pos].lower.copy() + # We have the full type information and the bound is known. + if bound == "lower": + return cursor_type.shape[pos].lower.copy() + return cursor_type.shape[pos].upper.copy() # We've either failed to resolve the type or we don't know the extent - # of the array dimension so construct a call to the LBOUND intrinsic. + # of the array dimension so construct a call to the BOUND intrinsic. if cnames: # We have some sort of structure access - remove any indexing # information from the ultimate member of the structure access. @@ -241,82 +246,47 @@ def get_lbound_expression(self, pos): # A simple Reference. ref = Reference(root_ref.symbol) - return BinaryOperation.create(BinaryOperation.Operator.LBOUND, ref, + if bound == "lower": + return BinaryOperation.create(BinaryOperation.Operator.LBOUND, ref, + Literal(str(pos+1), INTEGER_TYPE)) + return BinaryOperation.create(BinaryOperation.Operator.UBOUND, ref, Literal(str(pos+1), INTEGER_TYPE)) - def get_ubound_expression(self, pos): + def get_lbound_expression(self, pos): ''' - Lookup the upper bound of this ArrayMixin. If we don't have the - necessary type information then a call to the UBOUND intrinsic is + Lookup the lower bound of this ArrayMixin. If we don't have the + necessary type information then a call to the LBOUND intrinsic is constructed and returned. - :param int pos: the dimension of the array for which to lookup the \ - upper bound. + :param int pos: the dimension of the array for which to lookup the + lower bound. - :returns: the declared upper bound for the specified dimension of \ - the array accesed or a call to the UBOUND intrinsic if it is \ + :returns: the declared lower bound for the specified dimension of + the array accesed or a call to the LBOUND intrinsic if it is unknown. :rtype: :py:class:`psyclone.psyir.nodes.Node` ''' - # First, walk up to the parent reference and get its type. For a simple - # ArrayReference this will just be self. - root_ref = self.ancestor(Reference, include_self=True) - cursor_type = root_ref.symbol.datatype + # Call the helper function + return self._get_bound_expression(pos, "lower") - # Walk back down the structure, looking up the type information as we - # go. We also collect the necessary information for creating a new - # Reference as argument to the UBOUND intrinsic in case the type - # information is not available. - cnames = [] - cursor = root_ref - while cursor is not self: - cursor = cursor.member - # Collect member information. - if isinstance(cursor, ArrayMixin): - new_indices = [idx.copy() for idx in cursor.indices] - cnames.append((cursor.name.lower(), new_indices)) - else: - cnames.append(cursor.name.lower()) - # Continue to resolve datatype unless we hit an - # UnknownType or DeferredType. - if isinstance(cursor_type, ArrayType): - cursor_type = cursor_type.intrinsic - if isinstance(cursor_type, DataTypeSymbol): - cursor_type = cursor_type.datatype - if isinstance(cursor_type, (UnknownType, DeferredType)): - continue - cursor_type = cursor_type.components[cursor.name.lower()].datatype + def get_ubound_expression(self, pos): + ''' + Lookup the upper bound of this ArrayMixin. If we don't have the + necessary type information then a call to the UBOUND intrinsic is + constructed and returned. - if (isinstance(cursor_type, ArrayType) and - cursor_type.shape[pos] not in [ArrayType.Extent.DEFERRED, - ArrayType.Extent.ATTRIBUTE]): - # We have the full type information and the upper bound is known. - return cursor_type.shape[pos].upper.copy() + :param int pos: the dimension of the array for which to lookup the + upper bound. - # We've either failed to resolve the type or we don't know the extent - # of the array dimension so construct a call to the UBOUND intrinsic. - if cnames: - # We have some sort of structure access - remove any indexing - # information from the ultimate member of the structure access. - if len(cnames[-1]) == 2: - cnames[-1] = cnames[-1][0] - # Have to import here to avoid circular dependencies. - # pylint: disable=import-outside-toplevel - from psyclone.psyir.nodes import (ArrayOfStructuresReference, - StructureReference) - if isinstance(root_ref, ArrayMixin): - new_indices = [idx.copy() for idx in root_ref.indices] - ref = ArrayOfStructuresReference.create( - root_ref.symbol, new_indices, cnames) - else: - ref = StructureReference.create(root_ref.symbol, cnames) - else: - # A simple Reference. - ref = Reference(root_ref.symbol) + :returns: the declared upper bound for the specified dimension of + the array accesed or a call to the UBOUND intrinsic if it is + unknown. + :rtype: :py:class:`psyclone.psyir.nodes.Node` - return BinaryOperation.create(BinaryOperation.Operator.UBOUND, ref, - Literal(str(pos+1), INTEGER_TYPE)) + ''' + # Call the helper function + return self._get_bound_expression(pos, "upper") def is_upper_bound(self, index): '''Returns whether this array access includes the upper bound of diff --git a/src/psyclone/tests/psyir/nodes/array_mixin_test.py b/src/psyclone/tests/psyir/nodes/array_mixin_test.py index 69e6747dff..cb0779b3a2 100644 --- a/src/psyclone/tests/psyir/nodes/array_mixin_test.py +++ b/src/psyclone/tests/psyir/nodes/array_mixin_test.py @@ -283,9 +283,9 @@ def test_is_bound_access(fortran_reader, bounds, access, lower, upper): # the ArrayReference class. -def test_get_lbound_expression(): +def test_get_bound_expression(): ''' - Tests for the get_lbound_expression method on an ArrayReference defined + Tests for the _get_bound_expression method on an ArrayReference defined by an ArrayType. ''' @@ -297,33 +297,28 @@ def test_get_lbound_expression(): [10, (2, 10), (lbnd_ref, 10)])) aref = ArrayReference.create(symbol, [_ONE.copy(), _ONE.copy(), _ONE.copy()]) - assert aref.get_lbound_expression(0) == _ONE - assert aref.get_lbound_expression(1) == _TWO - lb2 = aref.get_lbound_expression(2) + assert aref._get_bound_expression(0, "lower") == _ONE + assert aref._get_bound_expression(1, "lower") == _TWO + lb2 = aref._get_bound_expression(2, "lower") assert isinstance(lb2, Reference) # Returned lower bound should be a *copy* of the original. assert lb2 is not lbnd_ref assert lb2.symbol is lbound with pytest.raises(IndexError): - aref.get_lbound_expression(3) + aref._get_bound_expression(3, "lower") # Symbol is of DeferredType so the result should be an instance of the # LBOUND intrinsic. dtsym = DataSymbol("oops", DeferredType()) dtref = ArrayReference.create(dtsym, [_ONE.copy(), _ONE.copy(), _ONE.copy()]) - lbnd = dtref.get_lbound_expression(1) + lbnd = dtref._get_bound_expression(1, "lower") assert isinstance(lbnd, BinaryOperation) assert lbnd.operator == BinaryOperation.Operator.LBOUND assert lbnd.children[0].symbol is dtsym assert lbnd.children[1] == Literal("2", INTEGER_TYPE) + # Tests for ubound -def test_get_ubound_expression(): - ''' - Tests for the get_ubound_expression method on an ArrayReference defined - by an ArrayType. - - ''' # Symbol is of ArrayType. ubound = DataSymbol("jmin", INTEGER_TYPE, is_constant=True, initial_value=Literal("10", INTEGER_TYPE)) @@ -332,9 +327,9 @@ def test_get_ubound_expression(): [1, (1, 2), (1, ubnd_ref)])) aref = ArrayReference.create(symbol, [_ONE.copy(), _ONE.copy(), _ONE.copy()]) - assert aref.get_ubound_expression(0) == _ONE - assert aref.get_ubound_expression(1) == _TWO - ub2 = aref.get_ubound_expression(2) + assert aref._get_bound_expression(0, "upper") == _ONE + assert aref._get_bound_expression(1, "upper") == _TWO + ub2 = aref._get_bound_expression(2, "upper") assert isinstance(ub2, Reference) # Returned lower bound should be a *copy* of the original. assert ub2 is not ubnd_ref @@ -345,7 +340,7 @@ def test_get_ubound_expression(): dtsym = DataSymbol("oops", DeferredType()) dtref = ArrayReference.create(dtsym, [_ONE.copy(), _ONE.copy(), _ONE.copy()]) - ubnd = dtref.get_ubound_expression(1) + ubnd = dtref._get_bound_expression(1, "upper") assert isinstance(ubnd, BinaryOperation) assert ubnd.operator == BinaryOperation.Operator.UBOUND assert ubnd.children[0].symbol is dtsym @@ -354,41 +349,32 @@ def test_get_ubound_expression(): @pytest.mark.parametrize("extent", [ArrayType.Extent.DEFERRED, ArrayType.Extent.ATTRIBUTE]) -def test_get_lbound_expression_unknown_size(extent): +def test_get_bound_expression_unknown_size(extent): ''' - Test the get_lbound_expression method when we have the definition of the + Test the _get_bound_expression method when we have the definition of the array type but its dimensions are unknown. ''' symbol = DataSymbol("my_symbol", ArrayType(INTEGER_TYPE, [extent, extent])) aref = ArrayReference.create(symbol, [_ONE.copy(), _ONE.copy()]) - lbnd = aref.get_lbound_expression(1) + lbnd = aref._get_bound_expression(1, "lower") assert isinstance(lbnd, BinaryOperation) assert lbnd.operator == BinaryOperation.Operator.LBOUND assert lbnd.children[0].symbol is symbol - -@pytest.mark.parametrize("extent", [ArrayType.Extent.DEFERRED, - ArrayType.Extent.ATTRIBUTE]) -def test_get_ubound_expression_unknown_size(extent): - ''' - Test the get_ubound_expression when we have the definition of the - array type but its dimensions are unknown. - - ''' symbol = DataSymbol("my_symbol", ArrayType(INTEGER_TYPE, [extent, extent])) aref = ArrayReference.create(symbol, [_ONE.copy(), _ONE.copy()]) - ubnd = aref.get_ubound_expression(1) + ubnd = aref._get_bound_expression(1, "upper") assert isinstance(ubnd, BinaryOperation) assert ubnd.operator == BinaryOperation.Operator.UBOUND assert ubnd.children[0].symbol is symbol -def test_aref_to_aos_lbound_expression(): +def test_aref_to_aos_bound_expression(): ''' - Test the get_lbound_expression() method for an ArrayReference to an array + Test the _get_bound_expression() method for an ArrayReference to an array of structures. ''' @@ -401,16 +387,9 @@ def test_aref_to_aos_lbound_expression(): ubound = BinaryOperation.create(BinaryOperation.Operator.UBOUND, Reference(sym), _ONE.copy()) array = ArrayReference.create(sym, [Range.create(lbound, ubound)]) - lbnd = array.get_lbound_expression(0) + lbnd = array._get_bound_expression(0, "lower") assert lbnd.value == "3" - -def test_aref_to_aos_ubound_expression(): - ''' - Test the get_ubound_expression method for an ArrayReference to an array - of structures. - - ''' sgrid_type = StructureType.create( [("ID", INTEGER_TYPE, Symbol.Visibility.PUBLIC)]) sgrid_type_sym = DataTypeSymbol("subgrid_type", sgrid_type) @@ -420,21 +399,28 @@ def test_aref_to_aos_ubound_expression(): ubound = BinaryOperation.create(BinaryOperation.Operator.UBOUND, Reference(sym), _ONE.copy()) array = ArrayReference.create(sym, [Range.create(lbound, ubound)]) - ubnd = array.get_ubound_expression(0) + ubnd = array._get_bound_expression(0, "upper") assert ubnd.value == "10" -def test_member_get_lbound_expression(fortran_writer): +def test_member_get_bound_expression(fortran_writer): ''' - Tests for the get_lbound_expression() method when used with a + Tests for the _get_bound_expression() method when used with a sub-class of Member. ''' # First, test when we don't have type information. grid_type = DataTypeSymbol("grid_type", DeferredType()) sym = DataSymbol("grid_var", grid_type) + # Use upper case to test the upper case is converted to lower case + # correctly. ref = StructureReference.create(sym, [("DATA", [_ONE.copy()])]) - lbnd = ref.member.get_lbound_expression(0) + # Test invalid argument + with pytest.raises(InternalError) as excinfo: + ref.member._get_bound_expression(0, "notvalid") + assert ("'bound' argument must be 'lower' or 'upper. " + "Found 'notvalid'" in str(excinfo.value)) + lbnd = ref.member._get_bound_expression(0, "lower") assert isinstance(lbnd, BinaryOperation) out = fortran_writer(lbnd).lower() assert out == "lbound(grid_var%data, 1)" @@ -443,7 +429,7 @@ def test_member_get_lbound_expression(fortran_writer): usym, [_ONE.copy()], [("map", [_ONE.copy(), _TWO.copy()]), ("data", [_ONE.copy()])]) - lbnd = ref.member.member.get_lbound_expression(0) + lbnd = ref.member.member._get_bound_expression(0, "lower") assert isinstance(lbnd, BinaryOperation) out = fortran_writer(lbnd).lower() assert out == "lbound(uvar(1)%map(1,2)%data, 1)" @@ -463,26 +449,24 @@ def test_member_get_lbound_expression(fortran_writer): sref = StructureReference.create(ssym, ["grid", ("map", [_TWO.copy(), _TWO.copy()])]) - assert sref.member.member.get_lbound_expression(0) == _ONE - assert sref.member.member.get_lbound_expression(1) == _TWO + assert sref.member.member._get_bound_expression(0, "lower") == _ONE + assert sref.member.member._get_bound_expression(1, "lower") == _TWO sref2 = StructureReference.create( ssym, [("subgrids", [_TWO.copy(), _TWO.copy()]), ("map", [_TWO.copy(), _TWO.copy()])]) - assert sref2.member.get_lbound_expression(1) == _TWO - assert sref2.member.member.get_lbound_expression(1) == _TWO + assert sref2.member._get_bound_expression(1, "lower") == _TWO + assert sref2.member.member._get_bound_expression(1, "lower") == _TWO + # Check that get_lbound_expression gives the same result + assert (sref2.member.member._get_bound_expression(1, "lower") == + sref2.member.member.get_lbound_expression(1)) -def test_member_get_ubound_expression(fortran_writer): - ''' - Tests for the get_ubound_expression method when used with a - sub-class of Member. - - ''' + # Tests for upper argument # First, test when we don't have type information. grid_type = DataTypeSymbol("grid_type", DeferredType()) sym = DataSymbol("grid_var", grid_type) ref = StructureReference.create(sym, [("data", [_ONE.copy()])]) - ubnd = ref.member.get_ubound_expression(0) + ubnd = ref.member._get_bound_expression(0, "upper") assert isinstance(ubnd, BinaryOperation) out = fortran_writer(ubnd).lower() assert out == "ubound(grid_var%data, 1)" @@ -491,7 +475,7 @@ def test_member_get_ubound_expression(fortran_writer): usym, [_ONE.copy()], [("map", [_ONE.copy(), _TWO.copy()]), ("data", [_ONE.copy()])]) - ubnd = ref.member.member.get_ubound_expression(0) + ubnd = ref.member.member._get_bound_expression(0, "upper") assert isinstance(ubnd, BinaryOperation) out = fortran_writer(ubnd).lower() assert out == "ubound(uvar(1)%map(1,2)%data, 1)" @@ -511,17 +495,21 @@ def test_member_get_ubound_expression(fortran_writer): sref = StructureReference.create(ssym, ["grid", ("map", [_TWO.copy(), _TWO.copy()])]) - assert sref.member.member.get_ubound_expression(0).value == "2" - assert sref.member.member.get_ubound_expression(1).value == "8" + assert sref.member.member._get_bound_expression(0, "upper").value == "2" + assert sref.member.member._get_bound_expression(1, "upper").value == "8" sref2 = StructureReference.create( ssym, [("subgrids", [_TWO.copy(), _TWO.copy()]), ("map", [_TWO.copy(), _TWO.copy()])]) - assert sref2.member.get_ubound_expression(1).value == "6" - assert sref2.member.member.get_ubound_expression(1).value == "8" + assert sref2.member._get_bound_expression(1, "upper").value == "6" + assert sref2.member.member._get_bound_expression(1, "upper").value == "8" + # Check that get_ubound_expression gives the same result + assert (sref2.member.member._get_bound_expression(1, "upper") == + sref2.member.member.get_ubound_expression(1)) # _get_effective_shape + def test_get_effective_shape(fortran_reader, fortran_writer): '''Tests for the _get_effective_shape() method.''' code = ( From 180be0e8dc27a31c4d64ac8e0326e2e2a08c6576 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Mon, 11 Sep 2023 15:03:19 +0100 Subject: [PATCH 54/56] #2281 update changelog and UG --- changelog | 8 +++++--- psyclone.pdf | Bin 1435657 -> 1443868 bytes 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/changelog b/changelog index ccfdcdcae8..af44cf6797 100644 --- a/changelog +++ b/changelog @@ -578,13 +578,15 @@ 194 PR #2241 for #2215. Adds support for Fortran names being the same as Python keywords when using sympy within PSyclone, e.g. in comparisons between expressions. - - 195) PR #2295 for #2294. Extends the PSyData extraction library - to support character variables + + 195) PR #2295 for #2294. Extends the PSyData extraction library + to support character variables 196) PR #2157 for #1396. Add tree-update mechanism and new ACCClause nodes for data movement. + 197) PR #2281 for #2258. Adds a PSyData wrapper for the TAU profiler. + release 2.3.1 17th of June 2022 1) PR #1747 for #1720. Adds support for If blocks to PSyAD. diff --git a/psyclone.pdf b/psyclone.pdf index 868102f765df390ce1683731c54ab745fbcb439b..60c075a130d28b307deee6fcad93b8575b1a7f51 100644 GIT binary patch delta 226594 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 +qHAjt42 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 Date: Mon, 11 Sep 2023 15:53:20 +0100 Subject: [PATCH 55/56] Condensed tests --- .../tests/psyir/nodes/array_mixin_test.py | 64 +++---------------- 1 file changed, 9 insertions(+), 55 deletions(-) diff --git a/src/psyclone/tests/psyir/nodes/array_mixin_test.py b/src/psyclone/tests/psyir/nodes/array_mixin_test.py index cb0779b3a2..99aa644967 100644 --- a/src/psyclone/tests/psyir/nodes/array_mixin_test.py +++ b/src/psyclone/tests/psyir/nodes/array_mixin_test.py @@ -363,9 +363,6 @@ def test_get_bound_expression_unknown_size(extent): assert lbnd.operator == BinaryOperation.Operator.LBOUND assert lbnd.children[0].symbol is symbol - symbol = DataSymbol("my_symbol", ArrayType(INTEGER_TYPE, - [extent, extent])) - aref = ArrayReference.create(symbol, [_ONE.copy(), _ONE.copy()]) ubnd = aref._get_bound_expression(1, "upper") assert isinstance(ubnd, BinaryOperation) assert ubnd.operator == BinaryOperation.Operator.UBOUND @@ -389,16 +386,6 @@ def test_aref_to_aos_bound_expression(): array = ArrayReference.create(sym, [Range.create(lbound, ubound)]) lbnd = array._get_bound_expression(0, "lower") assert lbnd.value == "3" - - sgrid_type = StructureType.create( - [("ID", INTEGER_TYPE, Symbol.Visibility.PUBLIC)]) - sgrid_type_sym = DataTypeSymbol("subgrid_type", sgrid_type) - sym = DataSymbol("subgrids", ArrayType(sgrid_type_sym, [(3, 10)])) - lbound = BinaryOperation.create(BinaryOperation.Operator.LBOUND, - Reference(sym), _ONE.copy()) - ubound = BinaryOperation.create(BinaryOperation.Operator.UBOUND, - Reference(sym), _ONE.copy()) - array = ArrayReference.create(sym, [Range.create(lbound, ubound)]) ubnd = array._get_bound_expression(0, "upper") assert ubnd.value == "10" @@ -433,52 +420,11 @@ def test_member_get_bound_expression(fortran_writer): assert isinstance(lbnd, BinaryOperation) out = fortran_writer(lbnd).lower() assert out == "lbound(uvar(1)%map(1,2)%data, 1)" - # Second, test when we do have type information. - a2d = ArrayType(REAL_TYPE, [2, (2, 8)]) - # Structure that contains "map" which is a 2D array. - stypedef = StructureType.create( - [("map", a2d, Symbol.Visibility.PUBLIC)]) - stypedefsym = DataTypeSymbol("map_type", stypedef) - # Structure containing a structure of stypedef and an array of such - # structures. - stypedef2 = StructureType.create( - [("grid", stypedef, Symbol.Visibility.PUBLIC), - ("subgrids", ArrayType(stypedefsym, [3, (2, 6)]), - Symbol.Visibility.PUBLIC)]) - ssym = DataSymbol("var", stypedef2) - sref = StructureReference.create(ssym, - ["grid", - ("map", [_TWO.copy(), _TWO.copy()])]) - assert sref.member.member._get_bound_expression(0, "lower") == _ONE - assert sref.member.member._get_bound_expression(1, "lower") == _TWO - sref2 = StructureReference.create( - ssym, [("subgrids", [_TWO.copy(), _TWO.copy()]), - ("map", [_TWO.copy(), _TWO.copy()])]) - assert sref2.member._get_bound_expression(1, "lower") == _TWO - assert sref2.member.member._get_bound_expression(1, "lower") == _TWO - # Check that get_lbound_expression gives the same result - assert (sref2.member.member._get_bound_expression(1, "lower") == - sref2.member.member.get_lbound_expression(1)) - - # Tests for upper argument - # First, test when we don't have type information. - grid_type = DataTypeSymbol("grid_type", DeferredType()) - sym = DataSymbol("grid_var", grid_type) - ref = StructureReference.create(sym, [("data", [_ONE.copy()])]) ubnd = ref.member._get_bound_expression(0, "upper") assert isinstance(ubnd, BinaryOperation) out = fortran_writer(ubnd).lower() - assert out == "ubound(grid_var%data, 1)" - usym = DataSymbol("uvar", DeferredType()) - ref = ArrayOfStructuresReference.create( - usym, [_ONE.copy()], - [("map", [_ONE.copy(), _TWO.copy()]), - ("data", [_ONE.copy()])]) - ubnd = ref.member.member._get_bound_expression(0, "upper") - assert isinstance(ubnd, BinaryOperation) - out = fortran_writer(ubnd).lower() - assert out == "ubound(uvar(1)%map(1,2)%data, 1)" + assert out == "ubound(uvar(1)%map, 1)" # Second, test when we do have type information. a2d = ArrayType(REAL_TYPE, [2, (2, 8)]) # Structure that contains "map" which is a 2D array. @@ -495,14 +441,22 @@ def test_member_get_bound_expression(fortran_writer): sref = StructureReference.create(ssym, ["grid", ("map", [_TWO.copy(), _TWO.copy()])]) + assert sref.member.member._get_bound_expression(0, "lower") == _ONE + assert sref.member.member._get_bound_expression(1, "lower") == _TWO assert sref.member.member._get_bound_expression(0, "upper").value == "2" assert sref.member.member._get_bound_expression(1, "upper").value == "8" sref2 = StructureReference.create( ssym, [("subgrids", [_TWO.copy(), _TWO.copy()]), ("map", [_TWO.copy(), _TWO.copy()])]) + assert sref2.member._get_bound_expression(1, "lower") == _TWO + assert sref2.member.member._get_bound_expression(1, "lower") == _TWO + assert sref2.member._get_bound_expression(1, "upper").value == "6" assert sref2.member.member._get_bound_expression(1, "upper").value == "8" + # Check that get_lbound_expression gives the same result + assert (sref2.member.member._get_bound_expression(1, "lower") == + sref2.member.member.get_lbound_expression(1)) # Check that get_ubound_expression gives the same result assert (sref2.member.member._get_bound_expression(1, "upper") == sref2.member.member.get_ubound_expression(1)) From 5a770787b0fd74656aa9cba2057d55d939565770 Mon Sep 17 00:00:00 2001 From: Andrew Porter Date: Mon, 11 Sep 2023 16:18:27 +0100 Subject: [PATCH 56/56] #2283 update changelog and UG --- changelog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changelog b/changelog index af44cf6797..667e2962f6 100644 --- a/changelog +++ b/changelog @@ -587,6 +587,9 @@ 197) PR #2281 for #2258. Adds a PSyData wrapper for the TAU profiler. + 198) PR #2283 for #2282 and #2286. Adds a get_ubound_expression + method to ArrayMixin (analagous to get_lbound_expression). + release 2.3.1 17th of June 2022 1) PR #1747 for #1720. Adds support for If blocks to PSyAD.