From 8ea88db3ef3827baae8622e1ef8add9c2a497526 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Sun, 4 Dec 2016 15:34:02 -0600 Subject: [PATCH 1/5] Remove duplicate code. --- test/test_loopy.py | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/test/test_loopy.py b/test/test_loopy.py index 4221feb79..d3f7c115f 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() -- GitLab From 9cc669e1fcecccbec9b1c46edeb2d193e21dd490 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Sun, 4 Dec 2016 15:35:40 -0600 Subject: [PATCH 2/5] Temporary variables: Ensure any temporary that has an initializer is read-only. This restriction previously applied to global temporaries. --- loopy/kernel/data.py | 5 ++--- loopy/target/c/__init__.py | 1 + test/test_loopy.py | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/loopy/kernel/data.py b/loopy/kernel/data.py index 61be55ca8..ebadc72df 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 be83ec90c..e4835a363 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/test/test_loopy.py b/test/test_loopy.py index d3f7c115f..d208793f5 100644 --- a/test/test_loopy.py +++ b/test/test_loopy.py @@ -1695,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), "..." ]) -- GitLab From 3ad3ea961920b08ba3bc6f09cffb4d05f3659b94 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Sun, 4 Dec 2016 15:38:00 -0600 Subject: [PATCH 3/5] Save and reload: Ignore temporaries with initializer. --- loopy/transform/save.py | 10 +++++++--- test/test_loopy.py | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/loopy/transform/save.py b/loopy/transform/save.py index 8706bc4da..65649a4cc 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,15 @@ 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. + return None + if temporary.base_storage is not None: raise ValueError( "Cannot promote temporaries with base_storage to global") diff --git a/test/test_loopy.py b/test/test_loopy.py index d208793f5..79bf52237 100644 --- a/test/test_loopy.py +++ b/test/test_loopy.py @@ -1708,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 Date: Sun, 4 Dec 2016 15:44:53 -0600 Subject: [PATCH 4/5] Bump data model version since temporaries with initializers are forced to be read only. --- loopy/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loopy/version.py b/loopy/version.py index f7d157f65..7de2d6877 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 -- GitLab From a7c4fd8cd00fd55089b8f791c8afb2f449ce26c7 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Sun, 4 Dec 2016 15:55:20 -0600 Subject: [PATCH 5/5] Add an assert in case the temporary initializer policy changes. --- loopy/transform/save.py | 1 + 1 file changed, 1 insertion(+) diff --git a/loopy/transform/save.py b/loopy/transform/save.py index 65649a4cc..bc8981281 100644 --- a/loopy/transform/save.py +++ b/loopy/transform/save.py @@ -252,6 +252,7 @@ class TemporarySaver(object): 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: -- GitLab