From 9500d86d0b26fbc5d2522d1f644ad4a097ff52ad Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Mon, 8 Aug 2011 19:43:21 +0200 Subject: [PATCH] Change get_invalid_reason to get_problems, plus dg example tweaks. --- examples/cmdl | 1 - examples/matrix-mul.py | 6 ++---- loopy/kernel.py | 36 +++++++++++++++++++++++----------- test/test_matmul.py | 44 ++++++++++++++++++++++++++---------------- 4 files changed, 54 insertions(+), 33 deletions(-) delete mode 100644 examples/cmdl diff --git a/examples/cmdl b/examples/cmdl deleted file mode 100644 index 2ea6c30c5..000000000 --- a/examples/cmdl +++ /dev/null @@ -1 +0,0 @@ -EDITOR=vim PYOPENCL_CTX='1:' COMPUTE_PROFILE=0 python matrix-ops.py 'image_matrix_mul_ilp()' diff --git a/examples/matrix-mul.py b/examples/matrix-mul.py index 78ebb088c..178a9a291 100644 --- a/examples/matrix-mul.py +++ b/examples/matrix-mul.py @@ -56,8 +56,7 @@ def image_matrix_mul_ilp(ctx_factory=cl.create_some_context): knl = lp.add_prefetch(knl, 'a', ["i_inner", "k_inner"]) knl = lp.add_prefetch(knl, 'b', ["j_inner_outer", "j_inner_inner", "k_inner"]) - inv_reason = knl.get_invalid_reason() - assert inv_reason is None, inv_reason + assert knl.get_problems()[0] <= 2 kernel_gen = (lp.insert_register_prefetches(knl) for knl in lp.generate_loop_schedules(knl)) @@ -78,8 +77,7 @@ def image_matrix_mul_ilp(ctx_factory=cl.create_some_context): from pyopencl.characterize import get_fast_inaccurate_build_options lp.drive_timing_run(kernel_gen, queue, launcher, 2*n**3, - options=get_fast_inaccurate_build_options(ctx.devices[0]), - force_rebuild=True) + options=get_fast_inaccurate_build_options(ctx.devices[0])) diff --git a/loopy/kernel.py b/loopy/kernel.py index c1fd0a776..277d184f3 100644 --- a/loopy/kernel.py +++ b/loopy/kernel.py @@ -450,33 +450,47 @@ class LoopKernel(Record): .substitute(name, new_loop_index) .copy(domain=new_domain, iname_to_tag=new_iname_to_tag)) - def get_invalid_reason(self): + def get_problems(self, emit_warnings=True): + """ + :return: *(max_severity, list of (severity, msg))*, where *severity* ranges from 1-5. + '5' means 'will certainly not run'. + """ + msgs = [] + + def msg(severity, s): + if emit_warnings: + from warnings import warn + from loopy import LoopyAdvisory + warn(s, LoopyAdvisory) + + msgs.append((severity, s)) + glens = self.tag_type_lengths(TAG_GROUP_IDX) llens = self.tag_type_lengths(TAG_WORK_ITEM_IDX) if (max(len(glens), len(llens)) > self.device.max_work_item_dimensions): - return "too many work item dimensions" + msg(5, "too many work item dimensions") for i in range(len(llens)): if llens[i] > self.device.max_work_item_sizes[i]: - return "group axis %d too big" + msg(5, "group axis %d too big") from pytools import product if product(llens) > self.device.max_work_group_size: - return "work group too big" + msg(5, "work group too big") from pyopencl.characterize import usable_local_mem_size if self.local_mem_use() > usable_local_mem_size(self.device): if self.device.local_mem_type == cl.device_local_mem_type.LOCAL: - return "using too much local memory" + msg(5, "using too much local memory") else: - from warnings import warn - from loopy import LoopyAdvisory - warn("using more local memory than available--" - "possibly OK due to cache nature", - LoopyAdvisory) + msg(4, "using more local memory than available--" + "possibly OK due to cache nature") - return None + max_severity = 0 + for sev, msg in msgs: + max_severity = max(sev, max_severity) + return max_severity, msgs # }}} diff --git a/test/test_matmul.py b/test/test_matmul.py index 552a4d748..5d46deae9 100644 --- a/test/test_matmul.py +++ b/test/test_matmul.py @@ -104,7 +104,7 @@ def test_plain_matrix_mul(ctx_factory): knl = lp.split_dimension(knl, "k", 4) knl = lp.add_prefetch(knl, 'a', ["k_inner", "i_inner"]) knl = lp.add_prefetch(knl, 'b', ["j_inner", "k_inner", ]) - assert knl.get_invalid_reason() is None + assert knl.get_problems()[0] <= 2 kernel_gen = (lp.insert_register_prefetches(knl) for knl in lp.generate_loop_schedules(knl)) @@ -158,7 +158,7 @@ def test_image_matrix_mul(ctx_factory): # conflict-free knl = lp.add_prefetch(knl, 'a', ["i_inner", "k_inner"]) knl = lp.add_prefetch(knl, 'b', ["j_inner", "k_inner"]) - assert knl.get_invalid_reason() is None + assert knl.get_problems()[0] <= 2 kernel_gen = (lp.insert_register_prefetches(knl) for knl in lp.generate_loop_schedules(knl)) @@ -216,8 +216,7 @@ def test_image_matrix_mul_ilp(ctx_factory): # conflict-free #knl = lp.add_prefetch(knl, 'a', ["i_inner", "k_inner"]) #knl = lp.add_prefetch(knl, 'b', ["j_inner_outer", "j_inner_inner", "k_inner"]) - inv_reason = knl.get_invalid_reason() - assert inv_reason is None, inv_reason + assert knl.get_problems()[0] <= 2 kernel_gen = (lp.insert_register_prefetches(knl) for knl in lp.generate_loop_schedules(knl)) @@ -274,7 +273,7 @@ def test_fancy_matrix_mul(ctx_factory): knl = lp.split_dimension(knl, "k", 16) knl = lp.add_prefetch(knl, 'a', ["i_inner", "k_inner"]) knl = lp.add_prefetch(knl, 'b', ["k_inner", "j_inner"]) - assert knl.get_invalid_reason() is None + assert knl.get_problems()[0] <= 2 kernel_gen = (lp.insert_register_prefetches(knl) for knl in lp.generate_loop_schedules(knl)) @@ -309,9 +308,10 @@ def test_dg_matrix_mul(ctx_factory): Np = 84 Np_padded = 96 - K = 20000 + K = get_suitable_size(ctx)*4 dim = 3 num_flds = 2 + use_images = False from pymbolic import var fld = var("fld") @@ -328,7 +328,9 @@ def test_dg_matrix_mul(ctx_factory): for mn in matrix_names for ifld in range(num_flds) ], - [lp.ImageArg(mn, dtype, 2) for mn in matrix_names] + ([lp.ImageArg(mn, dtype, 2) for mn in matrix_names] + if use_images else + [lp.ArrayArg(mn, dtype, shape=(Np, Np), order="C") for mn in matrix_names]) + [lp.ArrayArg("fld%d" % ifld, dtype, strides=fld_strides) for ifld in range(num_flds) @@ -340,10 +342,10 @@ def test_dg_matrix_mul(ctx_factory): ], name="dg_matmul") - ilp = 4 + #ilp = 4 knl = lp.split_dimension(knl, "i", 30, 32, outer_tag="g.0", inner_tag="l.0") - knl = lp.split_dimension(knl, "k", 16*ilp, outer_tag="g.1") - knl = lp.split_dimension(knl, "k_inner", 16, outer_tag="ilp", inner_tag="l.1") + knl = lp.split_dimension(knl, "k", 16, outer_tag="g.1", inner_tag="l.1") + #knl = lp.split_dimension(knl, "k_inner", 16, outer_tag="ilp", inner_tag="l.1") assert Np % 2 == 0 #knl = lp.split_dimension(knl, "j", Np//2) @@ -353,14 +355,16 @@ def test_dg_matrix_mul(ctx_factory): #knl = lp.add_prefetch(knl, mn, ["j", "i_inner"]) for ifld in range(num_flds): knl = lp.add_prefetch(knl, 'fld%d' % ifld, - ["k_inner_outer", "k_inner_inner", "j"]) - assert knl.get_invalid_reason() is None + #["k_inner_outer", "k_inner_inner", "j"]) + ["k_inner", "j"]) + assert knl.get_problems()[0] <= 2 kernel_gen = list(lp.insert_register_prefetches(knl) for knl in lp.generate_loop_schedules(knl))[:1] matrices = [ - make_well_conditioned_dev_matrix(queue, Np, dtype=dtype, order="C") + make_well_conditioned_dev_matrix(queue, Np, dtype=dtype, order="C", + ran_factor=0) for mn in matrix_names] flds = [ make_well_conditioned_dev_matrix(queue, (Np_padded, K), dtype=dtype, order="F") @@ -373,11 +377,17 @@ def test_dg_matrix_mul(ctx_factory): for fld in flds for mat in matrices] - mat_images = [ - cl.image_from_array(ctx, mat.get(), 1) for mat in matrices] + if use_images: + mat_images = [ + cl.image_from_array(ctx, mat.get(), 1) for mat in matrices] def launcher(kernel, gsize, lsize, check): - args = mat_images + [fld.data for fld in flds] + [out.data for out in outputs] + if use_images: + args = mat_images + else: + args = [mat.data for mat in matrices] + + args = args + [fld.data for fld in flds] + [out.data for out in outputs] kwargs = dict(g_times_l=True) evt = kernel(queue, gsize(), lsize(), *args, g_times_l=True) @@ -388,7 +398,7 @@ def test_dg_matrix_mul(ctx_factory): return evt lp.drive_timing_run(kernel_gen, queue, launcher, num_flds*dim*2*(Np**2)*K, - print_code=False) + edit_code=True) -- GitLab