Skip to content

Commit 4e1e142

Browse files
committed
compiler: Relax intervals with upper from not mapped dimensions
1 parent 3512c28 commit 4e1e142

File tree

3 files changed

+18
-20
lines changed

3 files changed

+18
-20
lines changed

devito/ir/clusters/cluster.py

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

390+
# 'union' may consume intervals (values) from keys that have dimensions
391+
# not mapped to intervals e.g. issue #2235, resulting in reduced
392+
# iteration size. Here, we relax this mapped upper interval, by
393+
# intersecting intervals with matching only dimensions
394+
for f, v in parts.items():
395+
for i in v:
396+
# oobs check is not required but helps reduce
397+
# interval reconstruction
398+
if i.dim in oobs and i.dim in f.dimensions:
399+
ii = intervals[i.dim].intersection(v[i.dim])
400+
intervals = intervals.set_upper(i.dim, ii.upper)
401+
390402
# E.g., `db0 -> time`, but `xi NOT-> x`
391403
intervals = intervals.promote(lambda d: not d.is_Sub)
392404
intervals = intervals.zero(set(intervals.dimensions) - oobs)
393405

394-
# Upper bound of intervals including dimensions classified for
395-
# shifting should retain the "oobs" upper bound
396-
for f, v in parts.items():
397-
for i in v:
398-
if i.dim in oobs:
399-
try:
400-
if intervals[i.dim].upper > v[i.dim].upper and \
401-
bool(i.dim in f.dimensions):
402-
intervals = intervals.ceil(v[i.dim])
403-
except AttributeError:
404-
pass
405-
406406
return DataSpace(intervals, parts)
407407

408408
@cached_property

devito/ir/support/space.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,8 @@ def negate(self):
259259
def zero(self):
260260
return Interval(self.dim, 0, 0, self.stamp)
261261

262-
def ceil(self, o):
263-
if not self.is_compatible(o):
264-
return self._rebuild()
265-
return Interval(self.dim, self.lower, o.upper, self.stamp)
262+
def set_upper(self, v=0):
263+
return Interval(self.dim, self.lower, v, self.stamp)
266264

267265
def flip(self):
268266
return Interval(self.dim, self.upper, self.lower, self.stamp)
@@ -501,9 +499,9 @@ def zero(self, d=None):
501499

502500
return IntervalGroup(intervals, relations=self.relations, mode=self.mode)
503501

504-
def ceil(self, o=None):
505-
d = self.dimensions if o is None else as_tuple(o.dim)
506-
return IntervalGroup([i.ceil(o) if i.dim in d else i for i in self],
502+
def set_upper(self, d, v=0):
503+
dims = as_tuple(d)
504+
return IntervalGroup([i.set_upper(v) if i.dim in dims else i for i in self],
507505
relations=self.relations, mode=self.mode)
508506

509507
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
@@ -1992,7 +1992,7 @@ class TestInternals:
19921992

19931993
@pytest.mark.parametrize('nt, offset, epass',
19941994
([1, 1, True], [1, 2, False],
1995-
[5, 1, True], [3, 5, False],
1995+
[5, 3, True], [3, 5, False],
19961996
[4, 1, True], [5, 10, False]))
19971997
def test_indirection(self, nt, offset, epass):
19981998
grid = Grid(shape=(4, 4))

0 commit comments

Comments
 (0)