Skip to content

Commit f61d4dd

Browse files
authored
compiler: Add PETSc language and printer (#67)
1 parent cccb988 commit f61d4dd

14 files changed

Lines changed: 248 additions & 169 deletions

File tree

conftest.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from devito.ir.iet import (FindNodes, FindSymbols, Iteration, ParallelBlock,
1515
retrieve_iteration_tree)
1616
from devito.tools import as_tuple
17-
from devito.petsc.utils import get_petsc_dir, get_petsc_arch
17+
from devito.petsc.utils import PetscOSError, get_petsc_dir
1818

1919
try:
2020
from mpi4py import MPI # noqa
@@ -95,18 +95,11 @@ def skipif(items, whole_module=False):
9595
skipit = "pyrevolve not installed"
9696
break
9797
if i == 'petsc':
98-
petsc_dir = get_petsc_dir()
99-
petsc_arch = get_petsc_arch()
100-
if petsc_dir is None or petsc_arch is None:
101-
skipit = "PETSC_DIR or PETSC_ARCH are not set"
98+
try:
99+
_ = get_petsc_dir()
100+
except PetscOSError:
101+
skipit = "PETSc is not installed"
102102
break
103-
else:
104-
petsc_installed = os.path.join(
105-
petsc_dir, petsc_arch, 'include', 'petscconf.h'
106-
)
107-
if not os.path.isfile(petsc_installed):
108-
skipit = "PETSc is not installed"
109-
break
110103

111104
if skipit is False:
112105
return pytest.mark.skipif(False, reason='')

devito/core/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
Cpu64CustomOperator, Cpu64CustomCXXOperator,
77
Cpu64CXXNoopCOperator, Cpu64CXXNoopOmpOperator,
88
Cpu64AdvCXXOperator, Cpu64AdvCXXOmpOperator,
9-
Cpu64FsgCXXOperator, Cpu64FsgCXXOmpOperator
9+
Cpu64FsgCXXOperator, Cpu64FsgCXXOmpOperator,
10+
Cpu64NoopPetscOperator, Cpu64AdvPetscOperator
1011
)
1112
from devito.core.intel import (
1213
Intel64AdvCOperator, Intel64AdvOmpOperator,
@@ -40,11 +41,13 @@
4041
operator_registry.add(Cpu64NoopOmpOperator, Cpu64, 'noop', 'openmp')
4142
operator_registry.add(Cpu64CXXNoopCOperator, Cpu64, 'noop', 'CXX')
4243
operator_registry.add(Cpu64CXXNoopOmpOperator, Cpu64, 'noop', 'CXXopenmp')
44+
operator_registry.add(Cpu64NoopPetscOperator, Cpu64, 'noop', 'petsc')
4345

4446
operator_registry.add(Cpu64AdvCOperator, Cpu64, 'advanced', 'C')
4547
operator_registry.add(Cpu64AdvOmpOperator, Cpu64, 'advanced', 'openmp')
4648
operator_registry.add(Cpu64AdvCXXOperator, Cpu64, 'advanced', 'CXX')
4749
operator_registry.add(Cpu64AdvCXXOmpOperator, Cpu64, 'advanced', 'CXXopenmp')
50+
operator_registry.add(Cpu64AdvPetscOperator, Cpu64, 'advanced', 'petsc')
4851

4952
operator_registry.add(Cpu64FsgCOperator, Cpu64, 'advanced-fsg', 'C')
5053
operator_registry.add(Cpu64FsgOmpOperator, Cpu64, 'advanced-fsg', 'openmp')

devito/core/cpu.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@
1111
from devito.passes.iet import (CTarget, CXXTarget, COmpTarget, CXXOmpTarget,
1212
avoid_denormals, linearize,
1313
mpiize, hoist_prodders, relax_incr_dimensions,
14-
check_stability)
14+
check_stability, PetscTarget)
1515
from devito.tools import timed_pass
1616

1717
__all__ = ['Cpu64NoopCOperator', 'Cpu64NoopOmpOperator', 'Cpu64AdvCOperator',
1818
'Cpu64AdvOmpOperator', 'Cpu64FsgCOperator', 'Cpu64FsgOmpOperator',
1919
'Cpu64CustomOperator', 'Cpu64CustomCXXOperator', 'Cpu64AdvCXXOperator',
20-
'Cpu64AdvCXXOmpOperator', 'Cpu64FsgCXXOperator', 'Cpu64FsgCXXOmpOperator']
20+
'Cpu64AdvCXXOmpOperator', 'Cpu64FsgCXXOperator', 'Cpu64FsgCXXOmpOperator',
21+
'Cpu64NoopPetscOperator']
2122

2223

2324
class Cpu64OperatorMixin:
@@ -346,6 +347,15 @@ class Cpu64CXXNoopOmpOperator(Cpu64NoopOperator):
346347
LINEARIZE = True
347348

348349

350+
class Cpu64NoopPetscOperator(Cpu64NoopOperator):
351+
_Target = PetscTarget
352+
353+
@classmethod
354+
def _rcompile_wrapper(cls, **kwargs0):
355+
kwargs0['language'] = 'petsc'
356+
return super()._rcompile_wrapper(**kwargs0)
357+
358+
349359
class Cpu64AdvCOperator(Cpu64AdvOperator):
350360
_Target = CTarget
351361

@@ -355,6 +365,15 @@ class Cpu64AdvCXXOperator(Cpu64AdvOperator):
355365
LINEARIZE = True
356366

357367

368+
class Cpu64AdvPetscOperator(Cpu64AdvOperator):
369+
_Target = PetscTarget
370+
371+
@classmethod
372+
def _rcompile_wrapper(cls, **kwargs0):
373+
kwargs0['language'] = 'petsc'
374+
return super()._rcompile_wrapper(**kwargs0)
375+
376+
358377
class Cpu64AdvOmpOperator(Cpu64AdvOperator):
359378
_Target = COmpTarget
360379

devito/operator/registry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class OperatorRegistry(OrderedDict, metaclass=Singleton):
2727

2828
_modes = ('noop', 'advanced', 'advanced-fsg')
2929
_languages = ('C', 'CXX', 'openmp', 'Copenmp', 'CXXopenmp',
30-
'openacc', 'cuda', 'hip', 'sycl')
30+
'openacc', 'cuda', 'hip', 'sycl', 'petsc')
3131
_accepted = _modes + tuple(product(_modes, _languages))
3232

3333
def add(self, operator, platform, mode, language='C'):

devito/passes/iet/languages/C.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from devito.passes.iet.orchestration import Orchestrator
77
from devito.passes.iet.langbase import LangBB
88
from devito.symbolics.extended_dtypes import c_complex, c_double_complex
9+
from devito.petsc.utils import petsc_type_mappings
910

1011
__all__ = ['CBB', 'CDataManager', 'COrchestrator']
1112

@@ -55,3 +56,9 @@ class CPrinter(BasePrinter, C99CodePrinter):
5556

5657
def _print_ImaginaryUnit(self, expr):
5758
return '_Complex_I'
59+
60+
61+
class PetscCPrinter(CPrinter):
62+
_restrict_keyword = ''
63+
64+
type_mappings = {**CPrinter.type_mappings, **petsc_type_mappings}

devito/passes/iet/languages/targets.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from devito.passes.iet.languages.C import CDataManager, COrchestrator, CPrinter
1+
from devito.passes.iet.languages.C import (CDataManager, COrchestrator, CPrinter,
2+
PetscCPrinter)
23
from devito.passes.iet.languages.CXX import CXXPrinter
34
from devito.passes.iet.languages.openmp import (SimdOmpizer, Ompizer, DeviceOmpizer,
45
OmpDataManager, DeviceOmpDataManager,
@@ -8,7 +9,7 @@
89
from devito.passes.iet.instrument import instrument
910

1011
__all__ = ['CTarget', 'OmpTarget', 'COmpTarget', 'DeviceOmpTarget', 'DeviceAccTarget',
11-
'CXXTarget', 'CXXOmpTarget', 'DeviceCXXOmpTarget']
12+
'CXXTarget', 'CXXOmpTarget', 'DeviceCXXOmpTarget', 'PetscTarget']
1213

1314

1415
class Target:
@@ -47,6 +48,10 @@ class COmpTarget(Target):
4748
Printer = CPrinter
4849

4950

51+
class PetscTarget(CTarget):
52+
Printer = PetscCPrinter
53+
54+
5055
OmpTarget = COmpTarget
5156

5257

devito/petsc/iet/passes.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
SubMatrixStruct, Initialize, Finalize, ArgvSymbol)
1818
from devito.petsc.types.macros import petsc_func_begin_user
1919
from devito.petsc.iet.nodes import PetscMetaData
20-
from devito.petsc.utils import core_metadata
20+
from devito.petsc.utils import core_metadata, petsc_languages
2121
from devito.petsc.iet.routines import (CBBuilder, CCBBuilder, BaseObjectBuilder,
2222
CoupledObjectBuilder, BaseSetup, CoupledSetup,
2323
Solver, CoupledSolver, TimeDependent,
@@ -34,6 +34,12 @@ def lower_petsc(iet, **kwargs):
3434
if not injectsolve_mapper:
3535
return iet, {}
3636

37+
if kwargs['language'] not in petsc_languages:
38+
raise ValueError(
39+
f"Expected 'language' to be one of "
40+
f"{petsc_languages}, but got '{kwargs['language']}'"
41+
)
42+
3743
metadata = core_metadata()
3844
data = FindNodes(PetscMetaData).visit(iet)
3945

devito/petsc/initialize.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from ctypes import POINTER, cast, c_char
44
import atexit
55

6-
from devito import Operator
6+
from devito import Operator, switchconfig
77
from devito.types import Symbol
88
from devito.types.equation import PetscEq
99
from devito.petsc.types import Initialize, Finalize
@@ -20,14 +20,15 @@ def PetscInitialize():
2020
# to generate these "dummy_ops" instead of using the Operator class.
2121
# This would prevent circular imports when initializing during import
2222
# from the PETSc module.
23-
op_init = Operator(
24-
[PetscEq(dummy, Initialize(dummy))],
25-
name='kernel_init', opt='noop'
26-
)
27-
op_finalize = Operator(
28-
[PetscEq(dummy, Finalize(dummy))],
29-
name='kernel_finalize', opt='noop'
30-
)
23+
with switchconfig(language='petsc'):
24+
op_init = Operator(
25+
[PetscEq(dummy, Initialize(dummy))],
26+
name='kernel_init', opt='noop'
27+
)
28+
op_finalize = Operator(
29+
[PetscEq(dummy, Finalize(dummy))],
30+
name='kernel_finalize', opt='noop'
31+
)
3132

3233
# `argv_bytes` must be a list so the memory address persists
3334
# `os.fsencode` should be preferred over `string().encode('utf-8')`

devito/petsc/types/array.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,6 @@ def shape_allocated(self):
106106

107107
@cached_property
108108
def _C_ctype(self):
109-
# TODO: Switch to using PetscScalar instead of float/double
110-
# TODO: Use cat $PETSC_DIR/$PETSC_ARCH/lib/petsc/conf/petscvariables
111-
# | grep -E "PETSC_(SCALAR|PRECISION)" to determine the precision of
112-
# the user's PETSc configuration.
113109
return POINTER(dtype_to_ctype(self.dtype))
114110

115111
@property

devito/petsc/types/object.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from ctypes import POINTER, c_char
2-
from devito.tools import CustomDtype, dtype_to_cstr, as_tuple, CustomIntType
2+
from devito.tools import CustomDtype, dtype_to_ctype, as_tuple, CustomIntType
33
from devito.types import (LocalObject, LocalCompositeObject, ModuloDimension,
44
TimeDimension, ArrayObject, CustomDimension)
55
from devito.symbolics import Byref, cast
@@ -188,7 +188,7 @@ class VecScatter(LocalObject):
188188
class StartPtr(LocalObject):
189189
def __init__(self, name, dtype):
190190
super().__init__(name=name)
191-
self.dtype = CustomDtype(dtype_to_cstr(dtype), modifier=' *')
191+
self.dtype = POINTER(dtype_to_ctype(dtype))
192192

193193

194194
class SingleIS(LocalObject):

0 commit comments

Comments
 (0)