From 2735ccbf6eeda84ede9df6208e524169a43d3cda Mon Sep 17 00:00:00 2001 From: Kaushik Kulkarni Date: Mon, 1 Feb 2021 17:46:16 -0600 Subject: [PATCH] [statistics]: ensure count_insn(insn) == 1 if len(insn.within_inames) == 0 --- loopy/statistics.py | 42 +++++++++++++++++++++++++++-------------- test/test_statistics.py | 20 ++++++++++++++++++++ 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/loopy/statistics.py b/loopy/statistics.py index a0a0f9c7e..72ec4d586 100755 --- a/loopy/statistics.py +++ b/loopy/statistics.py @@ -56,6 +56,17 @@ __doc__ = """ """ +def get_kernel_parameter_space(kernel): + return isl.Space.create_from_names(kernel.isl_context, + set=[], params=sorted(list(kernel.outer_params()))).params() + + +def get_kernel_zero_pwqpolynomial(kernel): + space = get_kernel_parameter_space(kernel) + space = space.insert_dims(dim_type.out, 0, 1) + return isl.PwQPolynomial.zero(space) + + # {{{ GuardedPwQPolynomial class GuardedPwQPolynomial: @@ -1231,7 +1242,7 @@ def count(kernel, set, space=None): return add_assumptions_guard(kernel, count) -def get_unused_hw_axes_factor(knl, insn, disregard_local_axes, space=None): +def get_unused_hw_axes_factor(knl, insn, disregard_local_axes): # FIXME: Multi-kernel support gsize, lsize = knl.get_grid_size_upper_bounds() @@ -1250,12 +1261,12 @@ def get_unused_hw_axes_factor(knl, insn, disregard_local_axes, space=None): g_used.add(tag.axis) def mult_grid_factor(used_axes, size): - result = 1 + result = get_kernel_zero_pwqpolynomial(knl) + 1 + for iaxis, size in enumerate(size): if iaxis not in used_axes: if not isinstance(size, int): - if space is not None: - size = size.align_params(space) + size = size.align_params(result.space) size = isl.PwQPolynomial.from_pw_aff(size) @@ -1271,6 +1282,17 @@ def get_unused_hw_axes_factor(knl, insn, disregard_local_axes, space=None): return add_assumptions_guard(knl, result) +def count_inames_domain(knl, inames): + space = get_kernel_parameter_space(knl) + if not inames: + return add_assumptions_guard(knl, + get_kernel_zero_pwqpolynomial(knl) + 1) + + inames_domain = knl.get_inames_domain(inames) + domain = inames_domain.project_out_except(inames, [dim_type.set]) + return count(knl, domain, space=space) + + def count_insn_runs(knl, insn, count_redundant_work, disregard_local_axes=False): insn_inames = insn.within_inames @@ -1281,19 +1303,11 @@ def count_insn_runs(knl, insn, count_redundant_work, disregard_local_axes=False) for iname in insn_inames if not knl.iname_tags_of_type(iname, LocalIndexTag)] - inames_domain = knl.get_inames_domain(insn_inames) - domain = (inames_domain.project_out_except( - insn_inames, [dim_type.set])) - - space = isl.Space.create_from_names(isl.DEFAULT_CONTEXT, - set=[], params=knl.outer_params()) - - c = count(knl, domain, space=space) + c = count_inames_domain(knl, insn_inames) if count_redundant_work: unused_fac = get_unused_hw_axes_factor(knl, insn, - disregard_local_axes=disregard_local_axes, - space=space) + disregard_local_axes=disregard_local_axes) return c * unused_fac else: return c diff --git a/test/test_statistics.py b/test/test_statistics.py index bcdc542cb..d6ad5874d 100644 --- a/test/test_statistics.py +++ b/test/test_statistics.py @@ -1319,6 +1319,26 @@ def test_strided_footprint(): assert 2*num < denom +def test_no_loop_ops(): + # See https://github.com/inducer/loopy/issues/211 + + knl = lp.make_kernel( + "{ : }", + """ + c = a + b + d = 2*c + a + b + """) + + knl = lp.add_dtypes(knl, {"a": np.float, "b": np.float}) + + op_map = lp.get_op_map(knl, subgroup_size=SGS, count_redundant_work=True, + count_within_subscripts=True) + f64_add = op_map.filter_by(name="add").eval_and_sum({}) + f64_mul = op_map.filter_by(name="mul").eval_and_sum({}) + assert f64_add == 3 + assert f64_mul == 1 + + if __name__ == "__main__": if len(sys.argv) > 1: exec(sys.argv[1]) -- GitLab