diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py index 7853bb547268bf587aa56fa4aaaa2fb1896508f4..9661737148258057dbcaef3d775ef6d584ebc881 100644 --- a/python/dune/perftool/options.py +++ b/python/dune/perftool/options.py @@ -80,6 +80,7 @@ class PerftoolFormOptionsArray(ImmutableRecord): sumfact = PerftoolOption(default=False, helpstr="Use sumfactorization") vectorization_quadloop = PerftoolOption(default=False, helpstr="whether to generate code with explicit vectorization") vectorization_strategy = PerftoolOption(default="none", helpstr="The identifier of the vectorization cost model. Possible values: none|explicit|model") + vectorization_not_fully_vectorized_error = PerftoolOption(default=False, helpstr="throw an error if nonquadloop vectorization did not fully vectorize") vectorization_horizontal = PerftoolOption(default=None, helpstr="an explicit value for horizontal vectorization read by the 'explicit' strategy") vectorization_vertical = PerftoolOption(default=None, helpstr="an explicit value for vertical vectorization read by the 'explicit' strategy") vectorization_padding = PerftoolOption(default=None, helpstr="an explicit value for the allowed padding in vectorization") @@ -234,14 +235,19 @@ def get_form_option(key, form=None): def option_switch(opt): def _switch(): + if isinstance(opt, tuple): + opts = opt + else: + assert isinstance(opt, str) + opts = (opt,) try: - if get_option(opt): - return opt - else: - return "default" + for o in opts: + if get_option(o): + return o + return "default" except AttributeError: - if get_form_option(opt): - return opt - else: - return "default" + for o in opts: + if get_form_option(o): + return o + return "default" return _switch diff --git a/python/dune/perftool/pdelab/geometry.py b/python/dune/perftool/pdelab/geometry.py index d308917adbd3391d4b61832938b3a1c4f3355eb5..80ab0387e9728b2c05c2a214b9e7b2fb35c75ea4 100644 --- a/python/dune/perftool/pdelab/geometry.py +++ b/python/dune/perftool/pdelab/geometry.py @@ -338,7 +338,7 @@ def define_jacobian_inverse_transposed(name, restriction): dim = world_dimension() temporary_variable(name, decl_method=define_jacobian_inverse_transposed_temporary(restriction), shape=(dim, dim)) geo = name_cell_geometry(restriction) - pos = get_backend("qp_in_cell", selector=option_switch("blockstructured"))(restriction) + pos = get_backend("qp_in_cell", selector=option_switch(("blockstructured", "sumfact")))(restriction) return quadrature_preamble("{} = {}.jacobianInverseTransposed({});".format(name, geo, str(pos), diff --git a/python/dune/perftool/sumfact/__init__.py b/python/dune/perftool/sumfact/__init__.py index fa28b0f4e744164349c92712088a7e09873161e1..33d3e2d68398f1eda22a98e3d4125df5b99aae96 100644 --- a/python/dune/perftool/sumfact/__init__.py +++ b/python/dune/perftool/sumfact/__init__.py @@ -5,7 +5,6 @@ from dune.perftool.pdelab.argument import (name_applycontainer, ) from dune.perftool.sumfact.quadrature import (quadrature_inames, quadrature_weight, - pymbolic_quadrature_position, ) from dune.perftool.sumfact.basis import (lfs_inames, diff --git a/python/dune/perftool/sumfact/geometry.py b/python/dune/perftool/sumfact/geometry.py index 7b78de412d2e2c5a893e2d1d1d7e32315bd6aafd..0f0f25e8635fd2e6cd89d6e21d811bc7c2f47f9d 100644 --- a/python/dune/perftool/sumfact/geometry.py +++ b/python/dune/perftool/sumfact/geometry.py @@ -87,7 +87,7 @@ def pymbolic_spatial_coordinate_multilinear(do_predicates, visitor): from dune.perftool.sumfact.symbolic import SumfactKernel sf = SumfactKernel(matrix_sequence=matrix_sequence, - input=inp, + interface=inp, ) vsf = attach_vectorization_info(sf) @@ -173,8 +173,8 @@ def pymbolic_spatial_coordinate_axiparallel(do_predicates, visitor): iindex = index if face is not None and index > face: iindex = iindex - 1 - from dune.perftool.sumfact.quadrature import pymbolic_quadrature_position - x = pymbolic_quadrature_position(iindex, visitor) + from dune.perftool.sumfact.quadrature import pymbolic_indexed_quadrature_position + x = pymbolic_indexed_quadrature_position(iindex, visitor) visitor.indices = None return prim.Subscript(prim.Variable(lowcorner), (index,)) + x * prim.Subscript(prim.Variable(meshwidth), (index,)) diff --git a/python/dune/perftool/sumfact/quadrature.py b/python/dune/perftool/sumfact/quadrature.py index cfd7fbb58a77178b203ab0e389e45bef071c5ff1..fdd359578cec007e0bfe0ac9fa52fe7783afa0fc 100644 --- a/python/dune/perftool/sumfact/quadrature.py +++ b/python/dune/perftool/sumfact/quadrature.py @@ -192,8 +192,7 @@ def define_quadrature_position(name, index): ) -@backend(interface="quad_pos", name="sumfact") -def pymbolic_quadrature_position(index, visitor): +def pymbolic_indexed_quadrature_position(index, visitor): # Return the non-precomputed version if not get_form_option("precompute_quadrature_info"): name = 'pos' @@ -237,5 +236,8 @@ def pymbolic_quadrature_position(index, visitor): @backend(interface="qp_in_cell", name="sumfact") def pymbolic_quadrature_position_in_cell(restriction): + # TODO: This code path is broken at the moment. + assert False + from dune.perftool.pdelab.geometry import to_cell_coordinates return to_cell_coordinates(pymbolic_quadrature_position(), restriction) diff --git a/python/dune/perftool/sumfact/vectorization.py b/python/dune/perftool/sumfact/vectorization.py index 788229347bd1f2d6a1caaadf863a8d353213be80..3e79419dcb97777c86a130deb3f0b82b84d4c950 100644 --- a/python/dune/perftool/sumfact/vectorization.py +++ b/python/dune/perftool/sumfact/vectorization.py @@ -32,6 +32,9 @@ import math @generator_factory(item_tags=("vecinfo", "dryrundata"), cache_key_generator=lambda o, n: o) def _cache_vectorization_info(old, new): + if get_form_option("vectorization_not_fully_vectorized_error"): + if not isinstance(new, VectorizedSumfactKernel): + raise PerftoolVectorizationError("Did not fully vectorize!") if new is None: raise PerftoolVectorizationError("Vectorization info for sum factorization kernel was not gathered correctly!") return new