From 66b46d35f7943966cb2f1c9407cf50095c49ba9b Mon Sep 17 00:00:00 2001 From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de> Date: Tue, 28 Aug 2018 16:54:44 +0200 Subject: [PATCH] Dabble with the cost model --- python/dune/perftool/sumfact/vectorization.py | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/python/dune/perftool/sumfact/vectorization.py b/python/dune/perftool/sumfact/vectorization.py index bf463446..2b51a853 100644 --- a/python/dune/perftool/sumfact/vectorization.py +++ b/python/dune/perftool/sumfact/vectorization.py @@ -54,20 +54,18 @@ def attach_vectorization_info(sf): def costmodel(sf): - # Penalize vertical vectorization - vertical_penalty = 1 + math.log(sf.vertical_width) + # Penalize vertical vectorization and scalar execution + verticality = sf.vertical_width + if isinstance(sf, SumfactKernel): + verticality = get_vcl_type_size(dtype_floatingpoint()) + vertical_penalty = 1 + 0.5 * math.log(verticality, 2) memory_penalty = 1.0 if isinstance(sf, VectorizedSumfactKernel): - memory_penalty = 1.0 + math.log(len(set(k.interface for k in sf.kernels)), 2) - - # Penalize scalar sum factorization kernels - scalar_penalty = 1 - if isinstance(sf, SumfactKernel): - scalar_penalty = get_vcl_type_size(dtype_floatingpoint()) + memory_penalty = 1.0 + 0.25 * math.log(len(set(k.interface for k in sf.kernels)), 2) # Return total operations - return sf.operations * vertical_penalty * memory_penalty * scalar_penalty + return sf.operations * vertical_penalty * memory_penalty def explicit_costfunction(sf): @@ -265,21 +263,27 @@ def level1_optimal_vectorization_strategy(sumfacts, width): # Find the minimum cost strategy between all the quadrature point tuples optimal_strategies = {qp: level2_optimal_vectorization_strategy(sumfacts, width, qp) for qp in quad_points} - qp = min(optimal_strategies, key=lambda qp: strategy_cost((qp, optimal_strategies[qp]))) # If we are using the 'target' strategy, we might want to log some information. if get_form_option("vectorization_strategy") == "target": # Print the achieved cost and the target cost on the screen set_form_option("vectorization_strategy", "model") + qp = min(optimal_strategies, key=lambda qp: strategy_cost((qp, optimal_strategies[qp]))) cost = strategy_cost((qp, optimal_strategies[qp])) + print("The target cost was: {}".format(get_form_option("vectorization_target"))) print("The achieved cost was: {}".format(cost)) - print("The optimal cost would be: {}".format(strategy_cost(level1_optimal_vectorization_strategy(sumfacts, width)))) + optimum = level1_optimal_vectorization_strategy(sumfacts, width) + print("The optimal cost would be: {}".format(strategy_cost(optimum))) set_form_option("vectorization_strategy", "target") print("The score in 'target' logic was: {}".format(strategy_cost((qp, optimal_strategies[qp])))) # Print the employed vectorization strategy into a file - filename = "targetstrat_{}.log".format(int(float(get_form_option("vectorization_target")))) + suffix = "" + if get_global_context_value("integral_type") == "interior_facet": + suffix = "_dir{}_mod{}".format(get_global_context_value("facedir_s"), + get_global_context_value("facemod_s")) + filename = "targetstrat_{}{}.log".format(int(float(get_form_option("vectorization_target"))), suffix) with open(filename, 'w') as f: f.write("\n".join(stringify_vectorization_strategy((qp, optimal_strategies[qp])))) @@ -291,6 +295,8 @@ def level1_optimal_vectorization_strategy(sumfacts, width): # TODO: Depending on the number of samples, we might need a file lock here. with open("mapping.csv", 'a') as f: f.write(" ".join((identifier, str(cost), short_stringify_vectorization_strategy((qp, optimal_strategies[qp])))) + "\n") + else: + qp = min(optimal_strategies, key=lambda qp: strategy_cost((qp, optimal_strategies[qp]))) return qp, optimal_strategies[qp] -- GitLab