def tag_array_axes(knl, ary_names, dim_tags): """ .. versionchanged:: 2016.2 This function was called :func:`tag_data_axes` before version 2016.2. """ from loopy.kernel.tools import ArrayChanger if isinstance(ary_names, str): ary_names = [ary_name.strip() for ary_name in ary_names.split(",")] for ary_name in ary_names: achng = ArrayChanger(knl, ary_name) ary = achng.get() from loopy.kernel.array import parse_array_dim_tags new_dim_tags = parse_array_dim_tags(dim_tags, n_axes=ary.num_user_axes(), use_increasing_target_axes=ary.max_target_axes > 1, dim_names=ary.dim_names) ary = ary.copy(dim_tags=tuple(new_dim_tags)) knl = achng.with_changed_array(ary) return knl
def make_copy_kernel(new_dim_tags, old_dim_tags=None): """Returns a :class:`LoopKernel` that changes the data layout of a variable (called "input") to the new layout specified by *new_dim_tags* from the one specified by *old_dim_tags*. *old_dim_tags* defaults to an all-C layout of the same rank as the one given by *new_dim_tags*. """ from loopy.kernel.array import (parse_array_dim_tags, SeparateArrayArrayDimTag, VectorArrayDimTag) new_dim_tags = parse_array_dim_tags(new_dim_tags, n_axes=None) rank = len(new_dim_tags) if old_dim_tags is None: old_dim_tags = parse_array_dim_tags( ",".join(rank * ["c"]), n_axes=None) elif isinstance(old_dim_tags, str): old_dim_tags = parse_array_dim_tags( old_dim_tags, n_axes=None) indices = ["i%d" % i for i in range(rank)] shape = ["n%d" % i for i in range(rank)] commad_indices = ", ".join(indices) bounds = " and ".join( f"0<={ind}<{shape_i}" for ind, shape_i in zip(indices, shape)) set_str = "{{[{}]: {}}}".format( commad_indices, bounds ) result = make_kernel(set_str, "output[%s] = input[%s]" % (commad_indices, commad_indices), lang_version=MOST_RECENT_LANGUAGE_VERSION) result = tag_array_axes(result, "input", old_dim_tags) result = tag_array_axes(result, "output", new_dim_tags) unrolled_tags = (SeparateArrayArrayDimTag, VectorArrayDimTag) for i in range(rank): if (isinstance(new_dim_tags[i], unrolled_tags) or isinstance(old_dim_tags[i], unrolled_tags)): result = tag_inames(result, {indices[i]: "unr"}) return result
def make_copy_kernel(new_dim_tags, old_dim_tags=None): """Returns a :class:`LoopKernel` that changes the data layout of a variable (called "input") to the new layout specified by *new_dim_tags* from the one specified by *old_dim_tags*. *old_dim_tags* defaults to an all-C layout of the same rank as the one given by *new_dim_tags*. """ from loopy.kernel.array import (parse_array_dim_tags, SeparateArrayArrayDimTag, VectorArrayDimTag) new_dim_tags = parse_array_dim_tags(new_dim_tags, n_axes=None) rank = len(new_dim_tags) if old_dim_tags is None: old_dim_tags = parse_array_dim_tags( ",".join(rank * ["c"]), n_axes=None) elif isinstance(old_dim_tags, str): old_dim_tags = parse_array_dim_tags( old_dim_tags, n_axes=None) indices = ["i%d" % i for i in range(rank)] shape = ["n%d" % i for i in range(rank)] commad_indices = ", ".join(indices) bounds = " and ".join( "0<=%s<%s" % (ind, shape_i) for ind, shape_i in zip(indices, shape)) set_str = "{[%s]: %s}" % ( commad_indices, bounds ) result = make_kernel(set_str, "output[%s] = input[%s]" % (commad_indices, commad_indices)) result = tag_data_axes(result, "input", old_dim_tags) result = tag_data_axes(result, "output", new_dim_tags) unrolled_tags = (SeparateArrayArrayDimTag, VectorArrayDimTag) for i in range(rank): if (isinstance(new_dim_tags[i], unrolled_tags) or isinstance(old_dim_tags[i], unrolled_tags)): result = tag_inames(result, {indices[i]: "unr"}) return result
def tag_data_axes(knl, ary_names, dim_tags): from loopy.kernel.tools import ArrayChanger if isinstance(ary_names, str): ary_names = ary_names.split(",") for ary_name in ary_names: achng = ArrayChanger(knl, ary_name) ary = achng.get() from loopy.kernel.array import parse_array_dim_tags new_dim_tags = parse_array_dim_tags(dim_tags, n_axes=ary.num_user_axes(), use_increasing_target_axes=ary.max_target_axes > 1) ary = ary.copy(dim_tags=tuple(new_dim_tags)) knl = achng.with_changed_array(ary) return knl
def tag_array_axes(kernel, ary_names, dim_tags): """ :arg dim_tags: a tuple of :class:`loopy.kernel.array.ArrayDimImplementationTag` or a string that parses to one. See :func:`loopy.kernel.array.parse_array_dim_tags` for a description of the allowed string format. For example, *dim_tags* could be ``"N2,N0,N1"`` to determine that the second axis is the fastest-varying, the last is the next-fastest, and the first is the slowest. .. versionchanged:: 2016.2 This function was called ``tag_data_axes`` before version 2016.2. """ from loopy.kernel.tools import ArrayChanger if isinstance(ary_names, str): ary_names = [ary_name.strip() for ary_name in ary_names.split(",")] for ary_name in ary_names: achng = ArrayChanger(kernel, ary_name) ary = achng.get() from loopy.kernel.array import parse_array_dim_tags new_dim_tags = parse_array_dim_tags( dim_tags, n_axes=ary.num_user_axes(), use_increasing_target_axes=ary.max_target_axes > 1, dim_names=ary.dim_names) ary = ary.copy(dim_tags=tuple(new_dim_tags)) kernel = achng.with_changed_array(ary) return kernel