From f6b4eae7546db76c808eb37d88b242b36f0b161d Mon Sep 17 00:00:00 2001 From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de> Date: Wed, 23 Nov 2016 16:40:07 +0100 Subject: [PATCH] Use kernel tag in localoperator code generation --- python/dune/perftool/loopy/buffer.py | 2 +- python/dune/perftool/pdelab/localoperator.py | 31 +++++++++++++------- python/dune/perftool/pdelab/spaces.py | 4 +-- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/python/dune/perftool/loopy/buffer.py b/python/dune/perftool/loopy/buffer.py index bd94d995..e7207c2b 100644 --- a/python/dune/perftool/loopy/buffer.py +++ b/python/dune/perftool/loopy/buffer.py @@ -44,7 +44,7 @@ class FlipFlopBuffer(object): return name -@generator_factory(item_tags=("kernel", "buffer"), cache_key_generator=lambda i, **kw: i) +@generator_factory(item_tags=("buffer"), cache_key_generator=lambda i, **kw: i, context_tags=("kernel",)) def initialize_buffer(identifier, base_storage_size=None, num=2): if base_storage_size is None: raise PerftoolLoopyError("The buffer for identifier {} has not been initialized.".format(identifier)) diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py index 1c261d94..d9838de3 100644 --- a/python/dune/perftool/pdelab/localoperator.py +++ b/python/dune/perftool/pdelab/localoperator.py @@ -10,6 +10,7 @@ from dune.perftool.generation import (backend, domain, dump_accumulate_timer, get_backend, + get_global_context_value, global_context, iname, include_file, @@ -474,16 +475,21 @@ def generate_kernel(integrals): visitor = UFL2LoopyVisitor(interface, measure, indexmap) get_backend(interface="accum_insn")(visitor, term, measure, subdomain_id) + tag = get_global_context_value("kernel") + return extract_kernel_from_cache(tag) + + +def extract_kernel_from_cache(tag): # Extract the information, which is needed to create a loopy kernel. # First extracting it, might be useful to alter it before kernel generation. from dune.perftool.generation import retrieve_cache_functions, retrieve_cache_items from dune.perftool.loopy.target import DuneTarget - domains = [i for i in retrieve_cache_items("domain")] - instructions = [i for i in retrieve_cache_items("instruction")] - temporaries = {i.name: i for i in retrieve_cache_items("temporary")} - arguments = [i for i in retrieve_cache_items("argument")] - silenced = [l for l in retrieve_cache_items("silenced_warning")] - transformations = [t for t in retrieve_cache_items("transformation")] + domains = [i for i in retrieve_cache_items("{} and domain".format(tag))] + instructions = [i for i in retrieve_cache_items("{} and instruction".format(tag))] + temporaries = {i.name: i for i in retrieve_cache_items("{} and temporary".format(tag))} + arguments = [i for i in retrieve_cache_items("{} and argument".format(tag))] + silenced = [l for l in retrieve_cache_items("{} and silenced_warning".format(tag))] + transformations = [t for t in retrieve_cache_items("{} and transformation".format(tag))] # Construct an options object from loopy import Options @@ -524,7 +530,7 @@ def generate_kernel(integrals): raise NotImplementedError("Only vectorizing sumfactoized code right now!") # Now add the preambles to the kernel - preambles = [(i, p) for i, p in enumerate(retrieve_cache_items("preamble"))] + preambles = [(i, p) for i, p in enumerate(retrieve_cache_items("{} and preamble".format(tag)))] kernel = kernel.copy(preambles=preambles) # Do the loopy preprocessing! @@ -532,7 +538,7 @@ def generate_kernel(integrals): # All items with the kernel tags can be destroyed once a kernel has been generated from dune.perftool.generation import delete_cache_items - delete_cache_items("(not file) and (not clazz)") + delete_cache_items(tag) return kernel @@ -682,7 +688,8 @@ def generate_localoperator_kernels(formdata, data): enum_pattern() pattern_baseclass() enum_alpha() - kernel = generate_kernel(form.integrals_by_type(measure)) + with global_context(kernel=assembler_routine_name()): + kernel = generate_kernel(form.integrals_by_type(measure)) # Maybe add numerical differentiation if get_option("numerical_jacobian"): @@ -737,7 +744,8 @@ def generate_localoperator_kernels(formdata, data): with global_context(form_type="jacobian"): for measure in set(i.integral_type() for i in jacform.integrals()): with global_context(integral_type=measure): - kernel = generate_kernel(jacform.integrals_by_type(measure)) + with global_context(kernel=assembler_routine_name()): + kernel = generate_kernel(jacform.integrals_by_type(measure)) operator_kernels[(measure, 'jacobian')] = kernel # Generate dummy functions for those kernels, that vanished in the differentiation process @@ -762,7 +770,8 @@ def generate_localoperator_kernels(formdata, data): with global_context(form_type="jacobian_apply"): for measure in set(i.integral_type() for i in jac_apply_form.integrals()): with global_context(integral_type=measure): - kernel = generate_kernel(jac_apply_form.integrals_by_type(measure)) + with global_context(kernel=assembler_routine_name()): + kernel = generate_kernel(jac_apply_form.integrals_by_type(measure)) operator_kernels[(measure, 'jacobian_apply')] = kernel # Generate dummy functions for those kernels, that vanished in the differentiation process diff --git a/python/dune/perftool/pdelab/spaces.py b/python/dune/perftool/pdelab/spaces.py index 18fe134f..710f86b0 100644 --- a/python/dune/perftool/pdelab/spaces.py +++ b/python/dune/perftool/pdelab/spaces.py @@ -99,7 +99,7 @@ def name_leaf_lfs(leaf_element, restriction, val=None): return val -@generator_factory(cache_key_generator=lambda e, r, c, **kw: (e, r, c)) +@generator_factory(cache_key_generator=lambda e, r, c, **kw: (e, r, c), context_tags=("kernel",)) def name_lfs(element, restriction, component, prefix=None): # Omitting the prefix is only valid upon a second call, which will # result in a cache hit. @@ -178,7 +178,7 @@ def traverse_lfs_tree(arg): type_gfs(arg.argexpr.ufl_element(), basetype=gfs_basename, index_stack=()) -@generator_factory(item_tags=("iname",), cache_key_generator=lambda e, r, c: (e, c)) +@generator_factory(item_tags=("iname",), cache_key_generator=lambda e, r, c: (e, c), context_tags=("kernel",)) def _lfs_iname(element, restriction, context): lfs = name_leaf_lfs(element, restriction) bound = name_lfs_bound(lfs) -- GitLab