diff --git a/python/dune/perftool/generation/__init__.py b/python/dune/perftool/generation/__init__.py index e541e71366371039157cb757201f710ffd0a19ca..b3974b5d9df7990d35a68af1b20cf1e54fde9c1d 100644 --- a/python/dune/perftool/generation/__init__.py +++ b/python/dune/perftool/generation/__init__.py @@ -49,6 +49,7 @@ from dune.perftool.generation.loopy import (barrier, valuearg, ) -from dune.perftool.generation.context import (global_context, +from dune.perftool.generation.context import (cache_restoring, + global_context, get_global_context_value, ) diff --git a/python/dune/perftool/generation/cache.py b/python/dune/perftool/generation/cache.py index b4ae54f28479d607907ac59c3c6078283535bc85..31b1b85e0da2797a158b4d49ed10bdf89d7dfe0b 100644 --- a/python/dune/perftool/generation/cache.py +++ b/python/dune/perftool/generation/cache.py @@ -268,7 +268,7 @@ def delete_cache_items(condition=True, keep=False): gen._memoize_cache = _filter_cache_items(gen, condition) -def retrieve_cache_functions(condition=True): +def retrieve_cache_functions(condition="True"): return [g.func for g in _generators if eval(condition, _ConditionDict(g.item_tags))] diff --git a/python/dune/perftool/generation/context.py b/python/dune/perftool/generation/context.py index 55feda422efbabe48c7663e87fea289585253cde..2dca239d8a26f17aee1546ea76fb763e21c2756c 100644 --- a/python/dune/perftool/generation/context.py +++ b/python/dune/perftool/generation/context.py @@ -31,3 +31,22 @@ def global_context(**kwargs): def get_global_context_value(key, default=None): return _global_context_cache.get(key, default) + + +class _CacheRestoringContext(object): + def __enter__(self): + from dune.perftool.generation.cache import _generators as g + self.cache = {} + for i in g: + self.cache[i] = {} + for k, v in i._memoize_cache.items(): + self.cache[i][k] = v + + def __exit__(self, exc_type, exc_value, traceback): + for i, c in self.cache.items(): + for k, v in c.items(): + i._memoize_cache[k] = v + + +def cache_restoring(): + return _CacheRestoringContext() diff --git a/python/dune/perftool/sumfact/autotune.py b/python/dune/perftool/sumfact/autotune.py index 8d171ecf8921eb7c1dc8ee21a1df310baafedfb6..8199196f25392bab32518b7220a7026b16edfbc0 100644 --- a/python/dune/perftool/sumfact/autotune.py +++ b/python/dune/perftool/sumfact/autotune.py @@ -1,6 +1,6 @@ """ Autotuning for sum factorization kernels """ -from dune.perftool.generation import delete_cache_items +from dune.perftool.generation import cache_restoring, delete_cache_items from dune.perftool.loopy.target import DuneTarget from dune.perftool.sumfact.realization import realize_sumfact_kernel_function from dune.perftool.options import get_option @@ -169,7 +169,9 @@ def autotune_realization(sf): logname = "{}.log".format(name) # Generate and compile a benchmark program - generate_standalone_code(sf, filename, logname) + with cache_restoring(): + generate_standalone_code(sf, filename, logname) + ret = subprocess.call(compiler_invocation(name, filename)) assert ret == 0