[pypy-svn] r68264 - in pypy/trunk/pypy/jit/metainterp: . test

pedronis at codespeak.net pedronis at codespeak.net
Fri Oct 9 11:26:40 CEST 2009


Author: pedronis
Date: Fri Oct  9 11:26:38 2009
New Revision: 68264

Modified:
   pypy/trunk/pypy/jit/metainterp/compile.py
   pypy/trunk/pypy/jit/metainterp/jitprof.py
   pypy/trunk/pypy/jit/metainterp/optimize.py
   pypy/trunk/pypy/jit/metainterp/optimizeopt.py
   pypy/trunk/pypy/jit/metainterp/pyjitpl.py
   pypy/trunk/pypy/jit/metainterp/simple_optimize.py
   pypy/trunk/pypy/jit/metainterp/test/test_jitprof.py
   pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
(cfbolz, pedronis) - moure counts, optimized ops/guards and forcings, and aborts
- pass the metainterp staticdata to the optimizers
- sanitize Profiler.print_stats



Modified: pypy/trunk/pypy/jit/metainterp/compile.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/compile.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/compile.py	Fri Oct  9 11:26:38 2009
@@ -59,7 +59,7 @@
     metainterp_sd = metainterp.staticdata
     try:
         old_loop_token = metainterp_sd.state.optimize_loop(
-            metainterp_sd, old_loop_tokens, loop, metainterp.cpu)
+            metainterp_sd, old_loop_tokens, loop)
     except InvalidLoop:
         return None
     if old_loop_token is not None:
@@ -249,8 +249,7 @@
     try:
         target_loop_token = metainterp_sd.state.optimize_bridge(metainterp_sd,
                                                                 old_loop_tokens,
-                                                                new_loop,
-                                                                metainterp.cpu)
+                                                                new_loop)
     except InvalidLoop:
         assert 0, "InvalidLoop in optimize_bridge?"
         return None

Modified: pypy/trunk/pypy/jit/metainterp/jitprof.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/jitprof.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/jitprof.py	Fri Oct  9 11:26:38 2009
@@ -2,6 +2,7 @@
 """ A small helper module for profiling JIT
 """
 
+import os
 import time
 from pypy.rlib.debug import debug_print
 
@@ -14,6 +15,11 @@
 RECORDED_OPS
 BLACKHOLED_OPS
 GUARDS
+OPT_OPS
+OPT_GUARDS
+OPT_FORCINGS
+ABORT_TOO_LONG
+ABORT_BRIDGE
 """
 
 def _setup():
@@ -143,25 +149,36 @@
         cnt = self.counters
         tim = self.times
         calls = self.calls
-        lines = ("Tracing:    \t%d\t%f\n" % (cnt[TRACING],   tim[TRACING]) +
-                 "Backend:    \t%d\t%f\n" % (cnt[BACKEND],   tim[BACKEND]) +
-                 "Running asm:\t%d\t%f\n" % (cnt[RUNNING],   tim[RUNNING]) +
-                 "Blackhole:  \t%d\t%f\n" % (cnt[BLACKHOLE], tim[BLACKHOLE]) +
-                 "TOTAL:      \t\t%f\n" % (self.tk - self.starttime) + 
-                 "ops:           \t%d\n" % cnt[OPS] +
-                 "  calls:       \t%d\n" % calls[0][0] +
-                 "  pure calls:  \t%d\n" % calls[0][1] +                 
-                 "recorded ops:  \t%d\n" % cnt[RECORDED_OPS] +
-                 "  calls:       \t%d\n" % calls[1][0] +
-                 "  pure calls:  \t%d\n" % calls[1][1] +                 
-                 "guards:        \t%d\n" % cnt[GUARDS] +                  
-                 "blackholed ops:\t%d\n" % cnt[BLACKHOLED_OPS] +
-                 "  calls:       \t%d\n" % calls[2][0] +
-                 "  pure calls:  \t%d\n" % calls[2][1]
-                 )
-        import os
-        os.write(2, lines)
-
+        self._print_line_time("Tracing", cnt[TRACING],   tim[TRACING])
+        self._print_line_time("Backend", cnt[BACKEND],   tim[BACKEND])
+        self._print_line_time("Running asm", cnt[RUNNING],   tim[RUNNING])
+        self._print_line_time("Blackhole", cnt[BLACKHOLE], tim[BLACKHOLE])
+        line = "TOTAL:      \t\t%f\n" % (self.tk - self.starttime, )
+        os.write(2, line)
+        self._print_intline("ops", cnt[OPS])
+        self._print_intline("  calls", calls[0][0])
+        self._print_intline("  pure calls", calls[0][1])
+        self._print_intline("recorded ops", cnt[RECORDED_OPS])
+        self._print_intline("  calls", calls[1][0])
+        self._print_intline("  pure calls", calls[1][1])
+        self._print_intline("guards", cnt[GUARDS])
+        self._print_intline("blackholed ops", calls[2][0])
+        self._print_intline("  pure calls", calls[2][1])
+        self._print_intline("opt ops", cnt[OPT_OPS])
+        self._print_intline("opt guards", cnt[OPT_GUARDS])
+        self._print_intline("forcings", cnt[OPT_FORCINGS])
+        self._print_intline("trace too long", cnt[ABORT_BRIDGE])
+
+    def _print_line_time(self, string, i, tim):
+        final = "%s:%s\t%d\t%f\n" % (string, " " * max(0, 13-len(string)), i, tim)
+        os.write(2, final)
+
+    def _print_intline(self, string, i):
+        final = string + ':' + " " * max(0, 16-len(string))
+        final += '\t' + str(i) + '\n'
+        os.write(2, final)
+        
+        
 
 class BrokenProfilerData(Exception):
     pass

Modified: pypy/trunk/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/optimize.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/optimize.py	Fri Oct  9 11:26:38 2009
@@ -4,14 +4,15 @@
 from pypy.jit.metainterp.optimizeopt import optimize_loop_1
 from pypy.jit.metainterp.specnode import equals_specnodes
 
-def optimize_loop(metainterp_sd, old_loop_tokens, loop, cpu):
+def optimize_loop(metainterp_sd, old_loop_tokens, loop):
+    cpu = metainterp_sd.cpu
     metainterp_sd.logger_noopt.log_loop(loop.inputargs, loop.operations)
     finder = PerfectSpecializationFinder(cpu)
     finder.find_nodes_loop(loop)
     for old_loop_token in old_loop_tokens:
         if equals_specnodes(old_loop_token.specnodes, loop.token.specnodes):
             return old_loop_token
-    optimize_loop_1(cpu, loop)
+    optimize_loop_1(metainterp_sd, loop)
     return None
 
 # ____________________________________________________________
@@ -19,14 +20,15 @@
 from pypy.jit.metainterp.optimizefindnode import BridgeSpecializationFinder
 from pypy.jit.metainterp.optimizeopt import optimize_bridge_1
 
-def optimize_bridge(metainterp_sd, old_loop_tokens, bridge, cpu):
+def optimize_bridge(metainterp_sd, old_loop_tokens, bridge):
+    cpu = metainterp_sd.cpu    
     metainterp_sd.logger_noopt.log_loop(bridge.inputargs, bridge.operations)
     finder = BridgeSpecializationFinder(cpu)
     finder.find_nodes_bridge(bridge)
     for old_loop_token in old_loop_tokens:
         if finder.bridge_matches(old_loop_token.specnodes):
             bridge.operations[-1].descr = old_loop_token   # patch jump target
-            optimize_bridge_1(cpu, bridge)
+            optimize_bridge_1(metainterp_sd, bridge)
             return old_loop_token
     return None
 

Modified: pypy/trunk/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/optimizeopt.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/optimizeopt.py	Fri Oct  9 11:26:38 2009
@@ -2,6 +2,7 @@
      ConstFloat
 from pypy.jit.metainterp.history import Const, ConstInt, ConstPtr, ConstObj, REF
 from pypy.jit.metainterp.resoperation import rop, ResOperation
+from pypy.jit.metainterp.jitprof import OPT_OPS, OPT_GUARDS, OPT_FORCINGS
 from pypy.jit.metainterp.executor import execute_nonspec
 from pypy.jit.metainterp.specnode import SpecNode, NotSpecNode, ConstantSpecNode
 from pypy.jit.metainterp.specnode import AbstractVirtualStructSpecNode
@@ -15,21 +16,21 @@
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rpython.lltypesystem import lltype
 
-def optimize_loop_1(cpu, loop):
+def optimize_loop_1(metainterp_sd, loop):
     """Optimize loop.operations to make it match the input of loop.specnodes
     and to remove internal overheadish operations.  Note that loop.specnodes
     must be applicable to the loop; you will probably get an AssertionError
     if not.
     """
-    optimizer = Optimizer(cpu, loop)
+    optimizer = Optimizer(metainterp_sd, loop)
     optimizer.setup_virtuals_and_constants()
     optimizer.propagate_forward()
 
-def optimize_bridge_1(cpu, bridge):
+def optimize_bridge_1(metainterp_sd, bridge):
     """The same, but for a bridge.  The only difference is that we don't
     expect 'specnodes' on the bridge.
     """
-    optimizer = Optimizer(cpu, bridge)
+    optimizer = Optimizer(metainterp_sd, bridge)
     optimizer.propagate_forward()
 
 # ____________________________________________________________
@@ -362,15 +363,17 @@
 
 class Optimizer(object):
 
-    def __init__(self, cpu, loop):
-        self.cpu = cpu
+    def __init__(self, metainterp_sd, loop):
+        self.metainterp_sd = metainterp_sd
+        self.cpu = metainterp_sd.cpu
         self.loop = loop
         self.values = {}
         self.interned_refs = {}
-        self.resumedata_memo = resume.ResumeDataLoopMemo(cpu)
+        self.resumedata_memo = resume.ResumeDataLoopMemo(self.cpu)
         self.heap_op_optimizer = HeapOpOptimizer(self)
 
     def forget_numberings(self, virtualbox):
+        self.metainterp_sd.profiler.count(OPT_FORCINGS)
         self.resumedata_memo.forget_numberings(virtualbox)
 
     def getinterned(self, box):
@@ -513,7 +516,9 @@
                         op = op.clone()
                         must_clone = False
                     op.args[i] = box
+        self.metainterp_sd.profiler.count(OPT_OPS)
         if op.is_guard():
+            self.metainterp_sd.profiler.count(OPT_GUARDS)
             self.store_final_boxes_in_guard(op)
         elif op.can_raise():
             self.exception_might_have_happened = True

Modified: pypy/trunk/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/pyjitpl.py	Fri Oct  9 11:26:38 2009
@@ -12,6 +12,7 @@
 from pypy.jit.metainterp.logger import Logger
 from pypy.jit.metainterp.jitprof import BLACKHOLED_OPS, EmptyProfiler
 from pypy.jit.metainterp.jitprof import GUARDS, RECORDED_OPS
+from pypy.jit.metainterp.jitprof import ABORT_TOO_LONG, ABORT_BRIDGE
 from pypy.rlib.rarithmetic import intmask
 from pypy.rlib.objectmodel import specialize
 from pypy.rlib.jit import DEBUG_OFF, DEBUG_PROFILE, DEBUG_STEPS, DEBUG_DETAILED
@@ -803,6 +804,7 @@
                 try:
                     self.metainterp.reached_can_enter_jit(self.env)
                 except GiveUp:
+                    self.metainterp.staticdata.profiler.count(ABORT_BRIDGE)
                     self.metainterp.switch_to_blackhole()
         if self.metainterp.is_blackholing():
             self.blackhole_reached_merge_point(self.env)
@@ -1315,6 +1317,7 @@
         if not self.is_blackholing():
             warmrunnerstate = self.staticdata.state
             if len(self.history.operations) > warmrunnerstate.trace_limit:
+                self.staticdata.profiler.count(ABORT_TOO_LONG)
                 self.switch_to_blackhole()
 
     def _interpret(self):

Modified: pypy/trunk/pypy/jit/metainterp/simple_optimize.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/simple_optimize.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/simple_optimize.py	Fri Oct  9 11:26:38 2009
@@ -7,7 +7,7 @@
 
 EMPTY_VALUES = {}
 
-def optimize_loop(metainterp_sd, old_loops, loop, cpu=None):
+def optimize_loop(metainterp_sd, old_loops, loop):
     if old_loops:
         assert len(old_loops) == 1
         return old_loops[0]
@@ -16,7 +16,7 @@
         # we need it since the backend can modify those lists, which make
         # get_guard_op in compile.py invalid
         # in fact, x86 modifies this list for moving GCs
-        memo = resume.ResumeDataLoopMemo(cpu)
+        memo = resume.ResumeDataLoopMemo(metainterp_sd.cpu)
         newoperations = []
         for op in loop.operations:
             if op.is_guard():
@@ -29,6 +29,6 @@
         loop.operations = newoperations
         return None
 
-def optimize_bridge(metainterp_sd, old_loops, loop, cpu=None):
-    optimize_loop(metainterp_sd, [], loop, cpu)
+def optimize_bridge(metainterp_sd, old_loops, loop):
+    optimize_loop(metainterp_sd, [], loop)
     return old_loops[0]

Modified: pypy/trunk/pypy/jit/metainterp/test/test_jitprof.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_jitprof.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_jitprof.py	Fri Oct  9 11:26:38 2009
@@ -55,7 +55,7 @@
             ]
         assert profiler.events == expected
         assert profiler.times == [2, 1, 1, 1]
-        assert profiler.counters == [1, 1, 1, 1, 4, 3, 1, 1]
+        assert profiler.counters == [1, 1, 1, 1, 4, 3, 1, 1, 7, 1, 0, 0, 0]
 
     def test_simple_loop_with_call(self):
         @dont_look_inside

Modified: pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py	Fri Oct  9 11:26:38 2009
@@ -10,6 +10,7 @@
 from pypy.jit.metainterp.optimizeopt import optimize_loop_1
 from pypy.jit.metainterp.optimizeutil import InvalidLoop
 from pypy.jit.metainterp.history import AbstractDescr, ConstInt, BoxInt
+from pypy.jit.metainterp.jitprof import EmptyProfiler
 from pypy.jit.metainterp import executor, compile, resume
 from pypy.jit.metainterp.resoperation import rop, opname, ResOperation
 from pypy.jit.metainterp.test.oparser import pure_parse
@@ -22,13 +23,19 @@
         self.jitcode = code
         self.pc = pc
         self.exception_target = exc_target
+
+class FakeMetaInterpStaticData(object):
+
+    def __init__(self, cpu):
+        self.cpu = cpu
+        self.profiler = EmptyProfiler()
     
 def test_store_final_boxes_in_guard():
     from pypy.jit.metainterp.compile import ResumeGuardDescr
     from pypy.jit.metainterp.resume import tag, TAGBOX
     b0 = BoxInt()
     b1 = BoxInt()
-    opt = optimizeopt.Optimizer(None, None)
+    opt = optimizeopt.Optimizer(FakeMetaInterpStaticData(None), None)
     fdescr = ResumeGuardDescr(None)
     op = ResOperation(rop.GUARD_TRUE, [], None, descr=fdescr)
     # setup rd data
@@ -179,7 +186,7 @@
             loop.token.specnodes = self.unpack_specnodes(spectext)
         #
         self.loop = loop
-        optimize_loop_1(self.cpu, loop)
+        optimize_loop_1(FakeMetaInterpStaticData(self.cpu), loop)
         #
         expected = self.parse(optops)
         self.assert_equal(loop, expected)



More information about the Pypy-commit mailing list