Skip to content

Commit 4692baa

Browse files
Merge pull request #1017 from vmickus/fix/using-func_table-ops
Replace _ops_kernels by _func_table in OPS
2 parents 17058b2 + 0da449f commit 4692baa

3 files changed

Lines changed: 13 additions & 9 deletions

File tree

‎devito/ops/operator.py‎

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from devito import Eq
22
from devito.ir.equations import ClusterizedEq
3-
from devito.ir.iet import Call, Expression, List, derive_parameters, find_affine_trees
3+
from devito.ir.iet import (Call, Expression, List, MetaCall, derive_parameters,
4+
find_affine_trees)
45
from devito.ir.iet.visitors import FindSymbols, Transformer
56
from devito.logger import warning
67
from devito.operator import Operator
@@ -26,7 +27,6 @@ class OperatorOPS(Operator):
2627
_default_headers = Operator._default_headers + ['#define restrict __restrict']
2728

2829
def __init__(self, *args, **kwargs):
29-
self._ops_kernels = []
3030
super(OperatorOPS, self).__init__(*args, **kwargs)
3131
self._compiler = ops_configuration['compiler'].copy()
3232

@@ -88,7 +88,8 @@ def _specialize_iet(self, iet, **kwargs):
8888
)
8989

9090
pre_time_loop.extend(pre_loop)
91-
self._ops_kernels.append(ops_kernel)
91+
self._func_table[namespace['ops_kernel_file'](ops_kernel.name)] = \
92+
MetaCall(ops_kernel, False)
9293
mapper[tree[0].root] = ops_par_loop_call
9394
mapper.update({i.root: mapper.get(i.root) for i in tree}) # Drop trees
9495

@@ -108,13 +109,13 @@ def _specialize_iet(self, iet, **kwargs):
108109

109110
@property
110111
def hcode(self):
111-
return ''.join(str(kernel) for kernel in self._ops_kernels)
112+
return ''.join(str(kernel.root) for kernel in self._func_table.values())
112113

113114
def _finalize(self, iet, parameters):
114-
# Applies _finalize for each generated OPS kernel, which will generate the .h file
115-
self._ops_kernels = [super(OperatorOPS, self)._finalize(
116-
kernel, derive_parameters(kernel, True))
117-
for kernel in self._ops_kernels]
115+
for k, v in self._func_table.items():
116+
parameters = derive_parameters(v.root, True)
117+
root = super(OperatorOPS, self)._finalize(v.root, parameters)
118+
self._func_table[k] = MetaCall(root, v.local)
118119

119120
return super()._finalize(iet, parameters)
120121

‎devito/ops/utils.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,5 @@
5050
namespace['ops_dat_d_p'] = lambda i: '%s_d_p' % i
5151
namespace['ops_dat_d_m'] = lambda i: '%s_d_m' % i
5252
namespace['ops_dat_name'] = lambda i: '%s_dat' % i
53+
54+
namespace['ops_kernel_file'] = lambda i: 'ops_kernel_%s' % i

‎tests/test_ops.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ def test_kernel_generation(self, equation, expected):
8686

8787
operator = Operator(eval(equation))
8888

89-
assert str(operator._ops_kernels[0]) == expected
89+
for func in operator._func_table.values():
90+
assert str(func.root) == expected
9091

9192
@pytest.mark.parametrize('equation, expected', [
9293
('Eq(u,3*a - 4**a)', '{ "ut0": [[0]] }'),

0 commit comments

Comments
 (0)