Author: Remi Meier <remi.me...@inf.ethz.ch> Branch: stmgc-c8-gcc Changeset: r79178:b9bb7b46ca8e Date: 2015-08-24 10:20 +0200 http://bitbucket.org/pypy/pypy/changeset/b9bb7b46ca8e/
Log: hack to re-add blackhole interp caching Currently leaks the interps of dead threads (needs fix). It improves the performance of 'pixie' annotation > rpython --thread --no- shared --gcrootfinder=shadowstack --continuation -O2 --annotate target.py from ~63s down to ~42s (pypy2.6 ~29s). diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py --- a/rpython/jit/metainterp/blackhole.py +++ b/rpython/jit/metainterp/blackhole.py @@ -39,6 +39,40 @@ # ____________________________________________________________ +from rpython.rlib import rthread#, rstm +# from rpython.rtyper.annlowlevel import cast_gcref_to_instance +# from rpython.rtyper.annlowlevel import cast_instance_to_gcref + +class BlackholeInterpreterCache(object): + # XXX: How to free bhis from dead threads? + # A callback from rthread.gc_thread_die? + # stm_hashtable to avoid conflicts when starting many threads? + + def __init__(self): + assert rgc.stm_is_enabled() + self.stm_blackholeinterps = {} + + def get_or_create(self, builder): + assert rgc.stm_is_enabled() + # conflicts with new threads calling put_back + + ident = rthread.get_ident() + interps = self.stm_blackholeinterps.get(ident, None) + if interps is not None and len(interps) > 0: + return interps.pop() + return BlackholeInterpreter(builder, 0) + + def put_back(self, interp): + assert rgc.stm_is_enabled() + + ident = rthread.get_ident() + interps = self.stm_blackholeinterps.get(ident, None) + if interps is None: + interps = self.stm_blackholeinterps.setdefault(ident, []) + + interp.cleanup_registers() + interps.append(interp) + class BlackholeInterpBuilder(object): verbose = True @@ -51,6 +85,7 @@ self.metainterp_sd = metainterp_sd self.num_interpreters = 0 self.blackholeinterps = [] + self.stm_cache = None def _cleanup_(self): # XXX don't assign a different list to blackholeinterp here, @@ -233,19 +268,25 @@ return handler def acquire_interp(self): - if rgc.stm_is_enabled(): # XXX for now, no caching - return BlackholeInterpreter(self, 0) - if len(self.blackholeinterps) > 0: - return self.blackholeinterps.pop() + if rgc.stm_is_enabled(): + if self.stm_cache is None: + self.stm_cache = BlackholeInterpreterCache() + return self.stm_cache.get_or_create(self) else: - self.num_interpreters += 1 - return BlackholeInterpreter(self, self.num_interpreters) + # no STM: + if len(self.blackholeinterps) > 0: + return self.blackholeinterps.pop() + else: + self.num_interpreters += 1 + return BlackholeInterpreter(self, self.num_interpreters) def release_interp(self, interp): if rgc.stm_is_enabled(): # XXX for now, no caching - return - interp.cleanup_registers() - self.blackholeinterps.append(interp) + self.stm_cache.put_back(interp) + else: + # no STM: + interp.cleanup_registers() + self.blackholeinterps.append(interp) def check_shift_count(b): if not we_are_translated(): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit