Skip to content

Commit bf87b54

Browse files
committed
compiler: fix array padding and linearization
1 parent 52dddd9 commit bf87b54

3 files changed

Lines changed: 21 additions & 7 deletions

File tree

devito/passes/clusters/buffering.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -404,12 +404,8 @@ def generate_buffers(clusters, key, sregistry, options, **kwargs):
404404
# Finally create the actual buffer
405405
cls = callback or Array
406406
name = sregistry.make_name(prefix=f'{f.name}b')
407-
# We specify the padding to match the input Function's one, so that
408-
# the array can be used in place of the Function with valid strides
409-
# Plain Array do not track mapped so we default to no padding
410-
padding = 0 if cls is Array else f.padding
411407
mapper[f] = cls(name=name, dimensions=dimensions, dtype=f.dtype,
412-
padding=padding, grid=f.grid, halo=f.halo,
408+
grid=f.grid, halo=f.halo,
413409
space='mapped', mapped=f, f=f)
414410

415411
return mapper

devito/types/array.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,10 @@ def __dtype_setup__(cls, **kwargs):
165165
def __padding_setup__(self, **kwargs):
166166
padding = kwargs.get('padding')
167167
if padding is None:
168-
padding = ((0, 0),)*self.ndim
168+
if self.is_autopaddable:
169+
padding = self.__padding_setup_smart__(**kwargs)
170+
else:
171+
padding = ((0, 0),)*self.ndim
169172
elif isinstance(padding, DimensionTuple):
170173
padding = tuple(padding[d] for d in self.dimensions)
171174
elif is_integer(padding):
@@ -244,7 +247,7 @@ class MappedArrayMixin:
244247

245248

246249
class ArrayMapped(MappedArrayMixin, Array):
247-
pass
250+
is_autopaddable = True
248251

249252

250253
class ArrayObject(ArrayBasic):

tests/test_linearize.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,21 @@ def test_int64_array(order):
663663
assert f'({2*order} + {long}y_size)*({2*order} + {long}x_size))' in str(op)
664664

665665

666+
@switchconfig(autopadding=np.float32)
667+
def test_mapped_array_symbolic_autopad():
668+
grid = Grid(shape=(30, 30))
669+
f = Function(name='f', grid=grid, space_order=4)
670+
671+
a = Array(name='ab', dimensions=grid.dimensions, dtype=f.dtype,
672+
grid=grid, halo=f.halo, space='mapped')
673+
674+
assert type(a).__name__ == 'ArrayMapped'
675+
assert a.is_autopaddable
676+
pad = a.padding[-1][1]
677+
assert not pad.is_Integer
678+
assert pad.free_symbols == {grid.dimensions[-1].symbolic_size}
679+
680+
666681
def test_cire_n_strides():
667682
grid = Grid(shape=(4, 4, 4))
668683

0 commit comments

Comments
 (0)