diff --git a/loopy/kernel.py b/loopy/kernel.py index 30509831529c6190d055a9df7bd061b2766e0c86..61f7bbdc98b76314c33065a2ab8ed0b2b93205b4 100644 --- a/loopy/kernel.py +++ b/loopy/kernel.py @@ -1380,6 +1380,70 @@ class SetOperationCacheManager: +from pymbolic.maxima import MaximaStringifyMapper as MaximaStringifyMapperBase +class MaximaStringifyMapper(MaximaStringifyMapperBase): + def map_subscript(self, expr, enclosing_prec): + res = self.rec(expr.aggregate, enclosing_prec) + idx = expr.index + if not isinstance(idx, tuple): + idx = (idx,) + for i in idx: + if isinstance(i, int): + res += "_%d" % i + + return res + +def get_loopy_instructions_as_maxima(kernel, prefix): + """Sample use for code comparison:: + + load("knl-optFalse.mac"); + load("knl-optTrue.mac"); + + vname: bessel_j_8; + + un_name : concat(''un_, vname); + opt_name : concat(''opt_, vname); + + print(ratsimp(ev(un_name - opt_name))); + """ + from loopy.preprocess import add_boostability_and_automatic_dependencies + kernel = add_boostability_and_automatic_dependencies(kernel) + + my_variable_names = ( + insn.get_assignee_var_name() for insn in kernel.instructions) + + from pymbolic import var + subst_dict = dict( + (vn, var(prefix+vn)) for vn in my_variable_names) + + mstr = MaximaStringifyMapper() + from loopy.symbolic import SubstitutionMapper + from pymbolic.mapper.substitutor import make_subst_func + substitute = SubstitutionMapper(make_subst_func(subst_dict)) + + result = ["ratprint:false;"] + + written_insn_ids = set() + + def write_insn(insn): + if not isinstance(insn, Instruction): + insn = kernel.id_to_insn[insn] + + for dep in insn.insn_deps: + if dep not in written_insn_ids: + write_insn(dep) + + result.append("%s%s : %s;" % ( + prefix, insn.get_assignee_var_name(), + mstr(substitute(insn.expression)))) + + written_insn_ids.add(insn.id) + + for insn in kernel.instructions: + if insn.id not in written_insn_ids: + write_insn(insn) + + return "\n".join(result) # vim: foldmethod=marker