Skip to content
Snippets Groups Projects
Commit 9ce3271a authored by Dominic Kempf's avatar Dominic Kempf
Browse files

Make iteration order of vectorization strategies deterministic

parent 4ce3a6b6
No related branches found
No related tags found
No related merge requests found
......@@ -20,7 +20,7 @@ from dune.perftool.sumfact.tabulation import (BasisTabulationMatrixArray,
)
from dune.perftool.error import PerftoolVectorizationError
from dune.perftool.options import get_option
from dune.perftool.tools import add_to_frozendict, round_to_multiple
from dune.perftool.tools import add_to_frozendict, round_to_multiple, list_diff
from pytools import product
from frozendict import frozendict
......@@ -260,12 +260,16 @@ def fixed_quad_vectorization_opportunity_generator(sumfacts, width, qp, already=
yield already
return
# Ensure a deterministic order of the given sumfact kernels. This is necessary for the
# fromlist strategy to pick correct strategies across different program runs
sumfacts = sorted(sumfacts, key=lambda sf: repr(sf))
# Otherwise we pick a random sum factorization kernel and construct all the vectorization
# opportunities realizing this particular kernel and go into recursion.
sf_to_decide = next(iter(sumfacts))
sf_to_decide = sumfacts[0]
# Have "unvectorized" as an option, although it is not good
for opp in fixed_quad_vectorization_opportunity_generator(sumfacts.difference({sf_to_decide}),
for opp in fixed_quad_vectorization_opportunity_generator(list_diff(sumfacts, [sf_to_decide]),
width,
qp,
add_to_frozendict(already,
......@@ -298,7 +302,7 @@ def fixed_quad_vectorization_opportunity_generator(sumfacts, width, qp, already=
continue
# Go into recursion to also vectorize all kernels not in this combo
for opp in fixed_quad_vectorization_opportunity_generator(sumfacts.difference(combo),
for opp in fixed_quad_vectorization_opportunity_generator(list_diff(sumfacts, combo),
width,
qp,
add_to_frozendict(already, vecdict),
......
......@@ -74,3 +74,11 @@ def add_to_frozendict(fd, valdict):
t = dict(fd)
t.update(valdict)
return frozendict.frozendict(t)
def list_diff(l1, l2):
l = []
for item in l1:
if item not in l2:
l.append(item)
return l
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment