Skip to content

Commit 44067bf

Browse files
committed
compiler: Add FunctionMap type
1 parent 4ee88fb commit 44067bf

2 files changed

Lines changed: 67 additions & 3 deletions

File tree

devito/types/parallel.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
from devito.types.basic import Scalar, Symbol
2020
from devito.types.dimension import CustomDimension
2121
from devito.types.misc import Fence, VolatileInt
22+
from devito.types.object import LocalObject
2223

2324
__all__ = ['NThreads', 'NThreadsNested', 'NThreadsNonaffine', 'NThreadsBase',
2425
'DeviceID', 'ThreadID', 'Lock', 'ThreadArray', 'PThreadArray',
25-
'SharedData', 'NPThreads', 'DeviceRM', 'QueueID', 'Barrier', 'TBArray']
26+
'SharedData', 'NPThreads', 'DeviceRM', 'QueueID', 'Barrier', 'TBArray',
27+
'FunctionMap']
2628

2729

2830
class NThreadsAbstract(Scalar):
@@ -331,3 +333,19 @@ def __init_finalize__(self, *args, **kwargs):
331333
kwargs['liveness'] = 'eager'
332334

333335
super().__init_finalize__(*args, **kwargs)
336+
337+
338+
class FunctionMap(LocalObject):
339+
340+
"""
341+
Wrap a Function in a LocalObject.
342+
"""
343+
344+
__rargs__ = ('name', 'tensor')
345+
346+
def __init__(self, name, tensor, **kwargs):
347+
super().__init__(name, **kwargs)
348+
self.tensor = tensor
349+
350+
def _hashable_content(self):
351+
return super()._hashable_content() + (self.tensor,)

tests/test_iet.py

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
from devito.passes.iet.engine import Graph
1616
from devito.passes.iet.languages.C import CDataManager
1717
from devito.symbolics import (Byref, FieldFromComposite, InlineIf, Macro, Class,
18-
FLOAT)
18+
FLOAT, ListInitializer, SizeOf)
1919
from devito.tools import CustomDtype, as_tuple, dtype_to_ctype
20-
from devito.types import Array, LocalObject, Symbol
20+
from devito.types import Array, LocalObject, Symbol, FunctionMap
2121

2222

2323
@pytest.fixture
@@ -296,6 +296,52 @@ def _C_free(self):
296296
}"""
297297

298298

299+
def test_make_cuda_tensor_map():
300+
301+
class CUTensorMap(FunctionMap):
302+
303+
dtype = CustomDtype('CUtensorMap')
304+
305+
@property
306+
def _C_init(self):
307+
symsizes = list(reversed(self.tensor.symbolic_shape))
308+
sizeof_dtype = SizeOf(self.tensor.dmap._C_typedata)
309+
310+
sizes = ListInitializer(symsizes)
311+
strides = ListInitializer([
312+
np.prod(symsizes[:i])*sizeof_dtype for i in range(1, len(symsizes))
313+
])
314+
315+
arguments = [
316+
Byref(self),
317+
Macro('CU_TENSOR_MAP_DATA_TYPE_FLOAT32'),
318+
4, self.tensor.dmap, sizes, strides,
319+
]
320+
call = Call('cuTensorMapEncodeTiled', arguments)
321+
322+
return call
323+
324+
grid = Grid(shape=(10, 10, 10))
325+
326+
u = TimeFunction(name='u', grid=grid)
327+
328+
tmap = CUTensorMap('tmap', u)
329+
330+
iet = Call('foo', tmap)
331+
iet = ElementalFunction('foo', iet, parameters=())
332+
dm = CDataManager(sregistry=None)
333+
iet = CDataManager.place_definitions.__wrapped__(dm, iet)[0]
334+
335+
assert str(iet) == """\
336+
static void foo()
337+
{
338+
CUtensorMap tmap;
339+
cuTensorMapEncodeTiled(&(tmap),CU_TENSOR_MAP_DATA_TYPE_FLOAT32,4,d_u,{u_vec->size[3], u_vec->size[2], u_vec->size[1], u_vec->size[0]},{sizeof(float)*u_vec->size[3], sizeof(float)*u_vec->size[2]*u_vec->size[3], sizeof(float)*u_vec->size[1]*u_vec->size[2]*u_vec->size[3]});
340+
341+
foo(tmap);
342+
}"""
343+
344+
299345
def test_cpp_local_object():
300346
"""
301347
Test C++ support for LocalObjects.

0 commit comments

Comments
 (0)