From 73b532fa1399965316d29b4052e4346f5beea313 Mon Sep 17 00:00:00 2001 From: Dominic Kempf Date: Mon, 14 Nov 2016 11:40:56 +0100 Subject: [PATCH 1/2] Fix scalar temporaries with defined base_storage They have to be treated as pointers instead of scalars. --- loopy/target/c/codegen/expression.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index 51cfc7fe6..cc08c273c 100644 --- a/loopy/target/c/codegen/expression.py +++ b/loopy/target/c/codegen/expression.py @@ -145,6 +145,10 @@ class ExpressionToCExpressionMapper(IdentityMapper): from loopy.kernel.data import ValueArg if isinstance(arg, ValueArg) and self.fortran_abi: postproc = lambda x: x[0] # noqa + elif expr.name in self.kernel.temporary_variables: + temporary = self.kernel.temporary_variables[expr.name] + if temporary.base_storage: + postproc = lambda x: x[0] # noqa result = self.kernel.mangle_symbol(self.codegen_state.ast_builder, expr.name) if result is not None: @@ -213,12 +217,14 @@ class ExpressionToCExpressionMapper(IdentityMapper): elif isinstance(ary, (GlobalArg, TemporaryVariable, ConstantArg)): if len(access_info.subscripts) == 0: - if isinstance(ary, GlobalArg) or isinstance(ary, ConstantArg): + if (isinstance(ary, (ConstantArg, GlobalArg)) or + (isinstance(ary, TemporaryVariable) and ary.base_storage)): # unsubscripted global args are pointers result = var(access_info.array_name)[0] else: # unsubscripted temp vars are scalars + # (unless they use base_storage) result = var(access_info.array_name) else: -- GitLab From 9f98e8d2398433f93193aa60a746e1b6d0fcdd65 Mon Sep 17 00:00:00 2001 From: Dominic Kempf Date: Mon, 14 Nov 2016 21:15:58 +0100 Subject: [PATCH 2/2] Add regression test for scalar base storage issue --- test/test_loopy.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/test_loopy.py b/test/test_loopy.py index 972946cbe..9107e6f91 100644 --- a/test/test_loopy.py +++ b/test/test_loopy.py @@ -1587,6 +1587,20 @@ def test_temp_initializer(ctx_factory, src_order, tmp_order): assert np.array_equal(a, a2) +def test_scalars_with_base_storage(ctx_factory): + """ Regression test for !50 """ + ctx = ctx_factory() + queue = cl.CommandQueue(ctx) + + knl = lp.make_kernel( + "{ [i]: 0<=i<1}", + "a = 1", + [lp.TemporaryVariable("a", dtype=np.float64, + shape=(), base_storage="base")]) + + knl(queue, out_host=True) + + if __name__ == "__main__": if len(sys.argv) > 1: exec(sys.argv[1]) -- GitLab