[pypy-commit] pypy vecopt: added a vectorize_user parameter to try the vectorization on user code (array[i], numpy.array[i]), removed some old checks for test_axissum

plan_rich noreply at buildbot.pypy.org
Wed May 27 11:14:22 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77618:c5bf438f0e12
Date: 2015-05-27 11:13 +0200
http://bitbucket.org/pypy/pypy/changeset/c5bf438f0e12/

Log:	added a vectorize_user parameter to try the vectorization on user
	code (array[i], numpy.array[i]), removed some old checks for
	test_axissum

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
@@ -285,7 +285,7 @@
         """
 
     def test_pow(self):
-        py.test.skip()
+        py.test.skip("Not implemented CDefinedIntSymbolic('RPY_TLOFS_rpy_errno')")
         result = self.run("pow")
         assert result == 29 ** 2
         self.check_trace_count(1)
@@ -299,7 +299,7 @@
         """
 
     def test_pow_int(self):
-        py.test.skip()
+        py.test.skip("Not implemented CDefinedIntSymbolic('RPY_TLOFS_rpy_errno')")
         result = self.run("pow_int")
         assert result == 15 ** 2
         self.check_trace_count(4)  # extra one for the astype
@@ -335,52 +335,10 @@
         """
 
     def test_axissum(self):
-        py.test.skip()
         result = self.run("axissum")
         assert result == 30
         # XXX note - the bridge here is fairly crucial and yet it's pretty
         #            bogus. We need to improve the situation somehow.
-        self.check_trace_count(2)
-        self.check_simple_loop({
-            'float_add': 1,
-            'getarrayitem_gc': 2,
-            'guard_false': 2,
-            'guard_not_invalidated': 1,
-            'guard_true': 1,
-            'int_add': 4,
-            'int_ge': 1,
-            'int_is_zero': 1,
-            'int_lt': 1,
-            'jump': 1,
-            'raw_load': 2,
-            'raw_store': 1,
-            'setarrayitem_gc': 1,
-        })
-        self.check_resops({
-            'float_add': 2,
-            'getarrayitem_gc': 5,
-            'getarrayitem_gc_pure': 7,
-            'getfield_gc': 5,
-            'getfield_gc_pure': 51,
-            'guard_class': 3,
-            'guard_false': 12,
-            'guard_nonnull': 11,
-            'guard_nonnull_class': 3,
-            'guard_not_invalidated': 2,
-            'guard_true': 10,
-            'guard_value': 6,
-            'int_add': 13,
-            'int_ge': 4,
-            'int_is_true': 3,
-            'int_is_zero': 4,
-            'int_le': 2,
-            'int_lt': 3,
-            'int_sub': 1,
-            'jump': 2,
-            'raw_load': 4,
-            'raw_store': 2,
-            'setarrayitem_gc': 4,
-        })
 
     def define_reduce():
         return """
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -552,7 +552,7 @@
 
 class BoxVector(Box, PrimitiveTypeMixin):
     type = VECTOR
-    _attrs_ = ('item_type','item_count','item_size','signed')
+    _attrs_ = ('item_type','item_count','item_size','item_signed')
     _extended_display = False
 
     def __init__(self, item_type=FLOAT, item_count=2, item_size=8, item_signed=False):
diff --git a/rpython/jit/metainterp/optimizeopt/__init__.py b/rpython/jit/metainterp/optimizeopt/__init__.py
--- a/rpython/jit/metainterp/optimizeopt/__init__.py
+++ b/rpython/jit/metainterp/optimizeopt/__init__.py
@@ -68,7 +68,9 @@
                                                           loop.operations)
         optimizations, unroll = build_opt_chain(metainterp_sd, enable_opts)
         if unroll:
-            if not export_state and warmstate.vectorize and jitdriver_sd.vectorize:
+            if not export_state and \
+                ((warmstate.vectorize and jitdriver_sd.vectorize) \
+                 or warmstate.vectorize_user):
                 optimize_vector(metainterp_sd, jitdriver_sd, loop, optimizations,
                                 inline_short_preamble, start_state)
             else:
diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py b/rpython/jit/metainterp/optimizeopt/dependency.py
--- a/rpython/jit/metainterp/optimizeopt/dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -986,6 +986,7 @@
         return mycoeff + self.constant - (othercoeff + other.constant)
 
     def emit_operations(self, opt, result_box=None):
+        assert not self.is_identity()
         box = self.var
         last_op = None
         if self.coefficient_mul != 1:
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
@@ -609,7 +609,6 @@
             return key
         return (None, 0, None)
 
-
     def get_key(self, guard_bool, operations, i):
         cmp_op = self.find_compare_guard_bool(guard_bool.getarg(0), operations, i)
         return self._get_key(cmp_op)
@@ -672,8 +671,9 @@
                         self.emit_operation(ResOperation(rop.SAME_AS, [box], op.result))
                         continue
                     else:
-                        index_var.emit_operations(self, op.result)
-                        continue
+                        if not index_var.is_identity():
+                            index_var.emit_operations(self, op.result)
+                            continue
             self.emit_operation(op)
 
         loop.operations = self._newoperations[:]
@@ -756,11 +756,11 @@
         return self.arg_ptypes[i] is not None
 
     def pack_ptype(self, op):
-        _, vbox = self.getvector_of_box(op.getarg(0))
+        _, vbox = self.sched_data.getvector_of_box(op.getarg(0))
         if vbox:
             return PackType.of(vbox)
         else:
-            raise RuntimeError("fatal: box %s is not in a vector box" % (arg,))
+            raise RuntimeError("fatal: box %s is not in a vector box" % (op.getarg(0),))
 
     def as_vector_operation(self, pack, sched_data, oplist):
         self.sched_data = sched_data
@@ -852,7 +852,7 @@
         # The instruction takes less items than the vector has.
         # Unpack if not at off 0
         if off != 0 and box_pos != 0:
-            vbox = self.unpack(vbox, off, count, arg_ptype)
+            vbox = self.unpack(vbox, off, len(ops), arg_ptype)
         #
         return vbox
 
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
@@ -73,7 +73,8 @@
                     inline=False, loop_longevity=0, retrace_limit=5,
                     function_threshold=4,
                     enable_opts=ALL_OPTS_NAMES, max_retrace_guards=15, 
-                    max_unroll_recursion=7, vectorize=0, **kwds):
+                    max_unroll_recursion=7, vectorize=0, vectorize_user=0,
+                    **kwds):
     from rpython.config.config import ConfigError
     translator = interp.typer.annotator.translator
     try:
@@ -97,6 +98,7 @@
         jd.warmstate.set_param_enable_opts(enable_opts)
         jd.warmstate.set_param_max_unroll_recursion(max_unroll_recursion)
         jd.warmstate.set_param_vectorize(vectorize)
+        jd.warmstate.set_param_vectorize_user(vectorize_user)
     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
@@ -300,6 +300,9 @@
     def set_param_vectorize(self, value):
         self.vectorize = bool(value)
 
+    def set_param_vectorize_user(self, value):
+        self.vectorize_user = bool(value)
+
     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
@@ -552,7 +552,8 @@
     'enable_opts': 'INTERNAL USE ONLY (MAY NOT WORK OR LEAD TO CRASHES): '
                    'optimizations to enable, or all = %s' % ENABLE_ALL_OPTS,
     'max_unroll_recursion': 'how many levels deep to unroll a recursive function',
-    'vectorize': 'turn on the vectorization optimization. requires sse4.1',
+    'vectorize': 'turn on the vectorization optimization (vecopt). requires sse4.1',
+    'vectorize_user': 'turn on the vecopt for the python user program. requires sse4.1',
     }
 
 PARAMETERS = {'threshold': 1039, # just above 1024, prime
@@ -568,6 +569,7 @@
               'enable_opts': 'all',
               'max_unroll_recursion': 7,
               'vectorize': 0,
+              'vectorize_user': 0,
               }
 unroll_parameters = unrolling_iterable(PARAMETERS.items())
 


More information about the pypy-commit mailing list