Skip to content

Commit 4899f11

Browse files
committed
compiler: add all cxx target to operator registry
1 parent c515253 commit 4899f11

24 files changed

Lines changed: 239 additions & 124 deletions

devito/arch/compiler.py

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ def __init__(self):
180180
"""
181181

182182
fields = {'cc', 'ld'}
183-
_cpp = False
183+
default_cpp = False
184184

185185
def __init__(self, **kwargs):
186186
_name = kwargs.pop('name', self.__class__.__name__)
@@ -191,6 +191,7 @@ def __init__(self, **kwargs):
191191
super().__init__(**kwargs)
192192

193193
self.__lookup_cmds__()
194+
self._cpp = kwargs.get('cpp', self.default_cpp)
194195

195196
self.suffix = kwargs.get('suffix')
196197
if not kwargs.get('mpi'):
@@ -200,7 +201,7 @@ def __init__(self, **kwargs):
200201
self.cc = self.MPICC if self._cpp is False else self.MPICXX
201202
self.ld = self.cc # Wanted by the superclass
202203

203-
self.cflags = ['-O3', '-g', '-fPIC', '-Wall', '-std=c99']
204+
self.cflags = ['-O3', '-g', '-fPIC', '-Wall', f'-std={self.std}']
204205
self.ldflags = ['-shared']
205206

206207
self.include_dirs = []
@@ -252,6 +253,10 @@ def version(self):
252253

253254
return version
254255

256+
@property
257+
def std(self):
258+
return 'c++14' if self._cpp else 'c99'
259+
255260
def get_version(self):
256261
result, stdout, stderr = call_capture_output((self.cc, "--version"))
257262
if result != 0:
@@ -486,16 +491,16 @@ def __init_finalize__(self, **kwargs):
486491
language = kwargs.pop('language', configuration['language'])
487492
platform = kwargs.pop('platform', configuration['platform'])
488493

489-
if isinstance(platform, NvidiaDevice):
490-
self.cflags.remove('-std=c99')
494+
if platform is NVIDIAX:
495+
self.cflags.remove(f'-std={self.std}')
491496
# Add flags for OpenMP offloading
492497
if language in ['C', 'openmp']:
493498
cc = get_nvidia_cc()
494499
if cc:
495500
self.cflags += ['-Xopenmp-target', f'-march=sm_{cc}']
496501
self.ldflags += ['-fopenmp', '-fopenmp-targets=nvptx64-nvidia-cuda']
497502
elif platform is AMDGPUX:
498-
self.cflags.remove('-std=c99')
503+
self.cflags.remove(f'-std={self.std}')
499504
# Add flags for OpenMP offloading
500505
if language in ['C', 'openmp']:
501506
self.ldflags += ['-target', 'x86_64-pc-linux-gnu']
@@ -558,9 +563,9 @@ def __init_finalize__(self, **kwargs):
558563
self.ldflags += ['-fopenmp']
559564

560565
if isinstance(platform, NvidiaDevice):
561-
self.cflags.remove('-std=c99')
566+
self.cflags.remove(f'-std={self.std}')
562567
elif platform is AMDGPUX:
563-
self.cflags.remove('-std=c99')
568+
self.cflags.remove(f'-std={self.std}')
564569
# Add flags for OpenMP offloading
565570
if language in ['C', 'openmp']:
566571
self.ldflags += ['-target', 'x86_64-pc-linux-gnu']
@@ -595,15 +600,15 @@ def __lookup_cmds__(self):
595600

596601
class PGICompiler(Compiler):
597602

598-
_cpp = True
603+
default_cpp = True
599604

600605
def __init_finalize__(self, **kwargs):
601606

602-
self.cflags.remove('-std=c99')
607+
self.cflags.remove(f'-std={self.std}')
603608
self.cflags.remove('-O3')
604609
self.cflags.remove('-Wall')
605610

606-
self.cflags.append('-std=c++14')
611+
self.cflags.append(f'-std={self.std}')
607612

608613
language = kwargs.pop('language', configuration['language'])
609614
platform = kwargs.pop('platform', configuration['platform'])
@@ -648,14 +653,14 @@ def __lookup_cmds__(self):
648653

649654
class CudaCompiler(Compiler):
650655

651-
_cpp = True
656+
default_cpp = True
652657

653658
def __init_finalize__(self, **kwargs):
654659

655-
self.cflags.remove('-std=c99')
660+
self.cflags.remove(f'-std={self.std}')
656661
self.cflags.remove('-Wall')
657662
self.cflags.remove('-fPIC')
658-
self.cflags.extend(['-std=c++14', '-Xcompiler', '-fPIC'])
663+
self.cflags.extend([f'-std={self.std}', '-Xcompiler', '-fPIC'])
659664

660665
if configuration['mpi']:
661666
# We rather use `nvcc` to compile MPI, but for this we have to
@@ -722,14 +727,14 @@ def __lookup_cmds__(self):
722727

723728
class HipCompiler(Compiler):
724729

725-
_cpp = True
730+
default_cpp = True
726731

727732
def __init_finalize__(self, **kwargs):
728733

729-
self.cflags.remove('-std=c99')
734+
self.cflags.remove(f'-std={self.std}')
730735
self.cflags.remove('-Wall')
731736
self.cflags.remove('-fPIC')
732-
self.cflags.extend(['-std=c++14', '-fPIC'])
737+
self.cflags.extend([f'-std={self.std}', '-fPIC'])
733738

734739
if configuration['mpi']:
735740
# We rather use `hipcc` to compile MPI, but for this we have to
@@ -883,7 +888,7 @@ def __lookup_cmds__(self):
883888

884889
class SyclCompiler(OneapiCompiler):
885890

886-
_cpp = True
891+
default_cpp = True
887892

888893
def __init_finalize__(self, **kwargs):
889894
IntelCompiler.__init_finalize__(self, **kwargs)
@@ -894,7 +899,7 @@ def __init_finalize__(self, **kwargs):
894899
if language != 'sycl':
895900
warning("Expected language sycl with SyclCompiler")
896901

897-
self.cflags.remove('-std=c99')
902+
self.cflags.remove(f'-std={self.std}')
898903
self.cflags.append('-fsycl')
899904

900905
self.cflags.remove('-g') # -g disables some optimizations in IGC
@@ -950,7 +955,7 @@ def __new__(cls, *args, **kwargs):
950955
obj = super().__new__(cls)
951956
# Keep base to initialize accordingly
952957
obj._base = kwargs.pop('base', _base)
953-
obj._cpp = obj._base._cpp
958+
obj.default_cpp = obj._base.default_cpp
954959

955960
return obj
956961

devito/core/__init__.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,19 @@
22
from devito.core.cpu import (Cpu64NoopCOperator, Cpu64NoopOmpOperator,
33
Cpu64AdvCOperator, Cpu64AdvOmpOperator,
44
Cpu64FsgCOperator, Cpu64FsgOmpOperator,
5-
Cpu64CustomOperator)
5+
Cpu64CustomOperator, Cpu64CXXCustomOperator,
6+
Cpu64CXXNoopCOperator, Cpu64CXXNoopOmpOperator,
7+
Cpu64AdvCXXOperator, Cpu64CXXAdvOmpOperator,
8+
Cpu64CXXFsgCOperator, Cpu64CXXFsgOmpOperator)
9+
610
from devito.core.intel import (Intel64AdvCOperator, Intel64AdvOmpOperator,
7-
Intel64FsgCOperator, Intel64FsgOmpOperator)
8-
from devito.core.arm import ArmAdvCOperator, ArmAdvOmpOperator
9-
from devito.core.power import PowerAdvCOperator, PowerAdvOmpOperator
11+
Intel64FsgCOperator, Intel64FsgOmpOperator,
12+
Intel64CXXAdvCOperator, Intel64CXXAdvOmpOperator,
13+
Intel64CXXFsgCOperator, Intel64CXXFsgOmpOperator)
14+
from devito.core.arm import (ArmAdvCOperator, ArmAdvOmpOperator,
15+
ArmCXXAdvCOperator, ArmCXXAdvOmpOperator)
16+
from devito.core.power import (PowerAdvCOperator, PowerAdvOmpOperator,
17+
PowerCXXAdvCOperator, PowerCXXAdvOmpOperator)
1018
from devito.core.gpu import (DeviceNoopOmpOperator, DeviceNoopAccOperator,
1119
DeviceAdvOmpOperator, DeviceAdvAccOperator,
1220
DeviceFsgOmpOperator, DeviceFsgAccOperator,
@@ -16,26 +24,43 @@
1624
# Register CPU Operators
1725
operator_registry.add(Cpu64CustomOperator, Cpu64, 'custom', 'C')
1826
operator_registry.add(Cpu64CustomOperator, Cpu64, 'custom', 'openmp')
27+
operator_registry.add(Cpu64CXXCustomOperator, Cpu64, 'custom', 'CXX')
28+
operator_registry.add(Cpu64CXXCustomOperator, Cpu64, 'custom', 'CXXopenmp')
1929

2030
operator_registry.add(Cpu64NoopCOperator, Cpu64, 'noop', 'C')
2131
operator_registry.add(Cpu64NoopOmpOperator, Cpu64, 'noop', 'openmp')
32+
operator_registry.add(Cpu64CXXNoopCOperator, Cpu64, 'noop', 'CXX')
33+
operator_registry.add(Cpu64CXXNoopOmpOperator, Cpu64, 'noop', 'CXXopenmp')
2234

2335
operator_registry.add(Cpu64AdvCOperator, Cpu64, 'advanced', 'C')
2436
operator_registry.add(Cpu64AdvOmpOperator, Cpu64, 'advanced', 'openmp')
37+
operator_registry.add(Cpu64AdvCXXOperator, Cpu64, 'advanced', 'CXX')
38+
operator_registry.add(Cpu64CXXAdvOmpOperator, Cpu64, 'advanced', 'CXXopenmp')
2539

2640
operator_registry.add(Cpu64FsgCOperator, Cpu64, 'advanced-fsg', 'C')
2741
operator_registry.add(Cpu64FsgOmpOperator, Cpu64, 'advanced-fsg', 'openmp')
42+
operator_registry.add(Cpu64CXXFsgCOperator, Cpu64, 'advanced-fsg', 'CXX')
43+
operator_registry.add(Cpu64CXXFsgOmpOperator, Cpu64, 'advanced-fsg', 'CXXopenmp')
2844

2945
operator_registry.add(Intel64AdvCOperator, Intel64, 'advanced', 'C')
3046
operator_registry.add(Intel64AdvOmpOperator, Intel64, 'advanced', 'openmp')
47+
operator_registry.add(Intel64CXXAdvCOperator, Intel64, 'advanced', 'CXX')
48+
operator_registry.add(Intel64CXXAdvOmpOperator, Intel64, 'advanced', 'CXXopenmp')
49+
3150
operator_registry.add(Intel64FsgCOperator, Intel64, 'advanced-fsg', 'C')
3251
operator_registry.add(Intel64FsgOmpOperator, Intel64, 'advanced-fsg', 'openmp')
52+
operator_registry.add(Intel64CXXFsgCOperator, Intel64, 'advanced-fsg', 'CXX')
53+
operator_registry.add(Intel64CXXFsgOmpOperator, Intel64, 'advanced-fsg', 'CXXopenmp')
3354

3455
operator_registry.add(ArmAdvCOperator, Arm, 'advanced', 'C')
3556
operator_registry.add(ArmAdvOmpOperator, Arm, 'advanced', 'openmp')
57+
operator_registry.add(ArmCXXAdvCOperator, Arm, 'advanced', 'CXX')
58+
operator_registry.add(ArmCXXAdvOmpOperator, Arm, 'advanced', 'CXXopenmp')
3659

3760
operator_registry.add(PowerAdvCOperator, Power, 'advanced', 'C')
3861
operator_registry.add(PowerAdvOmpOperator, Power, 'advanced', 'openmp')
62+
operator_registry.add(PowerCXXAdvCOperator, Power, 'advanced', 'CXX')
63+
operator_registry.add(PowerCXXAdvOmpOperator, Power, 'advanced', 'CXXopenmp')
3964

4065
# Register Device Operators
4166
operator_registry.add(DeviceCustomOmpOperator, Device, 'custom', 'C')

devito/core/arm.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
1-
from devito.core.cpu import Cpu64AdvOperator
2-
from devito.passes.iet import CTarget, OmpTarget
1+
from devito.core.cpu import (Cpu64AdvOperator, Cpu64AdvCXXOperator,
2+
Cpu64AdvCOperator)
3+
from devito.passes.iet import OmpTarget, CXXOmpTarget
34

4-
__all__ = ['ArmAdvCOperator', 'ArmAdvOmpOperator']
5+
__all__ = ['ArmAdvCOperator', 'ArmAdvOmpOperator', 'ArmCXXAdvCOperator',
6+
'ArmCXXAdvOmpOperator']
57

68

7-
class ArmAdvOperator(Cpu64AdvOperator):
8-
pass
9+
ArmAdvOperator = Cpu64AdvOperator
10+
ArmAdvCOperator = Cpu64AdvCOperator
11+
ArmCXXAdvOperator = Cpu64AdvCXXOperator
12+
ArmCXXAdvCOperator = Cpu64AdvCXXOperator
913

1014

11-
class ArmAdvCOperator(ArmAdvOperator):
12-
_Target = CTarget
13-
14-
15-
class ArmAdvOmpOperator(ArmAdvOperator):
15+
class ArmAdvOmpOperator(ArmAdvCOperator):
1616
_Target = OmpTarget
1717

1818
# Avoid nested parallelism on ThunderX2
1919
PAR_NESTED = 4
20+
21+
22+
class ArmCXXAdvOmpOperator(ArmAdvOmpOperator):
23+
_Target = CXXOmpTarget
24+
LINEARIZE = True

devito/core/cpu.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def _normalize_kwargs(cls, **kwargs):
7878

7979
# Misc
8080
o['opt-comms'] = oo.pop('opt-comms', True)
81-
o['linearize'] = oo.pop('linearize', False)
81+
o['linearize'] = oo.pop('linearize', cls.LINEARIZE)
8282
o['mapify-reduce'] = oo.pop('mapify-reduce', cls.MAPIFY_REDUCE)
8383
o['index-mode'] = oo.pop('index-mode', cls.INDEX_MODE)
8484
o['place-transfers'] = oo.pop('place-transfers', True)
@@ -318,28 +318,63 @@ def _make_iet_passes_mapper(cls, **kwargs):
318318
assert not (set(_known_passes) & set(_known_passes_disabled))
319319

320320

321+
class Cpu64CXXCustomOperator(Cpu64CustomOperator):
322+
323+
_Target = CXXTarget
324+
LINEARIZE = True
325+
321326
# Language level
322327

323328

324329
class Cpu64NoopCOperator(Cpu64NoopOperator):
325330
_Target = CTarget
326331

327332

333+
class Cpu64CXXNoopCOperator(Cpu64NoopOperator):
334+
_Target = CXXTarget
335+
LINEARIZE = True
336+
337+
328338
class Cpu64NoopOmpOperator(Cpu64NoopOperator):
329339
_Target = COmpTarget
330340

331341

342+
class Cpu64CXXNoopOmpOperator(Cpu64NoopOperator):
343+
_Target = CXXOmpTarget
344+
LINEARIZE = True
345+
346+
332347
class Cpu64AdvCOperator(Cpu64AdvOperator):
333348
_Target = CTarget
334349

335350

351+
class Cpu64AdvCXXOperator(Cpu64AdvOperator):
352+
_Target = CXXTarget
353+
LINEARIZE = True
354+
355+
336356
class Cpu64AdvOmpOperator(Cpu64AdvOperator):
337357
_Target = COmpTarget
338358

339359

360+
class Cpu64CXXAdvOmpOperator(Cpu64AdvOperator):
361+
_Target = CXXOmpTarget
362+
LINEARIZE = True
363+
364+
340365
class Cpu64FsgCOperator(Cpu64FsgOperator):
341366
_Target = CTarget
342367

343368

369+
class Cpu64CXXFsgCOperator(Cpu64FsgOperator):
370+
_Target = CXXTarget
371+
LINEARIZE = True
372+
373+
344374
class Cpu64FsgOmpOperator(Cpu64FsgOperator):
345375
_Target = COmpTarget
376+
377+
378+
class Cpu64CXXFsgOmpOperator(Cpu64FsgOperator):
379+
_Target = CXXOmpTarget
380+
LINEARIZE = True

devito/core/intel.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
from devito.core.cpu import (Cpu64AdvCOperator, Cpu64AdvOmpOperator,
2-
Cpu64FsgCOperator, Cpu64FsgOmpOperator)
2+
Cpu64FsgCOperator, Cpu64FsgOmpOperator,
3+
Cpu64AdvCXXOperator, Cpu64CXXAdvOmpOperator,
4+
Cpu64CXXFsgCOperator, Cpu64CXXFsgOmpOperator)
35

46
__all__ = ['Intel64AdvCOperator', 'Intel64AdvOmpOperator', 'Intel64FsgCOperator',
5-
'Intel64FsgOmpOperator']
7+
'Intel64FsgOmpOperator', 'Intel64CXXAdvCOperator', 'Intel64CXXAdvOmpOperator',
8+
'Intel64CXXFsgCOperator', 'Intel64CXXFsgOmpOperator']
69

710

811
Intel64AdvCOperator = Cpu64AdvCOperator
912
Intel64AdvOmpOperator = Cpu64AdvOmpOperator
1013
Intel64FsgCOperator = Cpu64FsgCOperator
1114
Intel64FsgOmpOperator = Cpu64FsgOmpOperator
15+
Intel64CXXAdvCOperator = Cpu64AdvCXXOperator
16+
Intel64CXXAdvOmpOperator = Cpu64CXXAdvOmpOperator
17+
Intel64CXXFsgCOperator = Cpu64CXXFsgCOperator
18+
Intel64CXXFsgOmpOperator = Cpu64CXXFsgOmpOperator

devito/core/operator.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ class BasicOperator(Operator):
143143
The target language constructor, to be specified by subclasses.
144144
"""
145145

146+
LINEARIZE = False
147+
"""
148+
Linearize n-dimensional Indexeds.
149+
"""
150+
146151
@classmethod
147152
def _normalize_kwargs(cls, **kwargs):
148153
# Will be populated with dummy values; this method is actually overriden

devito/core/power.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
from devito.core.cpu import Cpu64AdvCOperator, Cpu64AdvOmpOperator
1+
from devito.core.cpu import (Cpu64AdvCOperator, Cpu64AdvOmpOperator,
2+
Cpu64AdvCXXOperator, Cpu64CXXAdvOmpOperator)
23

3-
__all__ = ['PowerAdvCOperator', 'PowerAdvOmpOperator']
4+
__all__ = ['PowerAdvCOperator', 'PowerAdvOmpOperator',
5+
'PowerCXXAdvCOperator', 'PowerCXXAdvOmpOperator']
46

57
PowerAdvCOperator = Cpu64AdvCOperator
68
PowerAdvOmpOperator = Cpu64AdvOmpOperator
9+
PowerCXXAdvCOperator = Cpu64AdvCXXOperator
10+
PowerCXXAdvOmpOperator = Cpu64CXXAdvOmpOperator

devito/ir/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
from devito.ir.equations import * # noqa
33
from devito.ir.clusters import * # noqa
44
from devito.ir.iet import * # noqa
5-
from devito.ir.printer import * # noqa
5+
from devito.ir.cgen import * # noqa

0 commit comments

Comments
 (0)