Skip to content

Commit d4f6311

Browse files
author
George Bisbas
committed
compiler: Relax intervals with upper from not mapped dimensions
1 parent 56d34ca commit d4f6311

3 files changed

Lines changed: 18 additions & 20 deletions

File tree

devito/ir/clusters/cluster.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -470,22 +470,22 @@ def dspace(self):
470470
# Dimension-centric view of the data space
471471
intervals = IntervalGroup.generate('union', *parts.values())
472472

473+
# 'union' may consume intervals (values) from keys that have dimensions
474+
# not mapped to intervals e.g. issue #2235, resulting in reduced
475+
# iteration size. Here, we relax this mapped upper interval, by
476+
# intersecting intervals with matching only dimensions
477+
for f, v in parts.items():
478+
for i in v:
479+
# oobs check is not required but helps reduce
480+
# interval reconstruction
481+
if i.dim in oobs and i.dim in f.dimensions:
482+
ii = intervals[i.dim].intersection(v[i.dim])
483+
intervals = intervals.set_upper(i.dim, ii.upper)
484+
473485
# E.g., `db0 -> time`, but `xi NOT-> x`
474486
intervals = intervals.promote(lambda d: not d.is_Sub)
475487
intervals = intervals.zero(set(intervals.dimensions) - oobs)
476488

477-
# Upper bound of intervals including dimensions classified for
478-
# shifting should retain the "oobs" upper bound
479-
for f, v in parts.items():
480-
for i in v:
481-
if i.dim in oobs:
482-
try:
483-
if intervals[i.dim].upper > v[i.dim].upper and \
484-
bool(i.dim in f.dimensions):
485-
intervals = intervals.ceil(v[i.dim])
486-
except AttributeError:
487-
pass
488-
489489
return DataSpace(intervals, parts)
490490

491491
@cached_property

devito/ir/support/space.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,8 @@ def negate(self):
271271
def zero(self):
272272
return Interval(self.dim, 0, 0, self.stamp)
273273

274-
def ceil(self, o):
275-
if not self.is_compatible(o):
276-
return self._rebuild()
277-
return Interval(self.dim, self.lower, o.upper, self.stamp)
274+
def set_upper(self, v=0):
275+
return Interval(self.dim, self.lower, v, self.stamp)
278276

279277
def flip(self):
280278
return Interval(self.dim, self.upper, self.lower, self.stamp)
@@ -521,9 +519,9 @@ def zero(self, d=None):
521519

522520
return IntervalGroup(intervals, relations=self.relations, mode=self.mode)
523521

524-
def ceil(self, o=None):
525-
d = self.dimensions if o is None else as_tuple(o.dim)
526-
return IntervalGroup([i.ceil(o) if i.dim in d else i for i in self],
522+
def set_upper(self, d, v=0):
523+
dims = as_tuple(d)
524+
return IntervalGroup([i.set_upper(v) if i.dim in dims else i for i in self],
527525
relations=self.relations, mode=self.mode)
528526

529527
def lift(self, d=None, v=None):

tests/test_operator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2136,7 +2136,7 @@ class TestInternals:
21362136

21372137
@pytest.mark.parametrize('nt, offset, epass',
21382138
([1, 1, True], [1, 2, False],
2139-
[5, 1, True], [3, 5, False],
2139+
[5, 3, True], [3, 5, False],
21402140
[4, 1, True], [5, 10, False]))
21412141
def test_indirection(self, nt, offset, epass):
21422142
grid = Grid(shape=(4, 4))

0 commit comments

Comments
 (0)