Skip to content

Commit 1c13976

Browse files
committed
compiler: Cast operands to long before multiplying dimensions to get allocation size
1 parent 64d15c5 commit 1c13976

2 files changed

Lines changed: 14 additions & 3 deletions

File tree

‎devito/passes/iet/definitions.py‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
VOID, Byref, DefFunction, FieldFromPointer, IndexedPointer, ListInitializer, SizeOf,
2121
as_long, pow_to_mul, unevaluate
2222
)
23-
from devito.tools import as_list, as_mapper, as_tuple, filter_sorted, flatten, is_integer
23+
from devito.tools import (
24+
as_list, as_mapper, as_tuple, filter_sorted, flatten, is_integer, prod
25+
)
2426
from devito.types import (
2527
Array, ComponentAccess, CustomDimension, DeviceMap, DeviceRM, Dimension, Eq, Symbol,
2628
size_t
@@ -192,7 +194,8 @@ def _alloc_host_array_on_high_bw_mem(self, site, obj, storage, *args):
192194

193195
memptr = VOID(Byref(obj._C_symbol), '**')
194196
alignment = obj._data_alignment
195-
nbytes = SizeOf(obj._C_typedata)*as_long(obj.size)
197+
size = prod(as_long(i) for i in obj.symbolic_shape)
198+
nbytes = SizeOf(obj._C_typedata)*size
196199
zeroing, efuncs = self._zero_init(obj, storage)
197200
allocs = [decl, self.langbb['host-alloc'](memptr, alignment, nbytes),
198201
*zeroing]
@@ -601,7 +604,8 @@ def _alloc_local_array_on_high_bw_mem(self, site, obj, storage):
601604
doalloc = self.langbb['device-alloc']
602605
dofree = self.langbb['device-free']
603606

604-
nbytes = SizeOf(obj._C_typedata)*obj.size
607+
size = prod(as_long(i) for i in obj.symbolic_shape)
608+
nbytes = SizeOf(obj._C_typedata)*size
605609

606610
zeroing, efuncs = self._zero_init(obj, storage)
607611
allocs = [doalloc(nbytes, deviceid, retobj=obj), *zeroing]

‎devito/types/basic.py‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,6 +1141,13 @@ def ndim(self):
11411141
"""The rank of the object."""
11421142
return len(self.indices)
11431143

1144+
# @property
1145+
# def safe_size(self):
1146+
# """
1147+
# The symbolic size of the object, casting to LONG to prevent overflow.
1148+
# """
1149+
# return prod(as_long(i) for i in self.symbolic_shape)
1150+
11441151
@property
11451152
def symbolic_shape(self):
11461153
"""

0 commit comments

Comments
 (0)