From a1b1b85613c0bdc69ef647ce6a5ec326c23cd5d3 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Fri, 15 Sep 2017 11:03:42 -0500 Subject: [PATCH] Reduce the size of a recent update_persistent_hash() performance regression. The key builder (701dc4ed8762cffeaa5e174d38ae4cdf085eb6aa) added field names to the hash key which ended up slowing things down. Example (in pytential test suite, loads ~110 times from cache): PYOPENCL_TEST=port \ time -p python test_layer_pot_eigenvalues.py \ "test_ellipse_eigenvalues(cl._csc, 1, 5, 3, False)" * Prior to 701dc4ed8762cffeaa5e174d38ae4cdf085eb6aa: real 21.68 user 21.06 sys 2.03 * As of 701dc4ed8762cffeaa5e174d38ae4cdf085eb6aa: real 27.11 user 26.59 sys 1.94 * As of this commit: real 22.29 user 21.90 sys 1.86 This commit doesn't make everything as fast as it used to be because pymbolic expressions are still stringified before hashing. However, caching (#67) will eventually help with that too. --- loopy/kernel/instruction.py | 6 +++--- loopy/tools.py | 10 ++++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/loopy/kernel/instruction.py b/loopy/kernel/instruction.py index 564be622a..e6b093785 100644 --- a/loopy/kernel/instruction.py +++ b/loopy/kernel/instruction.py @@ -417,7 +417,7 @@ class InstructionBase(ImmutableRecord): @property @memoize_method - def _key(self): + def _key_builder(self): from loopy.tools import LoopyEqKeyBuilder key_builder = LoopyEqKeyBuilder() key_builder.update_for_class(self.__class__) @@ -433,7 +433,7 @@ class InstructionBase(ImmutableRecord): else: key_builder.update_for_field(field_name, field_value) - return key_builder.key() + return key_builder def update_persistent_hash(self, key_hash, key_builder): """Custom hash computation function for use with @@ -442,7 +442,7 @@ class InstructionBase(ImmutableRecord): Only works in conjunction with :class:`loopy.tools.KeyBuilder`. """ - key_builder.rec(key_hash, self._key) + key_builder.rec(key_hash, self._key_builder.hash_key()) # }}} diff --git a/loopy/tools.py b/loopy/tools.py index 30f4feefa..1ebbe5c8a 100644 --- a/loopy/tools.py +++ b/loopy/tools.py @@ -152,10 +152,16 @@ class LoopyEqKeyBuilder(object): self.field_dict[field_name] = value def update_for_pymbolic_field(self, field_name, value): - self.field_dict[field_name] = str(value) + self.field_dict[field_name] = str(value).encode("utf-8") def key(self): - return (self.class_.__name__, self.field_dict) + return (self.class_.__name__.encode("utf-8"), self.field_dict) + + def hash_key(self): + """Similar to key(), but excludes field names for faster hashing. + """ + return (self.class_.__name__.encode("utf-8"),) + tuple( + self.field_dict[k] for k in sorted(self.field_dict.keys())) # }}} -- GitLab