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

Reply via email to