1919 SizeOf , VOID , pow_to_mul , unevaluate )
2020from devito .tools import as_mapper , as_list , as_tuple , filter_sorted , flatten
2121from devito .types import (Array , ComponentAccess , CustomDimension , DeviceMap ,
22- DeviceRM , Eq , Symbol )
22+ DeviceRM , Eq , Symbol , size_t )
2323
2424__all__ = ['DataManager' , 'DeviceAwareDataManager' , 'Storage' ]
2525
@@ -168,49 +168,56 @@ def _alloc_mapped_array_on_high_bw_mem(self, site, obj, storage, *args):
168168 """
169169 decl = Definition (obj )
170170
171+ arity_param = Symbol (name = 'arity' , dtype = size_t )
172+ arity_arg = SizeOf (obj .indexed ._C_typedata )
173+ ffp0 = FieldFromPointer (obj ._C_field_data , obj ._C_symbol )
174+ ffp1 = FieldFromPointer (obj ._C_field_shape , obj ._C_symbol )
175+ ffp2 = FieldFromPointer (obj ._C_field_size , obj ._C_symbol )
176+ ffp3 = FieldFromPointer (obj ._C_field_nbytes , obj ._C_symbol )
177+
171178 # Allocate the Array struct
172179 memptr = VOID (Byref (obj ._C_symbol ), '**' )
173180 alignment = obj ._data_alignment
174181 nbytes = SizeOf (obj ._C_typedata )
175- allocs = [ self .langbb ['host-alloc' ](memptr , alignment , nbytes )]
182+ alloc0 = self .langbb ['host-alloc' ](memptr , alignment , nbytes )
176183
177- nbytes_param = Symbol (name = 'nbytes' , dtype = np .uint64 , is_const = True )
178- nbytes_arg = SizeOf (obj .indexed ._C_typedata )* obj .size
184+ # Allocate the shape array
185+ memptr = VOID (Byref (ffp1 ), '**' )
186+ nbytes = SizeOf (obj ._C_size_type )* obj .ndim
187+ alloc1 = self .langbb ['host-alloc' ](memptr , alignment , nbytes )
188+
189+ # Initialize the Array struct
190+ init = [* [DummyExpr (IndexedPointer (ffp1 , i ), s )
191+ for i , s in enumerate (obj .c0 .symbolic_shape )],
192+ DummyExpr (ffp2 , obj .size ),
193+ DummyExpr (ffp3 , ffp2 * arity_param )]
179194
180195 # Allocate the underlying host data
181- ffp0 = FieldFromPointer (obj ._C_field_data , obj ._C_symbol )
182196 memptr = VOID (Byref (ffp0 ), '**' )
183- allocs .append (self .langbb ['host-alloc-pin' ](memptr , alignment , nbytes_param ))
184-
185- # Initialize the Array struct
186- ffp1 = FieldFromPointer (obj ._C_field_nbytes , obj ._C_symbol )
187- init0 = DummyExpr (ffp1 , nbytes_param )
188- ffp2 = FieldFromPointer (obj ._C_field_size , obj ._C_symbol )
189- init1 = DummyExpr (ffp2 , 0 )
197+ alloc2 = self .langbb ['host-alloc-pin' ](memptr , alignment , ffp3 )
190198
199+ # Free all of the allocated data
191200 frees = [self .langbb ['host-free-pin' ](ffp0 ),
201+ self .langbb ['host-free' ](ffp1 ),
192202 self .langbb ['host-free' ](obj ._C_symbol )]
193203
194204 # Allocate the underlying device data, if required by the backend
195- alloc , free = self ._make_dmap_allocfree (obj , nbytes_param )
196-
197- # Chain together all allocs and frees
198- allocs = as_tuple (allocs ) + as_tuple (alloc )
199- frees = as_tuple (free ) + as_tuple (frees )
205+ alloc_dmap , free_dmap = self ._make_dmap_allocfree (obj , ffp3 )
200206
201207 ret = Return (obj ._C_symbol )
202208
203209 # Wrap everything in a Callable so that we can reuse the same code
204210 # for equivalent Array structs
205211 name = self .sregistry .make_name (prefix = 'alloc' )
206- body = (decl , * allocs , init0 , init1 , ret )
212+ body = (decl , alloc0 , alloc1 , * init , alloc2 , * as_tuple ( alloc_dmap ) , ret )
207213 efunc0 = make_callable (name , body , retval = obj )
208214 args = list (efunc0 .parameters )
209- args [args .index (nbytes_param )] = nbytes_arg
215+ args [args .index (arity_param )] = arity_arg
210216 alloc = Call (name , args , retobj = obj )
211217
212218 # Same story for the frees
213219 name = self .sregistry .make_name (prefix = 'free' )
220+ frees = as_tuple (free_dmap ) + as_tuple (frees )
214221 efunc1 = make_callable (name , frees )
215222 free = Call (name , efunc1 .parameters )
216223
@@ -222,35 +229,50 @@ def _alloc_bundle_struct_on_high_bw_mem(self, site, obj, storage):
222229 """
223230 decl = Definition (obj )
224231
232+ arity_param = Symbol (name = 'arity' , dtype = size_t )
233+ arity_arg = SizeOf (obj .indexed ._C_typedata )
234+ ffp1 = FieldFromPointer (obj ._C_field_shape , obj ._C_symbol )
235+ ffp2 = FieldFromPointer (obj ._C_field_size , obj ._C_symbol )
236+ ffp3 = FieldFromPointer (obj ._C_field_nbytes , obj ._C_symbol )
237+
225238 # Allocate the Bundle struct
226239 memptr = VOID (Byref (obj ._C_symbol ), '**' )
227240 alignment = obj ._data_alignment
228241 nbytes = SizeOf (obj ._C_typedata )
229- alloc = self .langbb ['host-alloc' ](memptr , alignment , nbytes )
242+ alloc0 = self .langbb ['host-alloc' ](memptr , alignment , nbytes )
230243
231- nbytes_param = Symbol (name = 'nbytes' , dtype = np .uint64 , is_const = True )
232- nbytes_arg = SizeOf (obj .indexed ._C_typedata )* obj .size
244+ # Allocate the shape array
245+ memptr = VOID (Byref (ffp1 ), '**' )
246+ nbytes = SizeOf (obj ._C_size_type )* obj .ndim
247+ alloc1 = self .langbb ['host-alloc' ](memptr , alignment , nbytes )
233248
234249 # Initialize the Bundle struct
235- ffp1 = FieldFromPointer ( obj . _C_field_nbytes , obj . _C_symbol )
236- init0 = DummyExpr ( ffp1 , nbytes_param )
237- ffp2 = FieldFromPointer ( obj . _C_field_size , obj ._C_symbol )
238- init1 = DummyExpr (ffp2 , 0 )
250+ init = [ * [ DummyExpr ( IndexedPointer ( ffp1 , i ), s )
251+ for i , s in enumerate ( obj . c0 . symbolic_shape )],
252+ DummyExpr ( ffp2 , obj .size ),
253+ DummyExpr (ffp3 , ffp2 * arity_param )]
239254
240- free = self .langbb ['host-free' ](obj ._C_symbol )
255+ # Free all of the allocated data
256+ frees = [self .langbb ['host-free' ](ffp1 ),
257+ self .langbb ['host-free' ](obj ._C_symbol )]
241258
242259 ret = Return (obj ._C_symbol )
243260
244261 # Wrap everything in a Callable so that we can reuse the same code
245262 # for equivalent Bundle structs
246263 name = self .sregistry .make_name (prefix = 'alloc' )
247- body = (decl , alloc , init0 , init1 , ret )
264+ body = (decl , alloc0 , alloc1 , * init , ret )
248265 efunc0 = make_callable (name , body , retval = obj )
249266 args = list (efunc0 .parameters )
250- args [args .index (nbytes_param )] = nbytes_arg
267+ args [args .index (arity_param )] = arity_arg
251268 alloc = Call (name , args , retobj = obj )
252269
253- storage .update (obj , site , allocs = alloc , frees = free , efuncs = efunc0 )
270+ # Same story for the frees
271+ name = self .sregistry .make_name (prefix = 'free' )
272+ efunc1 = make_callable (name , frees )
273+ free = Call (name , efunc1 .parameters )
274+
275+ storage .update (obj , site , allocs = alloc , frees = free , efuncs = (efunc0 , efunc1 ))
254276
255277 def _alloc_object_array_on_low_lat_mem (self , site , obj , storage ):
256278 """
0 commit comments