Skip to content

Commit 5326df0

Browse files
committed
misc: Refactoring, tidy up, and caching bugfix
1 parent d6e80be commit 5326df0

3 files changed

Lines changed: 20 additions & 32 deletions

File tree

devito/ir/clusters/algorithms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ def callback(self, clusters, prefix, backlog=None, known_break=None):
176176
# user-specified backward iteration before defaulting to forward to avoid a
177177
# gotcha by using the logical d_anti here.
178178
idir = {d: Backward for d in candidates
179-
if d.root in scope.d_anti_logical.cause_logical}
179+
if d.root in scope.d_anti_logical.cause}
180180
if maybe_break:
181181
idir.update({d: Forward for d in candidates if d.root in scope.d_flow.cause})
182182
# Default to forward for remaining dimensions

devito/ir/support/basic.py

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -569,10 +569,6 @@ def timestamp(self):
569569
def distance(self):
570570
return self.source.distance(self.sink)
571571

572-
@cached_property
573-
def distance_logical(self):
574-
return self.source.distance(self.sink, logical=True)
575-
576572
@cached_property
577573
def _defined_findices(self):
578574
return frozenset(flatten(i._defines for i in self.findices))
@@ -663,19 +659,6 @@ def cause(self):
663659
return i._defines
664660
return frozenset()
665661

666-
# TODO: Refactor this
667-
@cached_property
668-
def cause_logical(self):
669-
"""Return the findex causing the dependence."""
670-
for i, j in zip(self.findices, self.distance_logical, strict=False):
671-
try:
672-
if j > 0:
673-
return i._defines
674-
except TypeError:
675-
# Conservatively assume this is an offending dimension
676-
return i._defines
677-
return frozenset()
678-
679662
@cached_property
680663
def read(self):
681664
if self.is_flow:
@@ -806,16 +789,19 @@ def is_storage_related(self, dims=None):
806789
return False
807790

808791

792+
class LogicalDependence(Dependence):
793+
794+
@cached_property
795+
def distance(self):
796+
return self.source.distance(self.sink, logical=True)
797+
798+
809799
class DependenceGroup(set):
810800

811801
@cached_property
812802
def cause(self):
813803
return frozenset().union(*[i.cause for i in self])
814804

815-
@cached_property
816-
def cause_logical(self):
817-
return frozenset().union(*[i.cause_logical for i in self])
818-
819805
@cached_property
820806
def functions(self):
821807
"""Return the DiscreteFunctions inducing a dependence."""
@@ -1135,21 +1121,20 @@ def d_flow(self):
11351121
return DependenceGroup(self.d_flow_gen())
11361122

11371123
@memoized_generator
1138-
def d_anti_gen(self, logical=False):
1124+
def d_anti_gen(self, depcls=Dependence):
11391125
"""Generate the anti (or "write-after-read") dependences."""
11401126
for k, v in self.writes.items():
11411127
for w in v:
11421128
for r in self.reads_smart_gen(k):
11431129
if any(not rule(r, w) for rule in self.rules):
11441130
continue
11451131

1146-
dependence = Dependence(r, w)
1132+
dependence = depcls(r, w)
11471133

11481134
if dependence.is_imaginary:
11491135
continue
11501136

1151-
distance = dependence.distance_logical \
1152-
if logical else dependence.distance
1137+
distance = dependence.distance
11531138

11541139
try:
11551140
is_anti = distance > 0 or (r.lex_lt(w) and distance == 0)
@@ -1172,7 +1157,7 @@ def d_anti_logical(self):
11721157
Anti (or "write-after-read") dependences using logical rather than true
11731158
distances.
11741159
"""
1175-
return DependenceGroup(self.d_anti_gen(logical=True))
1160+
return DependenceGroup(self.d_anti_gen(depcls=LogicalDependence))
11761161

11771162
@memoized_generator
11781163
def d_output_gen(self):

devito/tools/memoization.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,15 +142,18 @@ class CacheInstancesMeta(type):
142142
def __init__(cls: type[InstanceType], *args) -> None: # type: ignore
143143
super().__init__(*args)
144144

145-
# Register the cached type
145+
# Register the cached type and eagerly create its cache, bound to its
146+
# own constructor. Eager initialisation avoids a bug where a subclass
147+
# would inherit (and reuse) a parent's cache via MRO lookup if the
148+
# parent happened to be instantiated first.
146149
CacheInstancesMeta._cached_types.add(cls)
150+
maxsize = cls._instance_cache_size
151+
cls._instance_cache = lru_cache(maxsize=maxsize)(
152+
super().__call__
153+
)
147154

148155
def __call__(cls: type[InstanceType], # type: ignore
149156
*args, **kwargs) -> InstanceType:
150-
if cls._instance_cache is None:
151-
maxsize = cls._instance_cache_size
152-
cls._instance_cache = lru_cache(maxsize=maxsize)(super().__call__)
153-
154157
args, kwargs = cls._preprocess_args(*args, **kwargs)
155158
return cls._instance_cache(*args, **kwargs)
156159

0 commit comments

Comments
 (0)