From d6abfd9fb597dbbb0251756855d786c19cb3135d Mon Sep 17 00:00:00 2001 From: Kaushik Kulkarni Date: Tue, 8 Jun 2021 12:16:42 -0500 Subject: [PATCH 1/4] move get_outer_params out of LoopKernel.__init__ --- loopy/kernel/__init__.py | 15 +++------------ loopy/kernel/tools.py | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/loopy/kernel/__init__.py b/loopy/kernel/__init__.py index 9fbeaae90..7d191b113 100644 --- a/loopy/kernel/__init__.py +++ b/loopy/kernel/__init__.py @@ -785,18 +785,9 @@ def all_params(self): from loopy.tools import intern_frozenset_of_ids return intern_frozenset_of_ids(result) - def outer_params(self, domains=None): - if domains is None: - domains = self.domains - - all_inames = set() - all_params = set() - for dom in domains: - all_inames.update(dom.get_var_names(dim_type.set)) - all_params.update(dom.get_var_names(dim_type.param)) - - from loopy.tools import intern_frozenset_of_ids - return intern_frozenset_of_ids(all_params-all_inames) + def outer_params(self): + from loopy.kernel.tools import get_outer_params + return get_outer_params(self.domains) @memoize_method def all_insn_inames(self): diff --git a/loopy/kernel/tools.py b/loopy/kernel/tools.py index 7724bb005..e2c0432d4 100644 --- a/loopy/kernel/tools.py +++ b/loopy/kernel/tools.py @@ -2049,4 +2049,25 @@ def get_call_graph(t_unit, only_kernel_callables=False): # }}} + +# {{{ get_outer_params + +def get_outer_params(domains): + """ + Returns names of dims that appear only as params in *domains*. + + :arg domains: An instance of :class:`list` of :class:`isl.BasicSet`. + """ + all_inames = set() + all_params = set() + for dom in domains: + all_inames.update(dom.get_var_names(dim_type.set)) + all_params.update(dom.get_var_names(dim_type.param)) + + from loopy.tools import intern_frozenset_of_ids + return intern_frozenset_of_ids(all_params-all_inames) + +# }}} + + # vim: foldmethod=marker From 0463041bdd0775ed10ef1b2ef07c93e9d5d836fc Mon Sep 17 00:00:00 2001 From: Kaushik Kulkarni Date: Tue, 8 Jun 2021 12:19:01 -0500 Subject: [PATCH 2/4] make LoopKernel.__init__ leaner - move domain checks out of it - trigger domain checks in copy iff it was passed as an input --- loopy/kernel/__init__.py | 58 ++++++++++++++++------------------------ loopy/kernel/creation.py | 33 +++++++++++++++++++++++ 2 files changed, 56 insertions(+), 35 deletions(-) diff --git a/loopy/kernel/__init__.py b/loopy/kernel/__init__.py index 7d191b113..a1e232f5c 100644 --- a/loopy/kernel/__init__.py +++ b/loopy/kernel/__init__.py @@ -318,14 +318,7 @@ def __init__(self, domains, instructions, args=None, "Will be unsupported in 2022.", DeprecationWarning, stacklevel=2) - if inames is None: - if iname_to_tags is None: - iname_to_tags = {} - - inames = {name: Iname(name, iname_to_tags.get(name, frozenset())) - for name in _get_inames_from_domains(domains)} - else: - if iname_to_tags is not None: + if inames is not None: raise LoopyError("Cannot provide both iname_to_tags and inames to " "LoopKernel.__init__") @@ -333,34 +326,16 @@ def __init__(self, domains, instructions, args=None, name: inames.get(name, Iname(name, frozenset())) for name in _get_inames_from_domains(domains)} + assert isinstance(inames, dict) + if index_dtype is None: index_dtype = np.int32 # }}} - # {{{ process assumptions - - if assumptions is None: - dom0_space = domains[0].get_space() - assumptions_space = isl.Space.params_alloc( - dom0_space.get_ctx(), dom0_space.dim(dim_type.param)) - for i in range(dom0_space.dim(dim_type.param)): - assumptions_space = assumptions_space.set_dim_name( - dim_type.param, i, - dom0_space.get_dim_name(dim_type.param, i)) - assumptions = isl.BasicSet.universe(assumptions_space) - - elif isinstance(assumptions, str): - assumptions_set_str = "[%s] -> { : %s}" \ - % (",".join(s for s in self.outer_params(domains)), - assumptions) - assumptions = isl.BasicSet.read_from_str(domains[0].get_ctx(), - assumptions_set_str) - + assert isinstance(assumptions, isl.BasicSet) assert assumptions.is_params() - # }}} - from loopy.types import to_loopy_type index_dtype = to_loopy_type(index_dtype, target=target) if not index_dtype.is_integral(): @@ -390,7 +365,6 @@ def __init__(self, domains, instructions, args=None, DeprecationWarning, stacklevel=2) linearization = schedule - assert all(dom.get_ctx() == isl.DEFAULT_CONTEXT for dom in domains) assert assumptions.get_ctx() == isl.DEFAULT_CONTEXT super().__init__( @@ -1634,8 +1608,21 @@ def copy(self, **kwargs): if "inames" in kwargs: raise LoopyError("Cannot pass both `inames` and `iname_to_tags` to " "LoopKernel.copy") - - kwargs["inames"] = None + iname_to_tags = kwargs["iname_to_tags"] + domains = kwargs.get("domains", self.domains) + kwargs["inames"] = {name: Iname(name, + iname_to_tags.get(name, frozenset())) + for name in _get_inames_from_domains(domains) + } + del kwargs["iname_to_tags"] + + if "domains" in kwargs: + inames = kwargs.get("inames", self.inames) + domains = kwargs["domains"] + kwargs["inames"] = {name: inames.get(name, Iname(name, frozenset())) + for name in _get_inames_from_domains(domains)} + + assert all(dom.get_ctx() == isl.DEFAULT_CONTEXT for dom in domains) if "schedule" in kwargs: if "linearization" in kwargs: @@ -1644,9 +1631,10 @@ def copy(self, **kwargs): kwargs["linearization"] = None - # Avoid carrying over an invalid cache when other parts of the kernel - # are modified. - kwargs["_cached_written_variables"] = None + if "instructions" in kwargs: + # Avoid carrying over an invalid cache when instructions are + # modified. + kwargs["_cached_written_variables"] = None from pytools.tag import normalize_tags, check_tag_uniqueness tags = kwargs.pop("tags", _not_provided) diff --git a/loopy/kernel/creation.py b/loopy/kernel/creation.py index b9cf234c6..b52c5771d 100644 --- a/loopy/kernel/creation.py +++ b/loopy/kernel/creation.py @@ -2224,6 +2224,7 @@ def make_function(domains, instructions, kernel_data=["..."], **kwargs): target = kwargs.pop("target", None) seq_dependencies = kwargs.pop("seq_dependencies", False) fixed_parameters = kwargs.pop("fixed_parameters", {}) + assumptions = kwargs.pop("assumptions", None) if defines: from warnings import warn @@ -2361,6 +2362,36 @@ def make_function(domains, instructions, kernel_data=["..."], **kwargs): domains = parse_domains(domains, defines) + # {{{ process assumptions + + from loopy.kernel.tools import get_outer_params + + if assumptions is None: + dom0_space = domains[0].get_space() + assumptions_space = isl.Space.params_alloc( + dom0_space.get_ctx(), dom0_space.dim(dim_type.param)) + for i in range(dom0_space.dim(dim_type.param)): + assumptions_space = assumptions_space.set_dim_name( + dim_type.param, i, + dom0_space.get_dim_name(dim_type.param, i)) + assumptions = isl.BasicSet.universe(assumptions_space) + elif isinstance(assumptions, str): + assumptions_set_str = "[%s] -> { : %s}" \ + % (",".join(s for s in get_outer_params(domains)), + assumptions) + assumptions = isl.BasicSet.read_from_str(domains[0].get_ctx(), + assumptions_set_str) + else: + if not isinstance(assumptions, isl.BasicSet): + raise LoopyError("assumptions must be either 'str' or BasicSet") + + # }}} + + from loopy.kernel.data import Iname + from loopy.kernel import _get_inames_from_domains + inames = {name: Iname(name, frozenset()) + for name in _get_inames_from_domains(domains)} + arg_guesser = ArgumentGuesser(domains, instructions, temporary_variables, substitutions, default_offset) @@ -2380,6 +2411,8 @@ def make_function(domains, instructions, kernel_data=["..."], **kwargs): options=options, target=target, tags=tags, + inames=inames, + assumptions=assumptions, **kwargs) from loopy.transform.instruction import uniquify_instruction_ids From 41d5d6e9eedff0a20be425a4c6e20ee978e04d83 Mon Sep 17 00:00:00 2001 From: Kaushik Kulkarni Date: Tue, 8 Jun 2021 12:34:01 -0500 Subject: [PATCH 3/4] LoopKernel.get_copy_kwargs() a better place to update 'kwargs' --- loopy/kernel/__init__.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/loopy/kernel/__init__.py b/loopy/kernel/__init__.py index a1e232f5c..4b1279da2 100644 --- a/loopy/kernel/__init__.py +++ b/loopy/kernel/__init__.py @@ -1603,11 +1603,9 @@ def __ne__(self, other): # }}} - def copy(self, **kwargs): + def get_copy_kwargs(self, **kwargs): if "iname_to_tags" in kwargs: - if "inames" in kwargs: - raise LoopyError("Cannot pass both `inames` and `iname_to_tags` to " - "LoopKernel.copy") + assert "inames" not in kwargs iname_to_tags = kwargs["iname_to_tags"] domains = kwargs.get("domains", self.domains) kwargs["inames"] = {name: Iname(name, @@ -1624,6 +1622,19 @@ def copy(self, **kwargs): assert all(dom.get_ctx() == isl.DEFAULT_CONTEXT for dom in domains) + if "instructions" in kwargs: + # Avoid carrying over an invalid cache when instructions are + # modified. + kwargs["_cached_written_variables"] = None + + return super().get_copy_kwargs(**kwargs) + + def copy(self, **kwargs): + if "iname_to_tags" in kwargs: + if "inames" in kwargs: + raise LoopyError("Cannot pass both `inames` and `iname_to_tags` to " + "LoopKernel.copy") + if "schedule" in kwargs: if "linearization" in kwargs: raise LoopyError("Cannot pass both `schedule` and " @@ -1631,11 +1642,6 @@ def copy(self, **kwargs): kwargs["linearization"] = None - if "instructions" in kwargs: - # Avoid carrying over an invalid cache when instructions are - # modified. - kwargs["_cached_written_variables"] = None - from pytools.tag import normalize_tags, check_tag_uniqueness tags = kwargs.pop("tags", _not_provided) if tags is not _not_provided: From 97e569919e612dcd44105f68acce3dc7bc35f6ee Mon Sep 17 00:00:00 2001 From: Kaushik Kulkarni Date: Wed, 9 Jun 2021 23:56:53 -0500 Subject: [PATCH 4/4] get_copy_kwargs: handle iname_to_tags deprecation better --- loopy/kernel/__init__.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/loopy/kernel/__init__.py b/loopy/kernel/__init__.py index 4b1279da2..dd34c2e08 100644 --- a/loopy/kernel/__init__.py +++ b/loopy/kernel/__init__.py @@ -1605,7 +1605,14 @@ def __ne__(self, other): def get_copy_kwargs(self, **kwargs): if "iname_to_tags" in kwargs: - assert "inames" not in kwargs + if "inames" in kwargs: + raise LoopyError("Cannot pass both `inames` and `iname_to_tags` to " + "LoopKernel.get_copy_kwargs") + + warn("Providing iname_to_tags is deprecated, pass inames instead. " + "Will be unsupported in 2022.", + DeprecationWarning, stacklevel=2) + iname_to_tags = kwargs["iname_to_tags"] domains = kwargs.get("domains", self.domains) kwargs["inames"] = {name: Iname(name,