Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 53aa1d3

Browse files
committedJul 12, 2024·
compiler: Relax intervals with upper from not mapped dimensions
1 parent 2d61e8b commit 53aa1d3

File tree

3 files changed

+18
-20
lines changed

3 files changed

+18
-20
lines changed
 

‎devito/ir/clusters/cluster.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -383,22 +383,22 @@ def dspace(self):
383383
# Dimension-centric view of the data space
384384
intervals = IntervalGroup.generate('union', *parts.values())
385385

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

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

404404
@cached_property

‎devito/ir/support/space.py

+5-7
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

+1-1
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)
Please sign in to comment.