diff --git a/loopy/kernel/data.py b/loopy/kernel/data.py index 61be55ca88b105f2cf58e8aeace09e9c20f54857..ebadc72df30f6b9fe706d5c1f7d1606d03fdc41c 100644 --- a/loopy/kernel/data.py +++ b/loopy/kernel/data.py @@ -405,11 +405,10 @@ class TemporaryVariable(ArrayBase): base_indices = (0,) * len(shape) if (not read_only - and initializer is not None - and scope == temp_var_scope.GLOBAL): + and initializer is not None): raise LoopyError( "temporary variable '%s': " - "read-write global variables with initializer " + "read-write variables with initializer " "are not currently supported " "(did you mean to set read_only=True?)" % name) diff --git a/loopy/target/c/__init__.py b/loopy/target/c/__init__.py index be83ec90c4720f10876e1a5e47a43c429fc40aeb..e4835a3638b43619f9b93f45958382218b701642 100644 --- a/loopy/target/c/__init__.py +++ b/loopy/target/c/__init__.py @@ -429,6 +429,7 @@ class CASTBuilder(ASTBuilderBase): tv.scope) if tv.initializer is not None: + assert tv.read_only decl = Initializer(decl, generate_array_literal( codegen_state, tv, tv.initializer)) diff --git a/loopy/transform/save.py b/loopy/transform/save.py index 8706bc4da70b94ad678f07158e0a0f648fdd0030..bc8981281a94bde2685be2efa659b8db01b493bb 100644 --- a/loopy/transform/save.py +++ b/loopy/transform/save.py @@ -26,7 +26,7 @@ THE SOFTWARE. from loopy.diagnostic import LoopyError import loopy as lp -from loopy.kernel.data import auto +from loopy.kernel.data import auto, temp_var_scope from pytools import memoize_method, Record from loopy.schedule import ( EnterLoop, LeaveLoop, RunInstruction, @@ -217,7 +217,7 @@ class TemporarySaver(object): @memoize_method def as_variable(self): temporary = self.orig_temporary - from loopy.kernel.data import TemporaryVariable, temp_var_scope + from loopy.kernel.data import TemporaryVariable return TemporaryVariable( name=self.name, dtype=temporary.dtype, @@ -245,11 +245,16 @@ class TemporarySaver(object): def auto_promote_temporary(self, temporary_name): temporary = self.kernel.temporary_variables[temporary_name] - from loopy.kernel.data import temp_var_scope if temporary.scope == temp_var_scope.GLOBAL: # Nothing to be done for global temporaries (I hope) return None + if temporary.initializer is not None: + # Temporaries with initializers do not need saving/reloading - the + # code generation takes care of emitting the initializers. + assert temporary.read_only + return None + if temporary.base_storage is not None: raise ValueError( "Cannot promote temporaries with base_storage to global") diff --git a/loopy/version.py b/loopy/version.py index f7d157f650304a83164e11763279d3c5eabbc4c0..7de2d687794358f182776b90752ceb81ee2675e4 100644 --- a/loopy/version.py +++ b/loopy/version.py @@ -32,4 +32,4 @@ except ImportError: else: _islpy_version = islpy.version.VERSION_TEXT -DATA_MODEL_VERSION = "v49-islpy%s" % _islpy_version +DATA_MODEL_VERSION = "v50-islpy%s" % _islpy_version diff --git a/test/test_loopy.py b/test/test_loopy.py index 4221feb792550a6c8b243f0f648dfff6d4654fac..79bf52237cbe2d69807aae99d199e59f8a60d922 100644 --- a/test/test_loopy.py +++ b/test/test_loopy.py @@ -1635,28 +1635,6 @@ def test_ilp_and_conditionals(ctx_factory): lp.auto_test_vs_ref(ref_knl, ctx, knl) -def test_unr_and_conditionals(ctx_factory): - ctx = ctx_factory() - - knl = lp.make_kernel('{[k]: 0<=k Tcond[k] = T[k] < 0.5 - if Tcond[k] - cp[k] = 2 * T[k] + Tcond[k] - end - end - """) - - knl = lp.fix_parameters(knl, n=200) - knl = lp.add_and_infer_dtypes(knl, {"T": np.float32}) - - ref_knl = knl - - knl = lp.split_iname(knl, 'k', 2, inner_tag='unr') - - lp.auto_test_vs_ref(ref_knl, ctx, knl) - def test_unr_and_conditionals(ctx_factory): ctx = ctx_factory() @@ -1717,6 +1695,7 @@ def test_temp_initializer(ctx_factory, src_order, tmp_order): initializer=a, shape=lp.auto, scope=lp.temp_var_scope.PRIVATE, + read_only=True, order=tmp_order), "..." ]) @@ -1729,6 +1708,31 @@ def test_temp_initializer(ctx_factory, src_order, tmp_order): assert np.array_equal(a, a2) +def test_const_temp_with_initializer_not_saved(): + knl = lp.make_kernel( + "{[i]: 0<=i<10}", + """ + ... gbarrier + out[i] = tmp[i] + """, + [ + lp.TemporaryVariable("tmp", + initializer=np.arange(10), + shape=lp.auto, + scope=lp.temp_var_scope.PRIVATE, + read_only=True), + "..." + ], + seq_dependencies=True) + + knl = lp.preprocess_kernel(knl) + knl = lp.get_one_scheduled_kernel(knl) + knl = lp.save_and_reload_temporaries(knl) + + # This ensures no save slot was added. + assert len(knl.temporary_variables) == 1 + + def test_header_extract(): knl = lp.make_kernel('{[k]: 0<=k