[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