def test_uniquify_instruction_ids(): i1 = lp.Assignment("b", 1, id=None) i2 = lp.Assignment("b", 1, id=None) i3 = lp.Assignment("b", 1, id=lp.UniqueName("b")) i4 = lp.Assignment("b", 1, id=lp.UniqueName("b")) knl = lp.make_kernel("{[i]: i = 1}", []).copy(instructions=[i1, i2, i3, i4]) from loopy.transform.instruction import uniquify_instruction_ids knl = uniquify_instruction_ids(knl) insn_ids = {insn.id for insn in knl.instructions} assert len(insn_ids) == 4 assert all(isinstance(id, str) for id in insn_ids)
def test_uniquify_instruction_ids(): i1 = lp.Assignment("b", 1, id=None) i2 = lp.Assignment("b", 1, id=None) i3 = lp.Assignment("b", 1, id=lp.UniqueName("b")) i4 = lp.Assignment("b", 1, id=lp.UniqueName("b")) prog = lp.make_kernel("{[i]: i = 1}", [], name="lpy_knl") new_root_kernel = prog["lpy_knl"].copy(instructions=[i1, i2, i3, i4]) prog = prog.with_kernel(new_root_kernel) from loopy.transform.instruction import uniquify_instruction_ids prog = uniquify_instruction_ids(prog) insn_ids = {insn.id for insn in prog["lpy_knl"].instructions} assert len(insn_ids) == 4 assert all(isinstance(id, str) for id in insn_ids)
def get_kernel(self): if self.src_expansion is not self.tgt_expansion: raise RuntimeError("%s requires that the source " "and target expansion are the same object" % type(self).__name__) ncoeffs = len(self.src_expansion) # To clarify terminology: # # isrc_box -> The index in a list of (in this case, source) boxes # src_ibox -> The (global) box number for the (in this case, source) box # # (same for itgt_box, tgt_ibox) loopy_insns = [ insn.copy( predicates=insn.predicates | frozenset(["is_src_box_valid"]), id=lp.UniqueName("compute_coeff")) for insn in self.get_translation_loopy_insns()] from sumpy.tools import gather_loopy_arguments loopy_knl = lp.make_kernel( [ "{[itgt_box]: 0<=itgt_box<ntgt_boxes}", "{[isrc_box]: 0<=isrc_box<nchildren}", "{[idim]: 0<=idim<dim}", ], [""" for itgt_box <> tgt_ibox = target_boxes[itgt_box] <> tgt_center[idim] = centers[idim, tgt_ibox] \ for isrc_box <> src_ibox = box_child_ids[isrc_box,tgt_ibox] \ {id=read_src_ibox} <> is_src_box_valid = src_ibox != 0 if is_src_box_valid <> src_center[idim] = centers[idim, src_ibox] {dup=idim} <> d[idim] = tgt_center[idim] - src_center[idim] \ {dup=idim} """] + [""" <> src_coeff{i} = \ src_expansions[src_ibox - src_base_ibox, {i}] \ {{id_prefix=read_coeff,dep=read_src_ibox}} """.format(i=i) for i in range(ncoeffs)] + [ ] + loopy_insns + [""" tgt_expansions[tgt_ibox - tgt_base_ibox, {i}] = \ tgt_expansions[tgt_ibox - tgt_base_ibox, {i}] \ + coeff{i} \ {{id_prefix=write_expn,dep=compute_coeff*, nosync=read_coeff*}} """.format(i=i) for i in range(ncoeffs)] + [""" end end end """], [ lp.GlobalArg("target_boxes", None, shape=lp.auto, offset=lp.auto), lp.GlobalArg("centers", None, shape="dim, aligned_nboxes"), lp.ValueArg("src_rscale,tgt_rscale", None), lp.GlobalArg("box_child_ids", None, shape="nchildren, aligned_nboxes"), lp.GlobalArg("tgt_expansions", None, shape=("ntgt_level_boxes", ncoeffs), offset=lp.auto), lp.GlobalArg("src_expansions", None, shape=("nsrc_level_boxes", ncoeffs), offset=lp.auto), lp.ValueArg("src_base_ibox,tgt_base_ibox", np.int32), lp.ValueArg("ntgt_level_boxes,nsrc_level_boxes", np.int32), lp.ValueArg("aligned_nboxes", np.int32), "..." ] + gather_loopy_arguments([self.src_expansion, self.tgt_expansion]), name=self.name, assumptions="ntgt_boxes>=1", silenced_warnings="write_race(write_expn*)", fixed_parameters=dict(dim=self.dim, nchildren=2**self.dim), lang_version=MOST_RECENT_LANGUAGE_VERSION) for expn in [self.src_expansion, self.tgt_expansion]: loopy_knl = expn.prepare_loopy_kernel(loopy_knl) loopy_knl = lp.tag_inames(loopy_knl, "idim*:unr") return loopy_knl