diff --git a/devito/core/cpu.py b/devito/core/cpu.py index 3435a472e6..bfb4a021b1 100644 --- a/devito/core/cpu.py +++ b/devito/core/cpu.py @@ -305,7 +305,6 @@ def _make_iet_passes_mapper(cls, **kwargs): 'parallel': parizer.make_parallel, 'openmp': parizer.make_parallel, 'mpi': partial(mpiize, **kwargs), - 'linearize': partial(linearize, **kwargs), 'simd': partial(parizer.make_simd), 'prodders': hoist_prodders, 'init': partial(parizer.initialize) @@ -320,7 +319,7 @@ def _make_iet_passes_mapper(cls, **kwargs): 'blocking', 'topofuse', 'fission', 'fuse', 'factorize', 'cire-sops', 'cse', 'lift', 'opt-pows', 'opt-hyperplanes', # IET - 'denormals', 'openmp', 'mpi', 'linearize', 'simd', 'prodders', + 'denormals', 'openmp', 'mpi', 'simd', 'prodders', ) _known_passes_disabled = ('tasking', 'streaming', 'openacc') assert not (set(_known_passes) & set(_known_passes_disabled)) diff --git a/devito/core/gpu.py b/devito/core/gpu.py index 536a06422e..a490aed3aa 100644 --- a/devito/core/gpu.py +++ b/devito/core/gpu.py @@ -334,7 +334,6 @@ def _make_iet_passes_mapper(cls, **kwargs): 'orchestrate': partial(orchestrator.process), 'pthreadify': partial(pthreadify, **kwargs), 'mpi': partial(mpiize, **kwargs), - 'linearize': partial(linearize, **kwargs), 'prodders': partial(hoist_prodders), 'init': partial(parizer.initialize) } @@ -348,7 +347,7 @@ def _make_iet_passes_mapper(cls, **kwargs): 'blocking', 'tasking', 'streaming', 'factorize', 'fission', 'fuse', 'lift', 'cire-sops', 'cse', 'opt-pows', 'topofuse', # IET - 'orchestrate', 'pthreadify', 'parallel', 'mpi', 'linearize', 'prodders' + 'orchestrate', 'pthreadify', 'parallel', 'mpi', 'prodders' ) _known_passes_disabled = ('denormals', 'simd') assert not (set(_known_passes) & set(_known_passes_disabled)) diff --git a/devito/core/operator.py b/devito/core/operator.py index 2a84d381f7..4fe8a59299 100644 --- a/devito/core/operator.py +++ b/devito/core/operator.py @@ -11,6 +11,7 @@ from devito.mpi.routines import mpi_registry from devito.operator import Operator from devito.parameters import configuration +from devito.passes.iet import linearize from devito.tools import ( UnboundedMultiTuple, UnboundTuple, as_tuple, is_integer, timed_pass ) @@ -455,8 +456,7 @@ def _specialize_iet(cls, graph, **kwargs): cls._Target.DataManager(**kwargs).process(graph) # Linearize n-dimensional Indexeds - if 'linearize' not in passes and options['linearize']: - passes_mapper['linearize'](graph) + linearize(graph, **kwargs) # Enforce pthreads if CPU-GPU orchestration requested if 'orchestrate' in passes and 'pthreadify' not in passes: diff --git a/tests/test_linearize.py b/tests/test_linearize.py index c78880924d..e8eb0c7562 100644 --- a/tests/test_linearize.py +++ b/tests/test_linearize.py @@ -6,6 +6,7 @@ Eq, Function, Grid, Inc, MatrixSparseTimeFunction, Operator, SparseTimeFunction, TimeFunction, configuration, sin, switchconfig ) +from devito.exceptions import InvalidOperator from devito.ir import Call, Callable, DummyExpr, Expression, FindNodes, SymbolRegistry from devito.passes import Graph, generate_macros, linearize from devito.types import Array, Bundle, CustomDimension, DefaultDimension @@ -737,3 +738,23 @@ def test_bundle_derived_dim_stride(): assert bundle.symbolic_shape[p] is not bundle.symbolic_shape[rp] assert bundle.symbolic_shape[rp] == 2 assert bundle.symbolic_shape.dindex(rp) == 1 + + +def test_linearize_is_not_a_pass(): + """ + `linearize` is an option, `opt=(mode, {'linearize': True})`, not a pass. + """ + grid = Grid(shape=(4, 4)) + + u = TimeFunction(name='u', grid=grid) + + with pytest.raises(InvalidOperator): + Operator(Eq(u.forward, u + 1), opt=('linearize', {'linearize': True})) + + op = Operator(Eq(u.forward, u + 1), opt=('openmp', {'linearize': True})) + + assert 'uL0' in str(op) + + op.apply(time_M=2) + + assert np.all(u.data[1] == 3)