diff --git a/python/dune/perftool/loopy/symbolic.py b/python/dune/perftool/loopy/symbolic.py index a592c4610f87de0d38bb7da242f3ec8f798b7974..01a992254ede29057ab972cf1b494c1e99f21237 100644 --- a/python/dune/perftool/loopy/symbolic.py +++ b/python/dune/perftool/loopy/symbolic.py @@ -49,7 +49,7 @@ def walk_map_sumfact_kernel(self, expr, *args): def stringify_map_sumfact_kernel(self, expr, *args): - return "SUMFACT" + return str(expr) def dependency_map_sumfact_kernel(self, expr): diff --git a/python/dune/perftool/sumfact/accumulation.py b/python/dune/perftool/sumfact/accumulation.py index 53d949c975c22cd1497e3b58c694bf62f5f168ea..3c935161e5d837d2397736a24a996fff4f312384 100644 --- a/python/dune/perftool/sumfact/accumulation.py +++ b/python/dune/perftool/sumfact/accumulation.py @@ -92,6 +92,9 @@ class AlreadyAssembledInput(SumfactKernelInputBase): def __hash__(self): return hash(self.index) + def __str__(self): + return "Input{}".format(self.index[0]) + class SumfactAccumulationInfo(ImmutableRecord): def __init__(self, diff --git a/python/dune/perftool/sumfact/basis.py b/python/dune/perftool/sumfact/basis.py index 1c1823df4c486e657ac1e960cc0b258fe2cb6d33..889f464fa3fde6ede78ca1e73e48c6119c3b6491 100644 --- a/python/dune/perftool/sumfact/basis.py +++ b/python/dune/perftool/sumfact/basis.py @@ -64,6 +64,9 @@ class LFSSumfactKernelInput(SumfactKernelInputBase, ImmutableRecord): restriction=restriction, ) + def __str__(self): + return "{}".format(self.coeff_func(self.restriction)) + def realize(self, sf, index, insn_dep): lfs = name_lfs(self.element, self.restriction, self.element_index) basisiname = sumfact_iname(name_lfs_bound(lfs), "basis") diff --git a/python/dune/perftool/sumfact/symbolic.py b/python/dune/perftool/sumfact/symbolic.py index 44ae9f7946e8a71dd90ab34b6b941f578cb9b76e..857a1d9766f71c46956cd822d73b4dbc3ce090e9 100644 --- a/python/dune/perftool/sumfact/symbolic.py +++ b/python/dune/perftool/sumfact/symbolic.py @@ -146,6 +146,12 @@ class SumfactKernel(SumfactKernelBase, ImmutableRecord, prim.Variable): def stringifier(self): return lp.symbolic.StringifyMapper + def __str__(self): + # Above stringifier just calls back into this + return "SF{}:[{}]->[{}]".format(self.stage, + str(self.input), + ", ".join(str(m) for m in self.matrix_sequence)) + mapper_method = "map_sumfact_kernel" # @@ -385,6 +391,12 @@ class VectorizedSumfactKernel(SumfactKernelBase, ImmutableRecord, prim.Variable) def stringifier(self): return lp.symbolic.StringifyMapper + def __str__(self): + # Above stringifier just calls back into this + return "VSF{}:[{}]->[{}]".format(self.stage, + ", ".join(str(k.input) for k in self.kernels), + ", ".join(str(mat) for mat in self.matrix_sequence)) + mapper_method = "map_vectorized_sumfact_kernel" init_arg_names = ("kernels", "horizontal_width", "vertical_width", "buffer", "insn_dep") diff --git a/python/dune/perftool/sumfact/tabulation.py b/python/dune/perftool/sumfact/tabulation.py index 177c476b17c23ef138f44b351e4d0fc1127de77d..c4ce095b3adca1fbb42257f42ca42a6d328ae428 100644 --- a/python/dune/perftool/sumfact/tabulation.py +++ b/python/dune/perftool/sumfact/tabulation.py @@ -63,6 +63,15 @@ class BasisTabulationMatrix(BasisTabulationMatrixBase, ImmutableRecord): slice_index=slice_index, ) + def __str__(self): + return "{}{}A{}{}{}" \ + .format("face{}_".format(self.face) if self.face is not None else "", + "d" if self.derivative else "", + self.basis_size, + "T" if self.transpose else "", + "_slice{}".format(self.slice_index) if self.slice_size is not None else "", + ) + @property def rows(self): if self.transpose: @@ -131,6 +140,13 @@ class BasisTabulationMatrixArray(BasisTabulationMatrixBase): width = len(tabs) self.width = width + def __str__(self): + abbrevs = tuple("{}A{}{}".format("d" if t.derivative else "", + self.basis_size, + "s{}".format(t.slice_index) if t.slice_size is not None else "") + for t in self.tabs) + return "_".join(abbrevs) + @property def quadrature_size(self): return self.tabs[0].quadrature_size diff --git a/python/dune/perftool/sumfact/vectorization.py b/python/dune/perftool/sumfact/vectorization.py index 6261a38016b9635c06c6e51cd796461f154fe3a1..53a5c278f1d361abc415bf4186b856ce8c01a7d6 100644 --- a/python/dune/perftool/sumfact/vectorization.py +++ b/python/dune/perftool/sumfact/vectorization.py @@ -203,6 +203,26 @@ def greedy_vectorization_strategy(sumfacts, width): return result +def print_vectorization_strategy(strategy): + qp, strategy = strategy + print "\nPrinting potential vectorization strategy:" + print "Quadrature point tuple: {}".format(qp) + + # Look for all realizations in the strategy and iterate over them + cache_keys = frozenset(v.cache_key for v in strategy.values()) + for ck in cache_keys: + # Filter all the kernels that are realized by this and print + for key in strategy: + if strategy[key].cache_key == ck: + print "{}:".format(key) + + # Find one representative to print + for val in strategy.values(): + if val.cache_key == ck: + print " {}".format(val) + break + + def decide_vectorization_strategy(): """ Decide how to vectorize! Note that the vectorization of the quadrature loop is independent of this,