From patchwork Fri Dec 9 10:40:37 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 87415 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp236148qgi; Fri, 9 Dec 2016 02:41:18 -0800 (PST) X-Received: by 10.99.230.83 with SMTP id p19mr140279699pgj.138.1481280078455; Fri, 09 Dec 2016 02:41:18 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id c135si33290746pfb.131.2016.12.09.02.41.17 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 09 Dec 2016 02:41:18 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-443883-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-443883-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-443883-patch=linaro.org@gcc.gnu.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:to:references:cc:from:message-id:date:mime-version :in-reply-to:content-type; q=dns; s=default; b=KvhowLaid3VATJMfw dGMg8Phh3HDz3eYTCIaakCdkubyhWn9cAhQgRa6YUbc1BY9yegn+E2BUWMoMMteA kgE76WKUi4GKAt57PE42ysY6bZGDQYaQWOBvhXjSdQyob1r/AtnwWqfT75kRw7Im Eo2YGfkCI4yo031mqIsMcI04D4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:to:references:cc:from:message-id:date:mime-version :in-reply-to:content-type; s=default; bh=irFbasUxhFSNyROEEQBalLE D2do=; b=SVM1ElPQY0TjnnwoDONIL/L2FXtHDqhOqPDEMTKg4kz8TVFQqhHj31k wSroxY2tfMhLTQWQ+ObchyQpumug0YniY1zODMNZpnMprpUvPnXWJY2jm1PjBgxY A+A2IvuYH31ZktIhth/JHw8zga3hBKGOiiLIGdzNKjCaRyusPJho= Received: (qmail 68081 invoked by alias); 9 Dec 2016 10:41:01 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 67928 invoked by uid 89); 9 Dec 2016 10:40:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00, SPF_PASS autolearn=ham version=3.3.2 spammy=squash, 1000.0, H*MI:sk:e9ef35f, 1066 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 09 Dec 2016 10:40:39 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 900F5AAB7; Fri, 9 Dec 2016 10:40:37 +0000 (UTC) Subject: Re: [PATCH] Enhance analyze_brprob script To: GCC Patches References: Cc: Jan Hubicka From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Message-ID: Date: Fri, 9 Dec 2016 11:40:37 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: X-IsSubscribed: yes On 12/09/2016 11:02 AM, Martin Liška wrote: > Following patch enhances scripts and fixed various small issues. > > Ready to be installed? > > Martin > I forgot to squash commits, this is the right patch. M. >From c64469dcdf114ab3a432a9006be3d291df62b8a1 Mon Sep 17 00:00:00 2001 From: marxin Date: Thu, 8 Dec 2016 18:01:15 +0100 Subject: [PATCH] Enhance analyze_brprob script contrib/ChangeLog: 2016-12-09 Martin Liska * analyze_brprob.py: Add new column to output and new sorting option. Fix coding style to not exceed 80 characters. * analyze_brprob_spec.py: Add new sorting option. Fix coding style to not exceed 80 characters. --- contrib/analyze_brprob.py | 80 +++++++++++++++++++++++++++++++++--------- contrib/analyze_brprob_spec.py | 10 ++++-- 2 files changed, 70 insertions(+), 20 deletions(-) diff --git a/contrib/analyze_brprob.py b/contrib/analyze_brprob.py index c083d2b..b4dbbc4 100755 --- a/contrib/analyze_brprob.py +++ b/contrib/analyze_brprob.py @@ -69,6 +69,9 @@ import argparse from math import * +counter_aggregates = set(['combined', 'first match', 'DS theory', + 'no prediction']) + def percentage(a, b): return 100.0 * a / b @@ -91,12 +94,16 @@ class Summary: def __init__(self, name): self.name = name self.branches = 0 + self.successfull_branches = 0 self.count = 0 self.hits = 0 self.fits = 0 def get_hitrate(self): - return self.hits / self.count + return 100.0 * self.hits / self.count + + def get_branch_hitrate(self): + return 100.0 * self.successfull_branches / self.branches def count_formatted(self): v = self.count @@ -106,6 +113,16 @@ class Summary: v /= 1000.0 return "%.1f%s" % (v, 'Y') + def print(self, branches_max, count_max): + print('%-40s %8i %5.1f%% %11.2f%% %7.2f%% / %6.2f%% %14i %8s %5.1f%%' % + (self.name, self.branches, + percentage(self.branches, branches_max), + self.get_branch_hitrate(), + self.get_hitrate(), + percentage(self.fits, self.count), + self.count, self.count_formatted(), + percentage(self.count, count_max))) + class Profile: def __init__(self, filename): self.filename = filename @@ -118,11 +135,16 @@ class Profile: s = self.heuristics[name] s.branches += 1 + s.count += count if prediction < 50: hits = count - hits + remaining = count - hits + if hits >= remaining: + s.successfull_branches += 1 + s.hits += hits - s.fits += max(hits, count - hits) + s.fits += max(hits, remaining) def add_loop_niter(self, niter): if niter > 0: @@ -134,20 +156,40 @@ class Profile: def count_max(self): return max([v.count for k, v in self.heuristics.items()]) - def dump(self, sorting): - sorter = lambda x: x[1].branches - if sorting == 'hitrate': - sorter = lambda x: x[1].get_hitrate() + def print_group(self, sorting, group_name, heuristics): + count_max = self.count_max() + branches_max = self.branches_max() + + sorter = lambda x: x.branches + if sorting == 'branch-hitrate': + sorter = lambda x: x.get_branch_hitrate() + elif sorting == 'hitrate': + sorter = lambda x: x.get_hitrate() elif sorting == 'coverage': - sorter = lambda x: x[1].count + sorter = lambda x: x.count + elif sorting == 'name': + sorter = lambda x: x.name.lower() + + print('%-40s %8s %6s %12s %18s %14s %8s %6s' % + ('HEURISTICS', 'BRANCHES', '(REL)', + 'BR. HITRATE', 'HITRATE', 'COVERAGE', 'COVERAGE', '(REL)')) + for h in sorted(heuristics, key = sorter): + h.print(branches_max, count_max) + + def dump(self, sorting): + heuristics = self.heuristics.values() + if len(heuristics) == 0: + print('No heuristics available') + return + + special = list(filter(lambda x: x.name in counter_aggregates, + heuristics)) + normal = list(filter(lambda x: x.name not in counter_aggregates, + heuristics)) - print('%-40s %8s %6s %-16s %14s %8s %6s' % ('HEURISTICS', 'BRANCHES', '(REL)', - 'HITRATE', 'COVERAGE', 'COVERAGE', '(REL)')) - for (k, v) in sorted(self.heuristics.items(), key = sorter): - print('%-40s %8i %5.1f%% %6.2f%% / %6.2f%% %14i %8s %5.1f%%' % - (k, v.branches, percentage(v.branches, self.branches_max ()), - percentage(v.hits, v.count), percentage(v.fits, v.count), - v.count, v.count_formatted(), percentage(v.count, self.count_max()) )) + self.print_group(sorting, 'HEURISTICS', normal) + print() + self.print_group(sorting, 'HEURISTIC AGGREGATES', special) if len(self.niter_vector) > 0: print ('\nLoop count: %d' % len(self.niter_vector)), @@ -155,11 +197,15 @@ class Profile: print(' median # of iter: %.2f' % median(self.niter_vector)) for v in [1, 5, 10, 20, 30]: cut = 0.01 * v - print(' avg. (%d%% cutoff) # of iter: %.2f' % (v, average_cutoff(self.niter_vector, cut))) + print(' avg. (%d%% cutoff) # of iter: %.2f' + % (v, average_cutoff(self.niter_vector, cut))) parser = argparse.ArgumentParser() -parser.add_argument('dump_file', metavar = 'dump_file', help = 'IPA profile dump file') -parser.add_argument('-s', '--sorting', dest = 'sorting', choices = ['branches', 'hitrate', 'coverage'], default = 'branches') +parser.add_argument('dump_file', metavar = 'dump_file', + help = 'IPA profile dump file') +parser.add_argument('-s', '--sorting', dest = 'sorting', + choices = ['branches', 'branch-hitrate', 'hitrate', 'coverage', 'name'], + default = 'branches') args = parser.parse_args() diff --git a/contrib/analyze_brprob_spec.py b/contrib/analyze_brprob_spec.py index a28eaac..908db39 100755 --- a/contrib/analyze_brprob_spec.py +++ b/contrib/analyze_brprob_spec.py @@ -25,8 +25,11 @@ 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') +parser.add_argument('location', metavar = 'dump_file', + help = 'Location with SPEC benchmarks') +parser.add_argument('-s', '--sorting', dest = 'sorting', + choices = ['branches', 'branch-hitrate', 'hitrate', 'coverage', 'name'], + default = 'branches') args = parser.parse_args() @@ -51,7 +54,8 @@ for b in sorted(benchmarks): print() print(b) sys.stdout.flush() - p = [os.path.join(os.path.dirname(script_location), 'analyze_brprob.py'), temp.name, '--sorting', args.sorting] + 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() -- 2.10.2