Skip to content

Commit 8185a5e

Browse files
committed
compiler: cleanup default includes/header/namespaces
1 parent 43da5a2 commit 8185a5e

File tree

18 files changed

+299
-108
lines changed

18 files changed

+299
-108
lines changed

devito/arch/archinfo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ def cbk(deviceid=0):
377377
gpu_info = homogenise_gpus(list(gpu_infos.values()))
378378

379379
# Also attach callbacks to retrieve instantaneous memory info
380-
# Now this should be done use xpu-smi but for some reason
380+
# Now this should be done using xpu-smi but for some reason
381381
# it throws a lot of weird errors in docker so skipping for now
382382
for i in ['total', 'free', 'used']:
383383
def make_cbk(i):

devito/core/__init__.py

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,33 @@
11
from devito.arch import Cpu64, Intel64, Arm, Power, Device
2-
from devito.core.cpu import (Cpu64NoopCOperator, Cpu64NoopOmpOperator,
3-
Cpu64AdvCOperator, Cpu64AdvOmpOperator,
4-
Cpu64FsgCOperator, Cpu64FsgOmpOperator,
5-
Cpu64CustomOperator, Cpu64CustomCXXOperator,
6-
Cpu64CXXNoopCOperator, Cpu64CXXNoopOmpOperator,
7-
Cpu64AdvCXXOperator, Cpu64AdvCXXOmpOperator,
8-
Cpu64FsgCXXOperator, Cpu64FsgCXXOmpOperator)
9-
10-
from devito.core.intel import (Intel64AdvCOperator, Intel64AdvOmpOperator,
11-
Intel64FsgCOperator, Intel64FsgOmpOperator,
12-
Intel64CXXAdvCOperator, Intel64AdvCXXOmpOperator,
13-
Intel64FsgCXXOperator, Intel64FsgCXXOmpOperator)
14-
from devito.core.arm import (ArmAdvCOperator, ArmAdvOmpOperator,
15-
ArmAdvCXXOperator, ArmAdvCXXOmpOperator)
16-
from devito.core.power import (PowerAdvCOperator, PowerAdvOmpOperator,
17-
PowerCXXAdvCOperator, PowerAdvCXXOmpOperator)
18-
from devito.core.gpu import (DeviceNoopOmpOperator, DeviceNoopAccOperator,
19-
DeviceAdvOmpOperator, DeviceAdvAccOperator,
20-
DeviceFsgOmpOperator, DeviceFsgAccOperator,
21-
DeviceCustomOmpOperator, DeviceCustomAccOperator)
2+
from devito.core.cpu import (
3+
Cpu64NoopCOperator, Cpu64NoopOmpOperator,
4+
Cpu64AdvCOperator, Cpu64AdvOmpOperator,
5+
Cpu64FsgCOperator, Cpu64FsgOmpOperator,
6+
Cpu64CustomOperator, Cpu64CustomCXXOperator,
7+
Cpu64CXXNoopCOperator, Cpu64CXXNoopOmpOperator,
8+
Cpu64AdvCXXOperator, Cpu64AdvCXXOmpOperator,
9+
Cpu64FsgCXXOperator, Cpu64FsgCXXOmpOperator
10+
)
11+
from devito.core.intel import (
12+
Intel64AdvCOperator, Intel64AdvOmpOperator,
13+
Intel64FsgCOperator, Intel64FsgOmpOperator,
14+
Intel64CXXAdvCOperator, Intel64AdvCXXOmpOperator,
15+
Intel64FsgCXXOperator, Intel64FsgCXXOmpOperator
16+
)
17+
from devito.core.arm import (
18+
ArmAdvCOperator, ArmAdvOmpOperator,
19+
ArmAdvCXXOperator, ArmAdvCXXOmpOperator
20+
)
21+
from devito.core.power import (
22+
PowerAdvCOperator, PowerAdvOmpOperator,
23+
PowerCXXAdvCOperator, PowerAdvCXXOmpOperator
24+
)
25+
from devito.core.gpu import (
26+
DeviceNoopOmpOperator, DeviceNoopAccOperator,
27+
DeviceAdvOmpOperator, DeviceAdvAccOperator,
28+
DeviceFsgOmpOperator, DeviceFsgAccOperator,
29+
DeviceCustomOmpOperator, DeviceCustomAccOperator
30+
)
2231
from devito.operator.registry import operator_registry
2332

2433
# Register CPU Operators

devito/ir/cgen/printer.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ class BasePrinter(CodePrinter):
4949

5050
_restrict_keyword = 'restrict'
5151

52-
_default_includes = []
52+
_includes = []
53+
54+
_namespaces = []
55+
56+
_headers = [('_POSIX_C_SOURCE', '200809L')]
5357

5458
@property
5559
def dtype(self):

devito/ir/iet/visitors.py

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -649,8 +649,7 @@ def visit_HaloSpot(self, o):
649649

650650
def visit_KernelLaunch(self, o):
651651
if o.templates:
652-
ctemplates = ','.join([str(i) for i in o.templates])
653-
templates = f'<{ctemplates}>'
652+
templates = f"<{','.join([str(i) for i in o.templates])}>"
654653
else:
655654
templates = ''
656655

@@ -669,8 +668,29 @@ def visit_KernelLaunch(self, o):
669668
# Operator-handle machinery
670669

671670
def _operator_includes(self, o):
671+
"""
672+
Generate cgen includes from an iterable of symbols and expressions.
673+
"""
672674
return [c.Include(i, system=(False if i.endswith('.h') else True))
673-
for i in o._includes]
675+
for i in o.includes] + [blankline]
676+
677+
def _operator_namespaces(self, o):
678+
"""
679+
Generate cgen namespaces from an iterable of symbols and expressions.
680+
"""
681+
namespaces = [self._visit(i) for i in o.namespaces]
682+
if namespaces:
683+
namespaces.append(blankline)
684+
return namespaces
685+
686+
def _operator_headers(self, o):
687+
"""
688+
Generate cgen headers from an iterable of symbols and expressions.
689+
"""
690+
headers = [c.Define(*as_tuple(i)) for i in o.headers]
691+
if headers:
692+
headers.append(blankline)
693+
return headers
674694

675695
def _operator_typedecls(self, o, mode='all'):
676696
xfilter0 = lambda i: self._gen_struct_decl(i) is not None
@@ -728,22 +748,13 @@ def visit_Operator(self, o, mode='all'):
728748
efuncs.extend([self._visit(i), blankline])
729749

730750
# Definitions
731-
headers = []
732-
for h in o._headers:
733-
try:
734-
headers.append(c.Define(*h))
735-
except TypeError:
736-
# Plain string
737-
headers.append(c.Line(h))
738-
headers = headers + [blankline]
751+
headers = self._operator_headers(o)
739752

740753
# Header files
741-
includes = self._operator_includes(o) + [blankline]
754+
includes = self._operator_includes(o)
742755

743756
# Namespaces
744-
namespaces = [self._visit(i) for i in o._namespaces]
745-
if namespaces:
746-
namespaces.append(blankline)
757+
namespaces = self._operator_namespaces(o)
747758

748759
# Type declarations
749760
typedecls = self._operator_typedecls(o, mode)
@@ -1003,8 +1014,8 @@ def _defines_aliases(n):
10031014
rules = {
10041015
'symbolics': lambda n: n.functions,
10051016
'basics': lambda n: [i for i in n.expr_symbols if isinstance(i, Basic)],
1006-
'abstractsymbols': lambda n: [i for i in n.expr_symbols
1007-
if isinstance(i, AbstractSymbol)],
1017+
'symbols': lambda n: [i for i in n.expr_symbols
1018+
if isinstance(i, AbstractSymbol)],
10081019
'dimensions': lambda n: [i for i in n.expr_symbols if isinstance(i, Dimension)],
10091020
'indexeds': lambda n: [i for i in n.expr_symbols if i.is_Indexed],
10101021
'indexedbases': lambda n: [i for i in n.expr_symbols

devito/operator/operator.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,6 @@ class Operator(Callable):
144144
refer to the relevant documentation.
145145
"""
146146

147-
_default_headers = [('_POSIX_C_SOURCE', '200809L')]
148-
_default_globals = []
149-
_default_namespaces = []
150-
151147
def __new__(cls, expressions, **kwargs):
152148
if expressions is None:
153149
# Return a dummy Callable. This is exploited by unpickling. Users
@@ -194,11 +190,6 @@ def _sanitize_exprs(cls, expressions, **kwargs):
194190

195191
return expressions
196192

197-
@classmethod
198-
@property
199-
def _default_includes(cls):
200-
return cls._Target.Printer._default_includes
201-
202193
@classmethod
203194
def _build(cls, expressions, **kwargs):
204195
# Python- (i.e., compile-) and C-level (i.e., run-time) performance
@@ -212,15 +203,11 @@ def _build(cls, expressions, **kwargs):
212203
Callable.__init__(op, **op.args)
213204

214205
# Header files, etc.
215-
op._headers = OrderedSet(*cls._default_headers)
216-
op._headers.update(byproduct.headers)
217-
op._globals = OrderedSet(*cls._default_globals)
218-
op._globals.update(byproduct.globals)
219-
op._includes = OrderedSet(*cls._default_includes)
220-
op._includes.update(profiler._default_includes)
206+
op._headers = OrderedSet(*byproduct.headers)
207+
op._globals = OrderedSet(*byproduct.globals)
208+
op._includes = OrderedSet(*profiler._default_includes)
221209
op._includes.update(byproduct.includes)
222-
op._namespaces = OrderedSet(*cls._default_namespaces)
223-
op._namespaces.update(byproduct.namespaces)
210+
op._namespaces = OrderedSet(*byproduct.namespaces)
224211

225212
# Required for the jit-compilation
226213
op._compiler = kwargs['compiler']
@@ -273,6 +260,9 @@ def _lower(cls, expressions, **kwargs):
273260
"""
274261
# Create a symbol registry
275262
kwargs.setdefault('sregistry', SymbolRegistry())
263+
# Add lang-base kwargs
264+
kwargs.setdefault('lang', cls._Target.lang())
265+
kwargs.setdefault('printer', cls._Target.Printer)
276266

277267
expressions = as_tuple(expressions)
278268

@@ -480,7 +470,6 @@ def _lower_iet(cls, uiet, profiler=None, **kwargs):
480470
* Finalize (e.g., symbol definitions, array casts)
481471
"""
482472
name = kwargs.get("name", "Kernel")
483-
lang = cls._Target.lang()
484473

485474
# Wrap the IET with an EntryFunction (a special Callable representing
486475
# the entry point of the generated library)
@@ -497,10 +486,10 @@ def _lower_iet(cls, uiet, profiler=None, **kwargs):
497486
cls._Target.instrument(graph, profiler=profiler, **kwargs)
498487

499488
# Extract the necessary macros from the symbolic objects
500-
generate_macros(graph, lang=lang, printer=cls._Target.Printer, **kwargs)
489+
generate_macros(graph, **kwargs)
501490

502491
# Add type specific metadata
503-
lower_dtypes(graph, lang=lang, **kwargs)
492+
lower_dtypes(graph, **kwargs)
504493

505494
# Target-independent optimizations
506495
minimize_symbols(graph)
@@ -779,6 +768,18 @@ def _soname(self):
779768
def _printer(self):
780769
return self._Target.Printer
781770

771+
@cached_property
772+
def headers(self):
773+
return OrderedSet(*self._printer._headers).union(self._headers)
774+
775+
@cached_property
776+
def includes(self):
777+
return OrderedSet(*self._printer._includes).union(self._includes)
778+
779+
@cached_property
780+
def namespaces(self):
781+
return OrderedSet(*self._printer._namespaces).union(self._namespaces)
782+
782783
@cached_property
783784
def ccode(self):
784785
from devito.ir.iet.visitors import CGen

devito/passes/clusters/cse.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@ def cse(cluster, sregistry=None, options=None, **kwargs):
7070
"""
7171
min_cost = options['cse-min-cost']
7272
mode = options['cse-algo']
73-
mindtype = np.promote_types(options['scalar-min-type'], cluster.dtype).type
73+
dtype = np.promote_types(options['scalar-min-type'], cluster.dtype).type
7474

7575
if cluster.is_fence:
7676
return cluster
7777

78-
make = lambda: CTemp(name=sregistry.make_name(), dtype=mindtype)
78+
make = lambda: CTemp(name=sregistry.make_name(), dtype=dtype)
7979

8080
exprs = _cse(cluster, make, min_cost=min_cost, mode=mode)
8181

devito/passes/iet/languages/C.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
class CBB(LangBB):
1414

1515
mapper = {
16+
# Complex
17+
'includes-complex': 'complex.h',
18+
# Allocs
1619
'header-memcpy': 'string.h',
1720
'host-alloc': lambda i, j, k:
1821
Call('posix_memalign', (i, j, k)),
@@ -24,8 +27,6 @@ class CBB(LangBB):
2427
Call('free', (i,)),
2528
'alloc-global-symbol': lambda i, j, k:
2629
Call('memcpy', (i, j, k)),
27-
# Complex
28-
'includes-complex': 'complex.h',
2930
}
3031

3132

@@ -44,7 +45,7 @@ class CPrinter(BasePrinter, C99CodePrinter):
4445
_func_litterals = {np.float32: 'f', np.complex64: 'f'}
4546
_func_prefix = {np.float32: 'f', np.float64: 'f',
4647
np.complex64: 'c', np.complex128: 'c'}
47-
_default_includes = ['stdlib.h', 'math.h', 'sys/time.h']
48+
_includes = ['stdlib.h', 'math.h', 'sys/time.h']
4849

4950
# These cannot go through _print_xxx because they are classes not
5051
# instances

devito/passes/iet/languages/CXX.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ def std_arith(qualifier=None):
6363
class CXXBB(LangBB):
6464

6565
mapper = {
66+
# Complex
67+
'includes-complex': 'complex',
68+
'complex-namespace': [UsingNamespace('std::complex_literals')],
69+
'def-complex': std_arith(),
70+
# Allocs
6671
'header-memcpy': 'string.h',
6772
'header-algorithm': 'algorithm',
6873
'host-alloc': lambda i, j, k:
@@ -75,10 +80,6 @@ class CXXBB(LangBB):
7580
Call('free', (i,)),
7681
'alloc-global-symbol': lambda i, j, k:
7782
Call('memcpy', (i, j, k)),
78-
# Complex
79-
'includes-complex': 'complex',
80-
'complex-namespace': [UsingNamespace('std::complex_literals')],
81-
'def-complex': std_arith(),
8283
}
8384

8485

@@ -90,7 +91,7 @@ class CXXPrinter(BasePrinter, CXX11CodePrinter):
9091
_func_litterals = {}
9192
_func_prefix = {np.float32: 'f', np.float64: 'f'}
9293
_restrict_keyword = '__restrict'
93-
_default_includes = ['stdlib.h', 'cmath', 'sys/time.h']
94+
_includes = ['stdlib.h', 'cmath', 'sys/time.h']
9495

9596
# These cannot go through _print_xxx because they are classes not
9697
# instances

devito/passes/iet/languages/targets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def lang(cls):
2323

2424
@classmethod
2525
def instrument(cls, *args, **kwargs):
26-
instrument(*args, lang=cls.lang(), **kwargs)
26+
instrument(*args, **kwargs)
2727

2828

2929
class CTarget(Target):

devito/symbolics/inspection.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ def wrapper(expr, estimate, seen):
144144
def _estimate_cost(expr, estimate, seen):
145145
# Retval: flops (int), flag (bool)
146146
# The flag tells wether it's an integer expression (implying flops==0) or not
147+
if not expr.args:
148+
return 0, False
147149
flops, flags = zip(*[_estimate_cost(a, estimate, seen) for a in expr.args])
148150
flops = sum(flops)
149151
if all(flags):

0 commit comments

Comments
 (0)