def get_loopy_insns_and_result_names(self): from sumpy.symbolic import make_sym_vector bvec = make_sym_vector("b", self.dim) import sumpy.symbolic as sp rscale = sp.Symbol("rscale") from sumpy.assignment_collection import SymbolicAssignmentCollection sac = SymbolicAssignmentCollection() coeff_exprs = [ sym.Symbol("coeff%d" % i) for i in range(len(self.expansion.get_coefficient_identifiers())) ] value = self.expansion.evaluate(coeff_exprs, bvec, rscale) result_names = [ sac.assign_unique("result_%d_p" % i, knl.postprocess_at_target(value, bvec)) for i, knl in enumerate(self.kernels) ] sac.run_global_cse() from sumpy.codegen import to_loopy_insns loopy_insns = to_loopy_insns( six.iteritems(sac.assignments), vector_names=set(["b"]), pymbolic_expr_maps=[self.expansion.get_code_transformer()], retain_names=result_names, complex_dtype=np.complex128 # FIXME ) return loopy_insns, result_names
def get_translation_loopy_insns(self): from sumpy.symbolic import make_sym_vector dvec = make_sym_vector("d", self.dim) src_coeff_exprs = [sym.Symbol("src_coeff%d" % i) for i in range(len(self.src_expansion))] src_rscale = sym.Symbol("src_rscale") tgt_rscale = sym.Symbol("tgt_rscale") from sumpy.assignment_collection import SymbolicAssignmentCollection sac = SymbolicAssignmentCollection() tgt_coeff_names = [ sac.assign_unique("coeff%d" % i, coeff_i) for i, coeff_i in enumerate( self.tgt_expansion.translate_from( self.src_expansion, src_coeff_exprs, src_rscale, dvec, tgt_rscale))] sac.run_global_cse() from sumpy.codegen import to_loopy_insns return to_loopy_insns( six.iteritems(sac.assignments), vector_names=set(["d"]), pymbolic_expr_maps=[self.tgt_expansion.get_code_transformer()], retain_names=tgt_coeff_names, complex_dtype=np.complex128 # FIXME )
def get_loopy_insns_and_result_names(self): from sumpy.symbolic import make_sym_vector dvec = make_sym_vector("d", self.dim) from sumpy.assignment_collection import SymbolicAssignmentCollection sac = SymbolicAssignmentCollection() result_names = [ sac.assign_unique( "knl%d" % i, knl.postprocess_at_target( knl.postprocess_at_source(knl.get_expression(dvec), dvec), dvec)) for i, knl in enumerate(self.kernels) ] sac.run_global_cse() from sumpy.codegen import to_loopy_insns loopy_insns = to_loopy_insns( six.iteritems(sac.assignments), vector_names=set(["d"]), pymbolic_expr_maps=[ knl.get_code_transformer() for knl in self.kernels ], retain_names=result_names, complex_dtype=np.complex128 # FIXME ) return loopy_insns, result_names
def get_loopy_insns_and_result_names(self): from sumpy.symbolic import make_sym_vector bvec = make_sym_vector("b", self.dim) import sumpy.symbolic as sp rscale = sp.Symbol("rscale") from sumpy.assignment_collection import SymbolicAssignmentCollection sac = SymbolicAssignmentCollection() coeff_exprs = [sym.Symbol("coeff%d" % i) for i in range(len(self.expansion.get_coefficient_identifiers()))] value = self.expansion.evaluate(coeff_exprs, bvec, rscale) result_names = [ sac.assign_unique("result_%d_p" % i, knl.postprocess_at_target(value, bvec)) for i, knl in enumerate(self.kernels) ] sac.run_global_cse() from sumpy.codegen import to_loopy_insns loopy_insns = to_loopy_insns( six.iteritems(sac.assignments), vector_names=set(["b"]), pymbolic_expr_maps=[self.expansion.get_code_transformer()], retain_names=result_names, complex_dtype=np.complex128 # FIXME ) return loopy_insns, result_names
def get_loopy_instructions(self): from sumpy.symbolic import make_sym_vector avec = make_sym_vector("a", self.dim) import sumpy.symbolic as sp rscale = sp.Symbol("rscale") from sumpy.assignment_collection import SymbolicAssignmentCollection sac = SymbolicAssignmentCollection() coeff_names = [ sac.assign_unique("coeff%d" % i, coeff_i) for i, coeff_i in enumerate( self.expansion.coefficients_from_source(avec, None, rscale))] sac.run_global_cse() from sumpy.codegen import to_loopy_insns return to_loopy_insns( six.iteritems(sac.assignments), vector_names=set(["a"]), pymbolic_expr_maps=[self.expansion.get_code_transformer()], retain_names=coeff_names, complex_dtype=np.complex128 # FIXME )
def get_translation_loopy_insns(self): from sumpy.symbolic import make_sym_vector dvec = make_sym_vector("d", self.dim) src_coeff_exprs = [sym.Symbol("src_coeff%d" % i) for i in range(len(self.src_expansion))] src_rscale = sym.Symbol("src_rscale") tgt_rscale = sym.Symbol("tgt_rscale") from sumpy.assignment_collection import SymbolicAssignmentCollection sac = SymbolicAssignmentCollection() tgt_coeff_names = [ sac.assign_unique("coeff%d" % i, coeff_i) for i, coeff_i in enumerate( self.tgt_expansion.translate_from( self.src_expansion, src_coeff_exprs, src_rscale, dvec, tgt_rscale, sac=sac))] sac.run_global_cse() from sumpy.codegen import to_loopy_insns return to_loopy_insns( six.iteritems(sac.assignments), vector_names=set(["d"]), pymbolic_expr_maps=[self.tgt_expansion.get_code_transformer()], retain_names=tgt_coeff_names, complex_dtype=np.complex128 # FIXME )
def get_loopy_insns_and_result_names(self): from sumpy.symbolic import make_sym_vector dvec = make_sym_vector("d", self.dim) from sumpy.assignment_collection import SymbolicAssignmentCollection sac = SymbolicAssignmentCollection() result_names = [ sac.assign_unique("knl%d" % i, knl.postprocess_at_target( knl.postprocess_at_source( knl.get_expression(dvec), dvec), dvec) ) for i, knl in enumerate(self.kernels)] sac.run_global_cse() from sumpy.codegen import to_loopy_insns loopy_insns = to_loopy_insns(six.iteritems(sac.assignments), vector_names=set(["d"]), pymbolic_expr_maps=[ knl.get_code_transformer() for knl in self.kernels], retain_names=result_names, complex_dtype=np.complex128 # FIXME ) return loopy_insns, result_names
def track_m2l_op_count(self, param): knl = self.knl(param.dim) m_expn = self.mpole_expn_class(knl, order=param.order) l_expn = self.local_expn_class(knl, order=param.order) src_coeff_exprs = [sym.Symbol("src_coeff%d" % i) for i in range(len(m_expn))] dvec = sym.make_sym_vector("d", knl.dim) src_rscale = sym.Symbol("src_rscale") tgt_rscale = sym.Symbol("tgt_rscale") result = l_expn.translate_from(m_expn, src_coeff_exprs, src_rscale, dvec, tgt_rscale) sac = SymbolicAssignmentCollection() for i, expr in enumerate(result): sac.assign_unique("coeff%d" % i, expr) sac.run_global_cse() insns = to_loopy_insns(six.iteritems(sac.assignments)) counter = pymbolic.mapper.flop_counter.CSEAwareFlopCounter() return sum([counter.rec(insn.expression)+1 for insn in insns])
def track_m2l_op_count(self, param): knl = self.knl(param.dim) m_expn = self.mpole_expn_class(knl, order=param.order) l_expn = self.local_expn_class(knl, order=param.order) src_coeff_exprs = [ sym.Symbol("src_coeff%d" % i) for i in range(len(m_expn)) ] dvec = sym.make_sym_vector("d", knl.dim) src_rscale = sym.Symbol("src_rscale") tgt_rscale = sym.Symbol("tgt_rscale") result = l_expn.translate_from(m_expn, src_coeff_exprs, src_rscale, dvec, tgt_rscale) sac = SymbolicAssignmentCollection() for i, expr in enumerate(result): sac.assign_unique("coeff%d" % i, expr) sac.run_global_cse() insns = to_loopy_insns(six.iteritems(sac.assignments)) counter = pymbolic.mapper.flop_counter.CSEAwareFlopCounter() return sum([counter.rec(insn.expression) + 1 for insn in insns])
def test_symbolic_assignment_name_uniqueness(): # https://gitlab.tiker.net/inducer/sumpy/issues/13 from sumpy.assignment_collection import SymbolicAssignmentCollection sac = SymbolicAssignmentCollection({"s_0": 1}) sac.assign_unique("s_", 1) sac.assign_unique("s_", 1) assert len(sac.assignments) == 3 sac = SymbolicAssignmentCollection() sac.assign_unique("s_0", 1) sac.assign_unique("s_", 1) sac.assign_unique("s_", 1) assert len(sac.assignments) == 3
def test_symbolic_assignment_name_uniqueness(): # https://gitlab.tiker.net/inducer/sumpy/issues/13 from sumpy.assignment_collection import SymbolicAssignmentCollection sac = SymbolicAssignmentCollection({"s_0": 1}) sac.assign_unique("s_", 1) sac.assign_unique("s_", 1) assert len(sac.assignments) == 3 sac = SymbolicAssignmentCollection() sac.assign_unique("s_0", 1) sac.assign_unique("s_", 1) sac.assign_unique("s_", 1) assert len(sac.assignments) == 3
def get_loopy_insns_and_result_names(self): from sumpy.symbolic import make_sympy_vector bvec = make_sympy_vector("b", self.dim) from sumpy.assignment_collection import SymbolicAssignmentCollection sac = SymbolicAssignmentCollection() coeff_exprs = [sp.Symbol("coeff%d" % i) for i in range(len(self.expansion.get_coefficient_identifiers()))] value = self.expansion.evaluate(coeff_exprs, bvec) result_names = [ sac.assign_unique("result_%d_p" % i, knl.postprocess_at_target(value, bvec)) for i, knl in enumerate(self.kernels) ] sac.run_global_cse() from sumpy.symbolic import kill_trivial_assignments assignments = kill_trivial_assignments([ (name, expr) for name, expr in six.iteritems(sac.assignments)], retain_names=result_names) from sumpy.codegen import to_loopy_insns loopy_insns = to_loopy_insns(assignments, vector_names=set(["b"]), pymbolic_expr_maps=[self.expansion.get_code_transformer()], complex_dtype=np.complex128 # FIXME ) from pymbolic.interop.sympy import SympyToPymbolicMapper sympy_conv = SympyToPymbolicMapper() loopy_insns.append( lp.Assignment(id=None, assignee="kernel_scaling", expression=sympy_conv(self.expansion.kernel.get_scaling()), temp_var_type=lp.auto)) return loopy_insns, result_names