Author: mattip Branch: numpypy-axisops Changeset: r51179:0722e568f060 Date: 2012-01-09 22:36 +0200 http://bitbucket.org/pypy/pypy/changeset/0722e568f060/
Log: zjit improvement diff --git a/pypy/module/micronumpy/interp_iter.py b/pypy/module/micronumpy/interp_iter.py --- a/pypy/module/micronumpy/interp_iter.py +++ b/pypy/module/micronumpy/interp_iter.py @@ -22,6 +22,9 @@ def done(self): raise NotImplementedError + def axis_done(self): + raise NotImplementedError + class ArrayIterator(BaseIterator): def __init__(self, size): self.offset = 0 @@ -120,7 +123,7 @@ self.shapelen = len(shape) self.indices = [0] * len(shape) self._done = False - self.axis_done = False + self._axis_done = False self.offset = arr_start self.dim = dim self.dim_order = [] @@ -136,13 +139,19 @@ def done(self): return self._done + def axis_done(self): + return self._axis_done + + @jit.unroll_safe def next(self, shapelen): #shapelen will always be one less than self.shapelen offset = self.offset - axis_done = False - indices = [0] * self.shapelen - for i in range(self.shapelen): - indices[i] = self.indices[i] + _axis_done = False + done = False + #indices = [0] * self.shapelen + #for i in range(self.shapelen): + # indices[i] = self.indices[i] + indices = self.indices for i in self.dim_order: if indices[i] < self.shape[i] - 1: indices[i] += 1 @@ -150,13 +159,13 @@ break else: if i == self.dim: - axis_done = True + _axis_done = True indices[i] = 0 offset -= self.backstrides[i] else: - self._done = True + done = True res = instantiate(AxisIterator) - res.axis_done = axis_done + res._axis_done = _axis_done res.offset = offset res.indices = indices res.strides = self.strides @@ -165,7 +174,7 @@ res.shape = self.shape res.shapelen = self.shapelen res.dim = self.dim - res._done = self._done + res._done = done return res # ------ other iterators that are not part of the computation frame ---------- diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py --- a/pypy/module/micronumpy/interp_numarray.py +++ b/pypy/module/micronumpy/interp_numarray.py @@ -39,7 +39,7 @@ axisreduce_driver = jit.JitDriver( greens=['shapelen', 'sig'], virtualizables=['frame'], - reds=['identity', 'self','result', 'ri', 'frame', 'nextval', 'dtype', 'value'], + reds=['identity', 'self','result', 'ri', 'frame', 'dtype', 'value'], get_printable_location=signature.new_printable_location('axisreduce'), ) @@ -758,8 +758,6 @@ class Reduce(VirtualArray): - _immutable_fields_ = ['dim', 'binfunc', 'dtype', 'identity'] - def __init__(self, binfunc, name, dim, res_dtype, values, identity=None): shape = values.shape[0:dim] + values.shape[dim + 1:len(values.shape)] VirtualArray.__init__(self, name, shape, res_dtype) @@ -803,27 +801,27 @@ ri = ArrayIterator(result.size) frame = sig.create_frame(self.values, dim=self.dim) value = self.get_identity(sig, frame, shapelen) - nextval = sig.eval(frame, self.values).convert_to(dtype) + assert isinstance(sig, signature.ReduceSignature) while not frame.done(): axisreduce_driver.jit_merge_point(frame=frame, self=self, value=value, sig=sig, shapelen=shapelen, ri=ri, - nextval=nextval, dtype=dtype, + dtype=dtype, identity=identity, result=result) - if frame.iterators[0].axis_done: + if frame.axis_done(): + result.dtype.setitem(result.storage, ri.offset, value) if identity is None: value = sig.eval(frame, self.values).convert_to(dtype) frame.next(shapelen) else: value = identity.convert_to(dtype) ri = ri.next(shapelen) - assert isinstance(sig, signature.ReduceSignature) - nextval = sig.eval(frame, self.values).convert_to(dtype) - value = self.binfunc(dtype, value, nextval) - result.dtype.setitem(result.storage, ri.offset, value) + value = self.binfunc(dtype, value, + sig.eval(frame, self.values).convert_to(dtype)) frame.next(shapelen) assert ri.done + result.dtype.setitem(result.storage, ri.offset, value) return result diff --git a/pypy/module/micronumpy/signature.py b/pypy/module/micronumpy/signature.py --- a/pypy/module/micronumpy/signature.py +++ b/pypy/module/micronumpy/signature.py @@ -59,6 +59,12 @@ for i in range(len(self.iterators)): self.iterators[i] = self.iterators[i].next(shapelen) + def axis_done(self): + final_iter = promote(self.final_iter) + if final_iter < 0: + return False + return self.iterators[final_iter].axis_done() + def _add_ptr_to_cache(ptr, cache): i = 0 for p in cache: diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py --- a/pypy/module/micronumpy/test/test_zjit.py +++ b/pypy/module/micronumpy/test/test_zjit.py @@ -127,16 +127,17 @@ def test_axissum(self): result = self.run("axissum") assert result == 30 - self.check_simple_loop({'arraylen_gc': 1, - 'call': 1, - 'getfield_gc': 3, - "getinteriorfield_raw": 1, - "guard_class": 1, - "guard_false": 2, - 'guard_no_exception': 1, - "float_add": 1, - "jump": 1, - 'setinteriorfield_raw': 1, + self.check_simple_loop({\ + 'setarrayitem_gc': 1, + 'getarrayitem_gc': 5, + 'getinteriorfield_raw': 1, + 'arraylen_gc': 2, + 'guard_true': 1, + 'int_sub': 1, + 'int_lt': 1, + 'jump': 1, + 'float_add': 1, + 'int_add': 2, }) def define_prod(): @@ -236,7 +237,8 @@ def test_ufunc(self): result = self.run("ufunc") assert result == -6 - self.check_simple_loop({"getinteriorfield_raw": 2, "float_add": 1, "float_neg": 1, + self.check_simple_loop({"getinteriorfield_raw": 2, "float_add": 1, + "float_neg": 1, "setinteriorfield_raw": 1, "int_add": 2, "int_ge": 1, "guard_false": 1, "jump": 1, 'arraylen_gc': 1}) @@ -346,7 +348,7 @@ result = self.run("setslice") assert result == 11.0 self.check_trace_count(1) - self.check_simple_loop({'getinteriorfield_raw': 2, 'float_add' : 1, + self.check_simple_loop({'getinteriorfield_raw': 2, 'float_add': 1, 'setinteriorfield_raw': 1, 'int_add': 3, 'int_lt': 1, 'guard_true': 1, 'jump': 1, 'arraylen_gc': 3}) @@ -363,11 +365,12 @@ result = self.run("virtual_slice") assert result == 4 self.check_trace_count(1) - self.check_simple_loop({'getinteriorfield_raw': 2, 'float_add' : 1, + self.check_simple_loop({'getinteriorfield_raw': 2, 'float_add': 1, 'setinteriorfield_raw': 1, 'int_add': 2, 'int_ge': 1, 'guard_false': 1, 'jump': 1, 'arraylen_gc': 1}) + class TestNumpyOld(LLJitMixin): def setup_class(cls): py.test.skip("old") @@ -401,4 +404,3 @@ result = self.meta_interp(f, [5], listops=True, backendopt=True) assert result == f(5) - _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit