From cd1ab02ddec21d72c08e90144e101d6aca360f9e Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Tue, 18 Jun 2013 20:15:48 -0400 Subject: [PATCH] Warn more often about deferred types, schedule before codegen if necessary --- loopy/auto_test.py | 7 +++---- loopy/codegen/__init__.py | 14 ++++++++++++++ loopy/compiled.py | 24 ++---------------------- loopy/schedule.py | 20 ++++++++++++++++++++ test/test_loopy.py | 22 ++++++++++++++++++++++ 5 files changed, 61 insertions(+), 26 deletions(-) diff --git a/loopy/auto_test.py b/loopy/auto_test.py index 690e2bec2..c299df4e5 100644 --- a/loopy/auto_test.py +++ b/loopy/auto_test.py @@ -324,8 +324,7 @@ def _enumerate_cl_devices_for_ref_test(): # {{{ main automatic testing entrypoint -def _complain_about_deferred_types(knl): - print "COMPL" +def _check_for_deferred_types(knl): for arg in knl.args: if arg.dtype is None: raise RuntimeError("Automatic testing requires that all " @@ -384,7 +383,7 @@ def auto_test_vs_ref( # {{{ compile and run reference code - _complain_about_deferred_types(ref_knl) + _check_for_deferred_types(ref_knl) found_ref_device = False @@ -486,7 +485,7 @@ def auto_test_vs_ref( test_kernels = [test_knl] for i, kernel in enumerate(test_kernels): - _complain_about_deferred_types(kernel) + _check_for_deferred_types(kernel) compiled = CompiledKernel(ctx, kernel, options=options, codegen_kwargs=codegen_kwargs) diff --git a/loopy/codegen/__init__.py b/loopy/codegen/__init__.py index 3541e8f22..5ebce957c 100644 --- a/loopy/codegen/__init__.py +++ b/loopy/codegen/__init__.py @@ -272,8 +272,22 @@ class ImplementedDataInfo(Record): # {{{ main code generation entrypoint +def _check_for_deferred_types(knl): + for arg in knl.args: + if arg.dtype is None: + raise RuntimeError("Code generation requires that all " + "argument types are known. Argument '%s' has " + "an unknown/deferred type." % arg.name) + + def generate_code(kernel, with_annotation=False, allow_complex=None): + if kernel.schedule is None: + from loopy.schedule import get_one_scheduled_kernel + kernel = get_one_scheduled_kernel(kernel) + + _check_for_deferred_types(kernel) + from cgen import (FunctionBody, FunctionDeclaration, Value, Module, Block, Line, Const, LiteralLines, Initializer) diff --git a/loopy/compiled.py b/loopy/compiled.py index c81f8dcdd..d799186f5 100644 --- a/loopy/compiled.py +++ b/loopy/compiled.py @@ -694,25 +694,6 @@ def generate_invoker(kernel, impl_arg_info, flags): # {{{ compiled kernel object -def _get_kernel_from_iterable(iterable): - kernel_count = 0 - - for scheduled_kernel in iterable: - kernel_count += 1 - - if kernel_count == 1: - # use the first schedule - result = scheduled_kernel - - if kernel_count == 2: - from warnings import warn - warn("kernel scheduling was ambiguous--more than one " - "schedule found, ignoring", stacklevel=2) - break - - return result - - class _CLKernelInfo(Record): pass @@ -748,7 +729,6 @@ class CompiledKernel: def get_kernel(self, arg_to_dtype_set): kernel = self.kernel - import loopy as lp from loopy.kernel.tools import add_argument_dtypes if arg_to_dtype_set: @@ -762,8 +742,8 @@ class CompiledKernel: kernel = infer_unknown_types(kernel, expect_completion=True) if kernel.schedule is None: - kernel = _get_kernel_from_iterable( - lp.generate_loop_schedules(kernel)) + from loopy.schedule import get_one_scheduled_kernel + kernel = get_one_scheduled_kernel(kernel) return kernel diff --git a/loopy/schedule.py b/loopy/schedule.py index 4d5c0314a..52d001ed4 100644 --- a/loopy/schedule.py +++ b/loopy/schedule.py @@ -879,4 +879,24 @@ def generate_loop_schedules(kernel, debug_args={}): # }}} + +def get_one_scheduled_kernel(kernel): + kernel_count = 0 + + for scheduled_kernel in generate_loop_schedules(kernel): + kernel_count += 1 + + if kernel_count == 1: + # use the first schedule + result = scheduled_kernel + + if kernel_count == 2: + from warnings import warn + warn("kernel scheduling was ambiguous--more than one " + "schedule found, ignoring", stacklevel=2) + break + + return result + + # vim: foldmethod=marker diff --git a/test/test_loopy.py b/test/test_loopy.py index 57e747687..272b0130b 100644 --- a/test/test_loopy.py +++ b/test/test_loopy.py @@ -1110,6 +1110,28 @@ def test_offsets_and_slicing(ctx_factory): assert la.norm(b_full.get() - b_full_h) < 1e-13 +def test_vector_ilp_with_prefetch(ctx_factory): + ctx = ctx_factory() + + knl = lp.make_kernel(ctx.devices[0], + "{ [i]: 0<=i 1: -- GitLab