[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