diff --git a/python/dune/perftool/generation/loopy.py b/python/dune/perftool/generation/loopy.py index 69ad01cb31f211066e074f7d3318e62fd57402ef..bdca6a9f2b99af29aee25fb181a0e55f45adb292 100644 --- a/python/dune/perftool/generation/loopy.py +++ b/python/dune/perftool/generation/loopy.py @@ -55,7 +55,7 @@ def get_temporary_name(): @generator_factory(item_tags=("temporary",), cache_key_generator=lambda n, **kw: n) def temporary_variable(name, **kwargs): from dune.perftool.loopy.temporary import DuneTemporaryVariable - return DuneTemporaryVariable(name, scope=loopy.temp_var_scope.LOCAL, **kwargs) + return DuneTemporaryVariable(name, scope=loopy.temp_var_scope.PRIVATE, **kwargs) # Now define generators for instructions. To ease dependency handling of instructions diff --git a/python/dune/perftool/loopy/target.py b/python/dune/perftool/loopy/target.py index 295a6029b3ba6891b84a85132fac2d640df271e6..a8e2232534338027853bbc8cb1ba0926ed3aff59 100644 --- a/python/dune/perftool/loopy/target.py +++ b/python/dune/perftool/loopy/target.py @@ -14,6 +14,8 @@ from loopy.target.c import CASTBuilder from loopy.target.c.codegen.expression import ExpressionToCExpressionMapper, CExpressionToCodeMapper from loopy.types import NumpyType +from pymbolic.mapper.stringifier import PREC_NONE + import pymbolic.primitives as prim import cgen @@ -62,6 +64,24 @@ class DuneCExpressionToCodeMapper(CExpressionToCodeMapper): else: return CExpressionToCodeMapper.map_remainder(expr, enclosing_prec) + def map_min(self, expr, enclosing_prec): + """ Max/Min is not implemented as a function! + TODO: Revisit this w.r.t. ADL problems + """ + what = type(expr).__name__.lower() + + children = list(expr.children) + + result = self.rec(children.pop(), PREC_NONE) + while children: + result = "std::%s(%s, %s)" % (what, + self.rec(children.pop(), PREC_NONE), + result) + + return result + + map_max = map_min + class DuneASTBuilder(CASTBuilder): def function_manglers(self): diff --git a/python/dune/perftool/loopy/transformations/vectorview.py b/python/dune/perftool/loopy/transformations/vectorview.py index 5d72fb4d263e1217fc16cd7b1c95b22a71b5eec3..243a6e528562607038f17134bb93837690aad72d 100644 --- a/python/dune/perftool/loopy/transformations/vectorview.py +++ b/python/dune/perftool/loopy/transformations/vectorview.py @@ -23,14 +23,17 @@ def add_vector_view(knl, tmpname): assert tmpname in temporaries temp = temporaries[tmpname] vecname = get_vector_view_name(tmpname) + bsname = tmpname + "_base" if vecname in knl.temporary_variables: return knl # Add base storage to the original temporary! if not temp.base_storage: - temp = temp.copy(base_storage=tmpname + "_base") + temp = temp.copy(base_storage=bsname) temporaries[tmpname] = temp + else: + bsname = temp.base_storage # Determine the shape by dividing total size by vector size vecsize = get_vcl_type_size(temp.dtype) @@ -41,7 +44,7 @@ def add_vector_view(knl, tmpname): temporaries[vecname] = lp.TemporaryVariable(vecname, dim_tags="c,vec", shape=(size, vecsize), - base_storage=tmpname + "_base", + base_storage=bsname, dtype=np.float64, scope=lp.temp_var_scope.PRIVATE, )