diff --git a/loopy/kernel/instruction.py b/loopy/kernel/instruction.py index 564be622a48ffb44ce026da59e07189f811f557b..e6b0937856c45fd130f93742eb000c12921d0e11 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 30f4feefae976bd683f58b4caa0891334407349b..1ebbe5c8a4fd2b68e3bfcf5ed493384599dac2c5 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())) # }}}