Author: Richard Plangger <[email protected]>
Branch: vecopt2
Changeset: r77066:445111858952
Date: 2015-03-10 17:47 +0100
http://bitbucket.org/pypy/pypy/changeset/445111858952/
Log: moved around my optimizer files, unrolling does not get it' own file
the unroller now takes the type contained in the array into account
e.g. 16 byte vec. register -> data type is 8 byte -> unroll 2 times
added test to ensure this refactored testcases & vector opt
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
@@ -8,7 +8,7 @@
from rpython.jit.metainterp.optimizeopt.simplify import OptSimplify
from rpython.jit.metainterp.optimizeopt.pure import OptPure
from rpython.jit.metainterp.optimizeopt.earlyforce import OptEarlyForce
-from rpython.jit.metainterp.optimizeopt.unfold import optimize_unfold
+from rpython.jit.metainterp.optimizeopt.vectorize import optimize_vector
from rpython.rlib.jit import PARAMETERS, ENABLE_ALL_OPTS
from rpython.rlib.unroll import unrolling_iterable
from rpython.rlib.debug import debug_start, debug_stop, debug_print
@@ -21,8 +21,7 @@
('earlyforce', OptEarlyForce),
('pure', OptPure),
('heap', OptHeap),
- ('unroll', None),
- ('unfold', None)]
+ ('unroll', None)]
# no direct instantiation of unroll
unroll_all_opts = unrolling_iterable(ALL_OPTS)
@@ -36,7 +35,6 @@
def build_opt_chain(metainterp_sd, enable_opts):
optimizations = []
unroll = 'unroll' in enable_opts # 'enable_opts' is normally a dict
- unfold = 'unfold' in enable_opts
for name, opt in unroll_all_opts:
if name in enable_opts:
if opt is not None:
@@ -46,10 +44,9 @@
if ('rewrite' not in enable_opts or 'virtualize' not in enable_opts
or 'heap' not in enable_opts or 'unroll' not in enable_opts
or 'pure' not in enable_opts):
- if 'unfold' not in enable_opts: # TODO
- optimizations.append(OptSimplify(unroll))
+ optimizations.append(OptSimplify(unroll))
- return optimizations, unroll, unfold
+ return optimizations, unroll
def optimize_trace(metainterp_sd, jitdriver_sd, loop, enable_opts,
inline_short_preamble=True, start_state=None,
@@ -61,19 +58,14 @@
try:
loop.logops = metainterp_sd.logger_noopt.log_loop(loop.inputargs,
loop.operations)
- optimizations, unroll, unfold = build_opt_chain(metainterp_sd,
enable_opts)
- if unfold:
- return optimize_unfold(metainterp_sd,
- jitdriver_sd,
- loop,
- optimizations,
- start_state,
- export_state)
+ optimizations, unroll = build_opt_chain(metainterp_sd, enable_opts)
+ if jitdriver_sd.vectorize:
+ return optimize_vector(metainterp_sd, jitdriver_sd, loop,
+ optimizations, start_state, export_state)
elif unroll:
return optimize_unroll(metainterp_sd, jitdriver_sd, loop,
- optimizations,
- inline_short_preamble, start_state,
- export_state)
+ optimizations, inline_short_preamble,
+ start_state, export_state)
else:
optimizer = Optimizer(metainterp_sd, jitdriver_sd, loop,
optimizations)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -154,6 +154,7 @@
arraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Signed))
floatarraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Float))
+ chararraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Char))
# a GcStruct not inheriting from OBJECT
S = lltype.GcStruct('TUPLE', ('a', lltype.Signed), ('b', lltype.Ptr(NODE)))
@@ -360,6 +361,9 @@
class BaseTest(object):
+ class DefaultFakeJitDriverStaticData(object):
+ vectorize = False
+
def parse(self, s, boxkinds=None, want_fail_descr=True, postprocess=None):
self.oparse = OpParser(s, self.cpu, self.namespace, 'lltype',
boxkinds,
@@ -403,8 +407,11 @@
metainterp_sd.virtualref_info = self.vrefinfo
if hasattr(self, 'callinfocollection'):
metainterp_sd.callinfocollection = self.callinfocollection
+ jitdriver_sd = BaseTest.DefaultFakeJitDriverStaticData()
+ if hasattr(self, 'jitdriver_sd'):
+ jitdriver_sd = self.jitdriver_sd
#
- return optimize_trace(metainterp_sd, None, loop,
+ return optimize_trace(metainterp_sd, jitdriver_sd, loop,
self.enable_opts,
start_state=start_state,
export_state=export_state)
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
@@ -70,7 +70,7 @@
inline=False, loop_longevity=0, retrace_limit=5,
function_threshold=4,
enable_opts=ALL_OPTS_NAMES, max_retrace_guards=15,
- max_unroll_recursion=7, **kwds):
+ max_unroll_recursion=7, vectorize=0, **kwds):
from rpython.config.config import ConfigError
translator = interp.typer.annotator.translator
try:
@@ -93,6 +93,7 @@
jd.warmstate.set_param_max_retrace_guards(max_retrace_guards)
jd.warmstate.set_param_enable_opts(enable_opts)
jd.warmstate.set_param_max_unroll_recursion(max_unroll_recursion)
+ jd.warmstate.set_param_vectorize(vectorize)
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
@@ -296,6 +296,10 @@
if self.warmrunnerdesc.memory_manager:
self.warmrunnerdesc.memory_manager.max_unroll_recursion = value
+ def set_param_vectorize(self, value):
+ if self.warmrunnerdesc:
+ self.warmrunnerdesc.vectorize = 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
@@ -448,7 +448,7 @@
"""Inconsistency in the JIT hints."""
ENABLE_ALL_OPTS = (
- 'intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll:unfold')
+ 'intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll')
PARAMETER_DOCS = {
'threshold': 'number of times a loop has to run for it to become hot',
@@ -463,7 +463,8 @@
'max_unroll_loops': 'number of extra unrollings a loop can cause',
'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'
+ 'max_unroll_recursion': 'how many levels deep to unroll a recursive
function',
+ 'vectorize': 'try to vectorize loops instead of unrolling them. This only
works if the cpu model has the sse2 instruction set and the jit driver defines
that there is possibility for unrolling',
}
PARAMETERS = {'threshold': 1039, # just above 1024, prime
@@ -478,6 +479,7 @@
'max_unroll_loops': 0,
'enable_opts': 'all',
'max_unroll_recursion': 7,
+ 'vectorize': 0,
}
unroll_parameters = unrolling_iterable(PARAMETERS.items())
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit