[pypy-svn] pypy default: (fijal, mitsuhiko, alex): improved cache estimation for gc nursery on OS X
mitsuhiko
commits-noreply at bitbucket.org
Mon Mar 14 00:27:05 CET 2011
Author: Armin Ronacher <armin.ronacher at active-4.com>
Branch:
Changeset: r42581:c56da18c083e
Date: 2011-03-13 19:26 -0400
http://bitbucket.org/pypy/pypy/changeset/c56da18c083e/
Log: (fijal, mitsuhiko, alex): improved cache estimation for gc nursery
on OS X
diff --git a/pypy/tool/jitlogparser/parser.py b/pypy/tool/jitlogparser/parser.py
--- a/pypy/tool/jitlogparser/parser.py
+++ b/pypy/tool/jitlogparser/parser.py
@@ -108,6 +108,7 @@
self.operations = operations
self.storage = storage
self.code = storage.disassemble_code(self.filename, self.startlineno)
+ assert self.code is not None, 'could not find source file'
def repr(self):
if self.filename is None:
diff --git a/pypy/rpython/memory/gc/env.py b/pypy/rpython/memory/gc/env.py
--- a/pypy/rpython/memory/gc/env.py
+++ b/pypy/rpython/memory/gc/env.py
@@ -190,44 +190,55 @@
rffi.VOIDP, rffi.SIZE_T],
rffi.INT,
sandboxsafe=True)
+
+def get_darwin_cache_size(cache_key):
+ cache_p = lltype.malloc(rffi.LONGLONGP.TO, 1, flavor='raw')
+ try:
+ len_p = lltype.malloc(rffi.SIZE_TP.TO, 1, flavor='raw')
+ try:
+ size = rffi.sizeof(rffi.LONGLONG)
+ cache_p[0] = rffi.cast(rffi.LONGLONG, 0)
+ len_p[0] = rffi.cast(rffi.SIZE_T, size)
+ # XXX a hack for llhelper not being robust-enough
+ result = sysctlbyname(cache_key,
+ rffi.cast(rffi.VOIDP, cache_p),
+ len_p,
+ lltype.nullptr(rffi.VOIDP.TO),
+ rffi.cast(rffi.SIZE_T, 0))
+ if (rffi.cast(lltype.Signed, result) == 0 and
+ rffi.cast(lltype.Signed, len_p[0]) == size):
+ cache = rffi.cast(lltype.Signed, cache_p[0])
+ if rffi.cast(rffi.LONGLONG, cache) != cache_p[0]:
+ cache = 0 # overflow!
+ return cache
+ finally:
+ lltype.free(len_p, flavor='raw')
+ finally:
+ lltype.free(cache_p, flavor='raw')
+
+
def get_L2cache_darwin():
"""Try to estimate the best nursery size at run-time, depending
on the machine we are running on.
"""
debug_start("gc-hardware")
- L2cache = 0
- l2cache_p = lltype.malloc(rffi.LONGLONGP.TO, 1, flavor='raw')
- try:
- len_p = lltype.malloc(rffi.SIZE_TP.TO, 1, flavor='raw')
- try:
- size = rffi.sizeof(rffi.LONGLONG)
- l2cache_p[0] = rffi.cast(rffi.LONGLONG, 0)
- len_p[0] = rffi.cast(rffi.SIZE_T, size)
- # XXX a hack for llhelper not being robust-enough
- result = sysctlbyname("hw.l2cachesize",
- rffi.cast(rffi.VOIDP, l2cache_p),
- len_p,
- lltype.nullptr(rffi.VOIDP.TO),
- rffi.cast(rffi.SIZE_T, 0))
- if (rffi.cast(lltype.Signed, result) == 0 and
- rffi.cast(lltype.Signed, len_p[0]) == size):
- L2cache = rffi.cast(lltype.Signed, l2cache_p[0])
- if rffi.cast(rffi.LONGLONG, L2cache) != l2cache_p[0]:
- L2cache = 0 # overflow!
- finally:
- lltype.free(len_p, flavor='raw')
- finally:
- lltype.free(l2cache_p, flavor='raw')
+ L2cache = get_darwin_cache_size("hw.l2cachesize")
+ L3cache = get_darwin_cache_size("hw.l3cachesize")
debug_print("L2cache =", L2cache)
+ debug_print("L3cache =", L3cache)
debug_stop("gc-hardware")
- if L2cache > 0:
- return L2cache
+
+ mangled = L2cache + L3cache
+
+ if mangled > 0:
+ return mangled
else:
# Print a top-level warning even in non-debug builds
llop.debug_print(lltype.Void,
"Warning: cannot find your CPU L2 cache size with sysctl()")
return -1
+
# --------------------
get_L2cache = globals().get('get_L2cache_' + sys.platform,
More information about the Pypy-commit
mailing list