From 6ec961b91c761b0439f23f24d64c14d3dd1e6585 Mon Sep 17 00:00:00 2001 From: arghdos Date: Tue, 25 Oct 2016 16:19:57 -0400 Subject: [PATCH 1/6] allow for array ConstantArgs --- loopy/target/c/codegen/expression.py | 4 ++-- loopy/target/opencl.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index 6d06d8a79..343454777 100644 --- a/loopy/target/c/codegen/expression.py +++ b/loopy/target/c/codegen/expression.py @@ -176,7 +176,7 @@ class ExpressionToCExpressionMapper(IdentityMapper): lambda expr: evaluate(expr, self.codegen_state.var_subst_map), self.codegen_state.vectorization_info) - from loopy.kernel.data import ImageArg, GlobalArg, TemporaryVariable + from loopy.kernel.data import ImageArg, GlobalArg, TemporaryVariable, ConstantArg if isinstance(ary, ImageArg): extra_axes = 0 @@ -209,7 +209,7 @@ class ExpressionToCExpressionMapper(IdentityMapper): raise NotImplementedError( "non-floating-point images not supported for now") - elif isinstance(ary, (GlobalArg, TemporaryVariable)): + elif isinstance(ary, (GlobalArg, TemporaryVariable, ConstantArg)): if len(access_info.subscripts) == 0: if isinstance(ary, GlobalArg): # unsubscripted global args are pointers diff --git a/loopy/target/opencl.py b/loopy/target/opencl.py index 9c2d428b0..f0436099c 100644 --- a/loopy/target/opencl.py +++ b/loopy/target/opencl.py @@ -486,11 +486,11 @@ class OpenCLCASTBuilder(CASTBuilder): return CLImage(num_target_axes, mode, name) def get_constant_arg_decl(self, name, shape, dtype, is_written): - from loopy.codegen import POD # uses the correct complex type + from loopy.target.c import POD # uses the correct complex type from cgen import RestrictPointer, Const from cgen.opencl import CLConstant - arg_decl = RestrictPointer(POD(dtype, name)) + arg_decl = RestrictPointer(POD(self, dtype, name)) if not is_written: arg_decl = Const(arg_decl) -- GitLab From be1222ad0a952b692c49c8abf2a971abdbbe8e65 Mon Sep 17 00:00:00 2001 From: arghdos Date: Tue, 25 Oct 2016 16:34:06 -0400 Subject: [PATCH 2/6] add test for constant arg array --- test/test_loopy.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/test_loopy.py b/test/test_loopy.py index 9d1e2d155..d56caf0e8 100644 --- a/test/test_loopy.py +++ b/test/test_loopy.py @@ -1459,6 +1459,25 @@ def test_unr_and_conditionals(ctx_factory): lp.auto_test_vs_ref(ref_knl, ctx, knl) +def test_constant_array_args(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 + """, + [lp.ConstantArg('T', shape=(200,), dtype=np.float32), + '...']) + + knl = lp.fix_parameters(knl, n=200) + + print(lp.generate_code_v2(knl).device_code()) + if __name__ == "__main__": if len(sys.argv) > 1: -- GitLab From 5dab845b3e4cf23e0715ecb6b42c26486bb3ef05 Mon Sep 17 00:00:00 2001 From: arghdos Date: Tue, 25 Oct 2016 16:47:22 -0400 Subject: [PATCH 3/6] make constant arg behave as global arg --- loopy/target/c/codegen/expression.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index 343454777..be65d3f89 100644 --- a/loopy/target/c/codegen/expression.py +++ b/loopy/target/c/codegen/expression.py @@ -211,7 +211,8 @@ class ExpressionToCExpressionMapper(IdentityMapper): elif isinstance(ary, (GlobalArg, TemporaryVariable, ConstantArg)): if len(access_info.subscripts) == 0: - if isinstance(ary, GlobalArg): + if isinstance(ary, GlobalArg) or\ + isinstance(ary, ConstantArg): # unsubscripted global args are pointers result = var(access_info.array_name)[0] -- GitLab From 86dbf7c0360d08ef14a208a513c18e6b314ffe27 Mon Sep 17 00:00:00 2001 From: arghdos Date: Tue, 25 Oct 2016 17:17:12 -0400 Subject: [PATCH 4/6] fix for autotest --- loopy/auto_test.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/loopy/auto_test.py b/loopy/auto_test.py index e992fa3d4..e9c9ae9cb 100644 --- a/loopy/auto_test.py +++ b/loopy/auto_test.py @@ -79,7 +79,8 @@ def make_ref_args(kernel, impl_arg_info, queue, parameters): import pyopencl as cl import pyopencl.array as cl_array - from loopy.kernel.data import ValueArg, GlobalArg, ImageArg, TemporaryVariable + from loopy.kernel.data import ValueArg, GlobalArg, ImageArg, \ + TemporaryVariable, ConstantArg from pymbolic import evaluate @@ -107,7 +108,8 @@ def make_ref_args(kernel, impl_arg_info, queue, parameters): ref_arg_data.append(None) - elif arg.arg_class is GlobalArg or arg.arg_class is ImageArg: + elif arg.arg_class is GlobalArg or arg.arg_class is ImageArg \ + or arg.arg_class is ConstantArg: if arg.shape is None or any(saxis is None for saxis in arg.shape): raise LoopyError("array '%s' needs known shape to use automatic " "testing" % arg.name) -- GitLab From c07d49e2054b9729bd704f814e7663366ef22311 Mon Sep 17 00:00:00 2001 From: arghdos Date: Tue, 25 Oct 2016 17:17:12 -0400 Subject: [PATCH 5/6] and another autotest fix --- loopy/auto_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loopy/auto_test.py b/loopy/auto_test.py index e9c9ae9cb..02469b96d 100644 --- a/loopy/auto_test.py +++ b/loopy/auto_test.py @@ -231,7 +231,7 @@ def make_args(kernel, impl_arg_info, queue, ref_arg_data, parameters): args[arg.name] = cl.image_from_array( queue.context, arg_desc.ref_pre_run_array.get()) - elif arg.arg_class is GlobalArg: + elif arg.arg_class is GlobalArg or arg.arg_class is ConstantArg: shape = evaluate(arg.unvec_shape, parameters) strides = evaluate(arg.unvec_strides, parameters) -- GitLab From 53fbdf6f7a327817592bd786ceddb5e6037c4573 Mon Sep 17 00:00:00 2001 From: arghdos Date: Tue, 25 Oct 2016 17:33:03 -0400 Subject: [PATCH 6/6] correct imports here --- loopy/auto_test.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/loopy/auto_test.py b/loopy/auto_test.py index 02469b96d..479b898be 100644 --- a/loopy/auto_test.py +++ b/loopy/auto_test.py @@ -198,7 +198,8 @@ def make_args(kernel, impl_arg_info, queue, ref_arg_data, parameters): import pyopencl as cl import pyopencl.array as cl_array - from loopy.kernel.data import ValueArg, GlobalArg, ImageArg, TemporaryVariable + from loopy.kernel.data import ValueArg, GlobalArg, ImageArg,\ + TemporaryVariable, ConstantArg from pymbolic import evaluate @@ -231,7 +232,8 @@ def make_args(kernel, impl_arg_info, queue, ref_arg_data, parameters): args[arg.name] = cl.image_from_array( queue.context, arg_desc.ref_pre_run_array.get()) - elif arg.arg_class is GlobalArg or arg.arg_class is ConstantArg: + elif arg.arg_class is GlobalArg or\ + arg.arg_class is ConstantArg: shape = evaluate(arg.unvec_shape, parameters) strides = evaluate(arg.unvec_strides, parameters) -- GitLab