Author: Richard Plangger <r...@pasra.at> Branch: vecopt-merge Changeset: r79310:51a6240fbce7 Date: 2015-08-31 09:36 +0200 http://bitbucket.org/pypy/pypy/changeset/51a6240fbce7/
Log: slicing index must be positive adding split packs to packset added vec_guard_ratio parameter diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py b/rpython/jit/metainterp/optimizeopt/schedule.py --- a/rpython/jit/metainterp/optimizeopt/schedule.py +++ b/rpython/jit/metainterp/optimizeopt/schedule.py @@ -940,11 +940,16 @@ node.pack_position = i def split(self, packlist, vec_reg_size): + """ Combination phase creates the biggest packs that are possible. + In this step the pack is reduced in size to fit into an + vector register. + """ pack = self pack_type = self.pack_type() max_count = vec_reg_size // pack_type.getsize() assert max_count * pack_type.getsize() == vec_reg_size while pack.pack_byte_size() > vec_reg_size: + assert max_count > 0 newpack = pack.clone() oplist = pack.operations[:max_count] newpack.operations = pack.operations[max_count:] @@ -952,6 +957,7 @@ pack.update_pack_of_nodes() newpack.update_pack_of_nodes() pack = newpack + packlist.append(newpack) def rightmost_match_leftmost(self, other): """ Check if pack A can be combined with pack B """ diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py b/rpython/jit/metainterp/optimizeopt/vectorize.py --- a/rpython/jit/metainterp/optimizeopt/vectorize.py +++ b/rpython/jit/metainterp/optimizeopt/vectorize.py @@ -97,6 +97,8 @@ resop_count = 0 # the count of operations minus debug_merge_points vector_instr = 0 + guard_count = 0 + blacklist = (rop.CALL, rop.CALL_ASSEMBLER) at_least_one_array_access = True for i,op in enumerate(loop.operations): if op.getopnum() == rop.DEBUG_MERGE_POINT: @@ -110,6 +112,13 @@ if op.is_primitive_array_access(): at_least_one_array_access = True + if warmstate.vec_ratio > 0.0: + if op.getopnum() in blacklist: + return True + + if op.is_guard(): + guard_count += 1 + if not at_least_one_array_access: return True @@ -119,6 +128,9 @@ if (float(vector_instr)/float(resop_count)) < warmstate.vec_ratio: return True + if float(guard_count)/float(resop_count) > warmstate.vec_guard_ratio: + return True + return False def cmp_pack_lt(a,b): diff --git a/rpython/jit/metainterp/test/test_vectorize.py b/rpython/jit/metainterp/test/test_vectorize.py --- a/rpython/jit/metainterp/test/test_vectorize.py +++ b/rpython/jit/metainterp/test/test_vectorize.py @@ -289,15 +289,32 @@ res = self.meta_interp(f, [i]) assert res == f(i) - @py.test.mark.parametrize('i,v1,v2',[(25,2.5,0.3), (15,44.0,22.2)]) + @py.test.mark.parametrize('i,v1,v2',[(25,2.5,0.3)]) def test_list_vectorize(self,i,v1,v2): myjitdriver = JitDriver(greens = [], reds = 'auto') + class ListF(object): + def __init__(self, size, init=0.0): + self.list = [init] * size + def __getitem__(self, key): + if key < 0: + raise IndexError + if key >= len(self.list): + raise IndexError + return self.list[key] + def __setitem__(self, key, value): + if key < 0: + raise IndexError + if key >= len(self.list): + raise IndexError + self.list[key] = value + def append(self, value): + self.list.append(value) def f(d, v1, v2): - a = [v1] * i - b = [v2] * i + a = ListF(d, v1) + b = ListF(d, v2) i = 0 - while i < len(a): + while i < d: myjitdriver.jit_merge_point() a[i] = a[i] + b[i] i += 1 diff --git a/rpython/jit/metainterp/warmspot.py b/rpython/jit/metainterp/warmspot.py --- a/rpython/jit/metainterp/warmspot.py +++ b/rpython/jit/metainterp/warmspot.py @@ -72,7 +72,7 @@ loop_longevity=0, retrace_limit=5, function_threshold=4, enable_opts=ALL_OPTS_NAMES, max_retrace_guards=15, max_unroll_recursion=7, vec=0, vec_all=0, vec_cost=0, - vec_length=60, vec_ratio=2, **kwds): + vec_length=60, vec_ratio=2, vec_guard_ratio=3, **kwds): from rpython.config.config import ConfigError translator = interp.typer.annotator.translator try: @@ -100,6 +100,7 @@ jd.warmstate.set_param_vec_cost(vec_cost) jd.warmstate.set_param_vec_length(vec_length) jd.warmstate.set_param_vec_ratio(vec_ratio) + jd.warmstate.set_param_vec_guard_ratio(vec_guard_ratio) warmrunnerdesc.finish() if graph_and_interp_only: return interp, graph diff --git a/rpython/jit/metainterp/warmstate.py b/rpython/jit/metainterp/warmstate.py --- a/rpython/jit/metainterp/warmstate.py +++ b/rpython/jit/metainterp/warmstate.py @@ -315,6 +315,9 @@ def set_param_vec_ratio(self, value): self.vec_ratio = value / 10.0 + def set_param_vec_guard_ratio(self, value): + self.vec_guard_ratio = value / 10.0 + def disable_noninlinable_function(self, greenkey): cell = self.JitCell.ensure_jit_cell_at_key(greenkey) cell.flags |= JC_DONT_TRACE_HERE diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py --- a/rpython/rlib/jit.py +++ b/rpython/rlib/jit.py @@ -559,6 +559,8 @@ 'vec_length': 'the amount of instructions allowed in "all" traces.', 'vec_ratio': 'an integer (0-10 transfored into a float by X / 10.0) statements that have vector equivalents ' 'divided by the total number of trace instructions.', + 'vec_guard_ratio': 'an integer (0-10 transfored into a float by X / 10.0) divided by the' + ' total number of trace instructions.', } PARAMETERS = {'threshold': 1039, # just above 1024, prime @@ -579,6 +581,7 @@ 'vec_cost': 0, 'vec_length': 60, 'vec_ratio': 2, + 'vec_guard_ratio': 3, } unroll_parameters = unrolling_iterable(PARAMETERS.items()) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit