[pypy-commit] pypy release-5.x: (s390x) parsing of /proc/cpuinfo is now more robust,
plan_rich
pypy.commits at gmail.com
Thu May 12 12:02:57 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch: release-5.x
Changeset: r84407:951eeca3bc24
Date: 2016-05-12 17:13 +0200
http://bitbucket.org/pypy/pypy/changeset/951eeca3bc24/
Log: (s390x) parsing of /proc/cpuinfo is now more robust, fixed issue
that followed with the last commit for s390x in the allocator
diff --git a/rpython/jit/backend/zarch/regalloc.py b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -326,6 +326,7 @@
# old even var is not forbidden, sync it and be done with it
self._sync_var(old_even_var)
del self.reg_bindings[old_even_var]
+ del reverse_mapping[odd]
if old_odd_var:
if old_odd_var in forbidden_vars:
self._relocate_forbidden_variable(odd, old_odd_var, reverse_mapping,
@@ -333,6 +334,7 @@
else:
self._sync_var(old_odd_var)
del self.reg_bindings[old_odd_var]
+ del reverse_mapping[odd]
self.reg_bindings[even_var] = even
self.reg_bindings[odd_var] = odd
@@ -359,11 +361,11 @@
if candidate_var is not None:
self._sync_var(candidate_var)
del self.reg_bindings[candidate_var]
+ del reverse_mapping[candidate]
self.assembler.regalloc_mov(reg, candidate)
assert var is not None
self.reg_bindings[var] = candidate
reverse_mapping[candidate] = var
- self.free_regs.append(reg)
break
else:
raise NoVariableToSpill
diff --git a/rpython/memory/gc/env.py b/rpython/memory/gc/env.py
--- a/rpython/memory/gc/env.py
+++ b/rpython/memory/gc/env.py
@@ -210,7 +210,7 @@
"Warning: cannot find your CPU L2 cache size in /proc/cpuinfo")
return -1
-def get_L2cache_linux2_cpuinfo_s390x(filename="/proc/cpuinfo", label='cache3'):
+def get_L2cache_linux2_cpuinfo_s390x(filename="/proc/cpuinfo", label='cache2'):
debug_start("gc-hardware")
L2cache = sys.maxint
try:
@@ -230,32 +230,21 @@
data = ''.join(data)
linepos = 0
while True:
+ print linepos
start = _findend(data, '\n' + label, linepos)
if start < 0:
break # done
- linepos = _findend(data, '\n', start)
- if linepos < 0:
- break # no end-of-line??
- # *** data[start:linepos] == " : level=2 type=Instruction scope=Private size=2048K ..."
- start = _skipspace(data, start)
- if data[start] != ':':
+ start = _findend(data, 'size=', start)
+ if start < 0:
+ break
+ end = _findend(data, ' ', start) - 1
+ if end < 0:
+ break
+ linepos = end
+ size = data[start:end]
+ if size[len(size)-1] not in ('K', 'k'): # assume kilobytes for now
continue
- # *** data[start:linepos] == ": level=2 type=Instruction scope=Private size=2048K ..."
- start = _skipspace(data, start + 1)
- # *** data[start:linepos] == "level=2 type=Instruction scope=Private size=2048K ..."
- start += 44
- end = start
- while '0' <= data[end] <= '9':
- end += 1
- # *** data[start:end] == "2048"
- if start == end:
- continue
- number = int(data[start:end])
- # *** data[end:linepos] == " KB\n"
- end = _skipspace(data, end)
- if data[end] not in ('K', 'k'): # assume kilobytes for now
- continue
- number = number * 1024
+ number = int(size[:len(size)-1])* 1024
# for now we look for the smallest of the L2 caches of the CPUs
if number < L2cache:
L2cache = number
diff --git a/rpython/memory/gc/test/test_env.py b/rpython/memory/gc/test/test_env.py
--- a/rpython/memory/gc/test/test_env.py
+++ b/rpython/memory/gc/test/test_env.py
@@ -162,21 +162,31 @@
result = env.get_L2cache_linux2_cpuinfo(str(filepath))
assert result == 3072 * 1024
-def test_estimate_best_nursery_size_linux2_s390x():
+def test_estimate_nursery_s390x():
filepath = udir.join('estimate_best_nursery_size_linux2')
filepath.write("""\
vendor_id : IBM/S390
# processors : 2
bogomips per cpu: 20325.00
-features : esan3 zarch stfle msa ldisp eimm dfp etf3eh highgprs
-cache0 : level=1 type=Data scope=Private size=128K line_size=256 associativity=8
-cache1 : level=1 type=Instruction scope=Private size=96K line_size=256 associativity=6
+...
cache2 : level=2 type=Data scope=Private size=2048K line_size=256 associativity=8
cache3 : level=2 type=Instruction scope=Private size=2048K line_size=256 associativity=8
-cache4 : level=3 type=Unified scope=Shared size=65536K line_size=256 associativity=16
-cache5 : level=4 type=Unified scope=Shared size=491520K line_size=256 associativity=30
-processor 0: version = FF, identification = 026A77, machine = 2964
-processor 1: version = FF, identification = 026A77, machine = 2964
+...
""")
result = env.get_L2cache_linux2_cpuinfo_s390x(str(filepath))
assert result == 2048 * 1024
+
+ filepath = udir.join('estimate_best_nursery_size_linux3')
+ filepath.write("""\
+vendor_id : IBM/S390
+# processors : 2
+bogomips per cpu: 9398.00
+...
+cache2 : level=2 type=Unified scope=Private size=1536K line_size=256 associativity=12
+cache3 : level=3 type=Unified scope=Shared size=24576K line_size=256 associativity=12
+...
+""")
+ result = env.get_L2cache_linux2_cpuinfo_s390x(str(filepath), label='cache3')
+ assert result == 24576 * 1024
+ result = env.get_L2cache_linux2_cpuinfo_s390x(str(filepath), label='cache2')
+ assert result == 1536 * 1024
More information about the pypy-commit
mailing list