Hi. The second follow up patch adds new script which is a simple wrapper around analyze_brprob.py and can be used to dump statistics for results that are in different folder (like SPEC benchmarks).
Sample: ./contrib/analyze_brprob_spec.py --sorting=hitrate /home/marxin/Programming/cpu2006/benchspec/CPU2006/ Sample output: 401.bzip2 HEURISTICS BRANCHES (REL) HITRATE COVERAGE COVERAGE (REL) no prediction 107 14.0% 19.45% / 84.37% 2768134733 2.77G 10.8% opcode values nonequal (on trees) 76 10.0% 32.24% / 85.06% 4034681344 4.03G 15.8% call 95 12.5% 45.50% / 93.31% 152224913 152.22M 0.6% DS theory 275 36.1% 45.56% / 84.30% 7308863904 7.31G 28.6% continue 14 1.8% 48.44% / 73.14% 1479774996 1.48G 5.8% guessed loop iterations 12 1.6% 68.30% / 71.61% 269705737 269.71M 1.1% combined 762 100.0% 69.52% / 89.32% 25553311262 25.55G 100.0% goto 40 5.2% 72.41% / 98.80% 882062676 882.06M 3.5% opcode values positive (on trees) 40 5.2% 76.74% / 88.09% 1394104926 1.39G 5.5% pointer (on trees) 61 8.0% 83.79% / 100.00% 931107 931.11K 0.0% early return (on trees) 31 4.1% 84.39% / 84.41% 2548058402 2.55G 10.0% first match 380 49.9% 89.79% / 92.57% 15476312625 15.48G 60.6% loop exit 316 41.5% 90.09% / 92.88% 15065219828 15.07G 59.0% guess loop iv compare 2 0.3% 99.61% / 99.61% 26987995 26.99M 0.1% loop iv compare 1 0.1% 99.61% / 99.61% 105411 105.41K 0.0% loop iterations 38 5.0% 99.64% / 99.64% 140236649 140.24M 0.5% null return 2 0.3% 100.00% / 100.00% 18 18.00 0.0% noreturn call 13 1.7% 100.00% / 100.00% 1045000 1.04M 0.0% const return 2 0.3% 100.00% / 100.00% 816 816.00 0.0% negative return 62 8.1% 100.00% / 100.00% 618097152 618.10M 2.4% 410.bwaves HEURISTICS BRANCHES (REL) HITRATE COVERAGE COVERAGE (REL) call 1 0.6% 0.00% / 100.00% 20 20.00 0.0% no prediction 6 3.7% 0.28% / 99.72% 2704184 2.70M 0.1% opcode values nonequal (on trees) 4 2.4% 60.00% / 70.00% 200 200.00 0.0% loop iterations 7 4.3% 80.00% / 80.00% 112892000 112.89M 2.4% first match 83 50.6% 81.67% / 81.67% 4393885465 4.39G 92.1% loop exit 76 46.3% 81.71% / 81.71% 4280993465 4.28G 89.8% combined 164 100.0% 83.05% / 83.11% 4768545507 4.77G 100.0% DS theory 75 45.7% 100.00% / 100.00% 371955858 371.96M 7.8% early return (on trees) 3 1.8% 100.00% / 100.00% 688 688.00 0.0% opcode values positive (on trees) 71 43.3% 100.00% / 100.00% 371955658 371.96M 7.8% ... Thanks, Martin
>From ca9806bf77bd90df43913f5f1552ed16379dcf38 Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Fri, 3 Jun 2016 12:46:43 +0200 Subject: [PATCH 4/4] Add new analyze_brprob_spec.py script contrib/ChangeLog: 2016-06-08 Martin Liska <mli...@suse.cz> * analyze_brprob_spec.py: New file. --- contrib/analyze_brprob_spec.py | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100755 contrib/analyze_brprob_spec.py diff --git a/contrib/analyze_brprob_spec.py b/contrib/analyze_brprob_spec.py new file mode 100755 index 0000000..a28eaac --- /dev/null +++ b/contrib/analyze_brprob_spec.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +# This file is part of GCC. +# +# GCC is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 3, or (at your option) any later +# version. +# +# GCC is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. */ + +import sys +import os +import subprocess +import tempfile +import argparse + +script_location = os.path.realpath(__file__) + +parser = argparse.ArgumentParser() +parser.add_argument('location', metavar = 'dump_file', help = 'Location with SPEC benchmarks') +parser.add_argument('-s', '--sorting', dest = 'sorting', choices = ['branches', 'hitrate', 'coverage'], default = 'branches') + +args = parser.parse_args() + +benchmarks = os.listdir(args.location) + +for b in sorted(benchmarks): + dumps = [] + for root, dirs, files in os.walk(os.path.join(args.location, b)): + for x in files: + if x.endswith('.profile'): + dumps.append(os.path.join(root, x)) + + if len(dumps) == 0: + continue + + temp = tempfile.NamedTemporaryFile(delete = False) + for d in dumps: + temp.write(open(d, 'rb').read()) + + temp.close() + + print() + print(b) + sys.stdout.flush() + p = [os.path.join(os.path.dirname(script_location), 'analyze_brprob.py'), temp.name, '--sorting', args.sorting] + p = subprocess.check_call(p) + sys.stdout.flush() + + os.remove(temp.name) -- 2.8.3