diff --git a/python/dune/perftool/loopy/symbolic.py b/python/dune/perftool/loopy/symbolic.py index 42f0420d52e5704713734aac165919c92afbdbee..ad3c74076c814c454b7081d018b1d5ff16efad62 100644 --- a/python/dune/perftool/loopy/symbolic.py +++ b/python/dune/perftool/loopy/symbolic.py @@ -22,6 +22,9 @@ class SumfactKernel(prim.Variable): preferred_position, restriction, ): + if not isinstance(restriction, tuple): + restriction = (restriction, 0) + self.a_matrices = a_matrices self.buffer = buffer self.stage = stage diff --git a/python/dune/perftool/sumfact/sumfact.py b/python/dune/perftool/sumfact/sumfact.py index 2b8dba96e176f107acdb8dcfc8a41c1d18544b67..539d2f698b8c23c5f13b30f66229def5137705be 100644 --- a/python/dune/perftool/sumfact/sumfact.py +++ b/python/dune/perftool/sumfact/sumfact.py @@ -128,7 +128,7 @@ def generate_accumulation_instruction(visitor, accterm, measure, subdomain_id): # Get the vectorization info. If this happens during the dry run, we get dummies from dune.perftool.sumfact.vectorization import get_vectorization_info - a_matrices, buffer, input, index = get_vectorization_info(a_matrices, accterm.argument.restriction) + a_matrices, buffer, input, index = get_vectorization_info(a_matrices, (accterm.argument.restriction, restriction)) # Initialize a base storage for this buffer and get a temporay pointing to it shape = tuple(mat.cols for mat in a_matrices if mat.cols != 1) @@ -185,7 +185,7 @@ def generate_accumulation_instruction(visitor, accterm, measure, subdomain_id): insn_dep=insn_dep, additional_inames=frozenset(visitor.inames), preferred_position=pref_pos, - restriction=accterm.argument.restriction, + restriction=(accterm.argument.restriction, restriction), ) inames = tuple(sumfact_iname(mat.rows, 'accum') for mat in a_matrices) diff --git a/python/dune/perftool/sumfact/vectorization.py b/python/dune/perftool/sumfact/vectorization.py index 37bc7f9fc30356740413dddcd56b8a8d673f240c..a9e050fb68c3f583d283a62a39943f1deef53093 100644 --- a/python/dune/perftool/sumfact/vectorization.py +++ b/python/dune/perftool/sumfact/vectorization.py @@ -18,14 +18,18 @@ def vectorization_info(a_matrices, restriction, new_a_matrices, buffer, input, i def get_vectorization_info(a_matrices, restriction): + if not isinstance(restriction, tuple): + restriction = (restriction, 0) from dune.perftool.generation import get_global_context_value if get_global_context_value("dry_run"): # Return dummy data return (a_matrices, get_counted_variable("buffer"), get_counted_variable("input"), None) - try: - return vectorization_info(a_matrices, restriction, None, None, None, None) - except TypeError: + + # Try getting the vectorization info collected after dry run + vec = vectorization_info(a_matrices, restriction, None, None, None, None) + if vec[0] is None: raise PerftoolError("Sumfact Vectorization data should have been collected in dry run, but wasnt") + return vec def no_vectorization(sumfacts): @@ -107,7 +111,9 @@ def decide_vectorization_strategy(): no_vectorization(sumfacts) else: for stage in (1, 3): - for restriction in (Restriction.NONE, Restriction.POSITIVE, Restriction.NEGATIVE): + res = (Restriction.NONE, Restriction.POSITIVE, Restriction.NEGATIVE) + import itertools as it + for restriction in it.product(res, res): decide_stage_vectorization_strategy(sumfacts, stage, restriction)