annotate lld/utils/benchmark.py @ 213:25ca0248ac32

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 11 Jul 2021 17:05:31 +0900
parents 1d019706d866
children 1f2b6ac9f198
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 #!/usr/bin/env python
anatofuz
parents:
diff changeset
2 #
anatofuz
parents:
diff changeset
3 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 # See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 #
anatofuz
parents:
diff changeset
7 # ==------------------------------------------------------------------------==#
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 import os
anatofuz
parents:
diff changeset
10 import glob
anatofuz
parents:
diff changeset
11 import re
anatofuz
parents:
diff changeset
12 import subprocess
anatofuz
parents:
diff changeset
13 import json
anatofuz
parents:
diff changeset
14 import datetime
anatofuz
parents:
diff changeset
15 import argparse
anatofuz
parents:
diff changeset
16 try:
anatofuz
parents:
diff changeset
17 from urllib.parse import urlencode
anatofuz
parents:
diff changeset
18 from urllib.request import urlopen, Request
anatofuz
parents:
diff changeset
19 except ImportError:
anatofuz
parents:
diff changeset
20 from urllib import urlencode
anatofuz
parents:
diff changeset
21 from urllib2 import urlopen, Request
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23
anatofuz
parents:
diff changeset
24 parser = argparse.ArgumentParser()
anatofuz
parents:
diff changeset
25 parser.add_argument('benchmark_directory')
anatofuz
parents:
diff changeset
26 parser.add_argument('--runs', type=int, default=10)
anatofuz
parents:
diff changeset
27 parser.add_argument('--wrapper', default='')
anatofuz
parents:
diff changeset
28 parser.add_argument('--machine', required=True)
anatofuz
parents:
diff changeset
29 parser.add_argument('--revision', required=True)
anatofuz
parents:
diff changeset
30 parser.add_argument('--threads', action='store_true')
anatofuz
parents:
diff changeset
31 parser.add_argument('--url', help='The lnt server url to send the results to',
anatofuz
parents:
diff changeset
32 default='http://localhost:8000/db_default/v4/link/submitRun')
anatofuz
parents:
diff changeset
33 args = parser.parse_args()
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 class Bench:
anatofuz
parents:
diff changeset
36 def __init__(self, directory, variant):
anatofuz
parents:
diff changeset
37 self.directory = directory
anatofuz
parents:
diff changeset
38 self.variant = variant
anatofuz
parents:
diff changeset
39 def __str__(self):
anatofuz
parents:
diff changeset
40 if not self.variant:
anatofuz
parents:
diff changeset
41 return self.directory
anatofuz
parents:
diff changeset
42 return '%s-%s' % (self.directory, self.variant)
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 def getBenchmarks():
anatofuz
parents:
diff changeset
45 ret = []
anatofuz
parents:
diff changeset
46 for i in glob.glob('*/response*.txt'):
anatofuz
parents:
diff changeset
47 m = re.match('response-(.*)\.txt', os.path.basename(i))
anatofuz
parents:
diff changeset
48 variant = m.groups()[0] if m else None
anatofuz
parents:
diff changeset
49 ret.append(Bench(os.path.dirname(i), variant))
anatofuz
parents:
diff changeset
50 return ret
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 def parsePerfNum(num):
anatofuz
parents:
diff changeset
53 num = num.replace(b',',b'')
anatofuz
parents:
diff changeset
54 try:
anatofuz
parents:
diff changeset
55 return int(num)
anatofuz
parents:
diff changeset
56 except ValueError:
anatofuz
parents:
diff changeset
57 return float(num)
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 def parsePerfLine(line):
anatofuz
parents:
diff changeset
60 ret = {}
anatofuz
parents:
diff changeset
61 line = line.split(b'#')[0].strip()
anatofuz
parents:
diff changeset
62 if len(line) != 0:
anatofuz
parents:
diff changeset
63 p = line.split()
anatofuz
parents:
diff changeset
64 ret[p[1].strip().decode('ascii')] = parsePerfNum(p[0])
anatofuz
parents:
diff changeset
65 return ret
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 def parsePerf(output):
anatofuz
parents:
diff changeset
68 ret = {}
anatofuz
parents:
diff changeset
69 lines = [x.strip() for x in output.split(b'\n')]
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 seconds = [x for x in lines if b'seconds time elapsed' in x][0]
anatofuz
parents:
diff changeset
72 seconds = seconds.strip().split()[0].strip()
anatofuz
parents:
diff changeset
73 ret['seconds-elapsed'] = parsePerfNum(seconds)
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 measurement_lines = [x for x in lines if b'#' in x]
anatofuz
parents:
diff changeset
76 for l in measurement_lines:
anatofuz
parents:
diff changeset
77 ret.update(parsePerfLine(l))
anatofuz
parents:
diff changeset
78 return ret
anatofuz
parents:
diff changeset
79
anatofuz
parents:
diff changeset
80 def run(cmd):
anatofuz
parents:
diff changeset
81 try:
anatofuz
parents:
diff changeset
82 return subprocess.check_output(cmd, stderr=subprocess.STDOUT)
anatofuz
parents:
diff changeset
83 except subprocess.CalledProcessError as e:
anatofuz
parents:
diff changeset
84 print(e.output)
anatofuz
parents:
diff changeset
85 raise e
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 def combinePerfRun(acc, d):
anatofuz
parents:
diff changeset
88 for k,v in d.items():
anatofuz
parents:
diff changeset
89 a = acc.get(k, [])
anatofuz
parents:
diff changeset
90 a.append(v)
anatofuz
parents:
diff changeset
91 acc[k] = a
anatofuz
parents:
diff changeset
92
anatofuz
parents:
diff changeset
93 def perf(cmd):
anatofuz
parents:
diff changeset
94 # Discard the first run to warm up any system cache.
anatofuz
parents:
diff changeset
95 run(cmd)
anatofuz
parents:
diff changeset
96
anatofuz
parents:
diff changeset
97 ret = {}
anatofuz
parents:
diff changeset
98 wrapper_args = [x for x in args.wrapper.split(',') if x]
anatofuz
parents:
diff changeset
99 for i in range(args.runs):
anatofuz
parents:
diff changeset
100 os.unlink('t')
anatofuz
parents:
diff changeset
101 out = run(wrapper_args + ['perf', 'stat'] + cmd)
anatofuz
parents:
diff changeset
102 r = parsePerf(out)
anatofuz
parents:
diff changeset
103 combinePerfRun(ret, r)
anatofuz
parents:
diff changeset
104 os.unlink('t')
anatofuz
parents:
diff changeset
105 return ret
anatofuz
parents:
diff changeset
106
anatofuz
parents:
diff changeset
107 def runBench(bench):
anatofuz
parents:
diff changeset
108 thread_arg = [] if args.threads else ['--no-threads']
anatofuz
parents:
diff changeset
109 os.chdir(bench.directory)
anatofuz
parents:
diff changeset
110 suffix = '-%s' % bench.variant if bench.variant else ''
anatofuz
parents:
diff changeset
111 response = 'response' + suffix + '.txt'
anatofuz
parents:
diff changeset
112 ret = perf(['../ld.lld', '@' + response, '-o', 't'] + thread_arg)
anatofuz
parents:
diff changeset
113 ret['name'] = str(bench)
anatofuz
parents:
diff changeset
114 os.chdir('..')
anatofuz
parents:
diff changeset
115 return ret
anatofuz
parents:
diff changeset
116
anatofuz
parents:
diff changeset
117 def buildLntJson(benchmarks):
anatofuz
parents:
diff changeset
118 start = datetime.datetime.utcnow().isoformat()
anatofuz
parents:
diff changeset
119 tests = [runBench(b) for b in benchmarks]
anatofuz
parents:
diff changeset
120 end = datetime.datetime.utcnow().isoformat()
anatofuz
parents:
diff changeset
121 ret = {
anatofuz
parents:
diff changeset
122 'format_version' : 2,
anatofuz
parents:
diff changeset
123 'machine' : { 'name' : args.machine },
anatofuz
parents:
diff changeset
124 'run' : {
anatofuz
parents:
diff changeset
125 'end_time' : start,
anatofuz
parents:
diff changeset
126 'start_time' : end,
anatofuz
parents:
diff changeset
127 'llvm_project_revision': args.revision
anatofuz
parents:
diff changeset
128 },
anatofuz
parents:
diff changeset
129 'tests' : tests
anatofuz
parents:
diff changeset
130 }
anatofuz
parents:
diff changeset
131 return json.dumps(ret, sort_keys=True, indent=4)
anatofuz
parents:
diff changeset
132
anatofuz
parents:
diff changeset
133 def submitToServer(data):
anatofuz
parents:
diff changeset
134 data2 = urlencode({ 'input_data' : data }).encode('ascii')
anatofuz
parents:
diff changeset
135 urlopen(Request(args.url, data2))
anatofuz
parents:
diff changeset
136
anatofuz
parents:
diff changeset
137 os.chdir(args.benchmark_directory)
anatofuz
parents:
diff changeset
138 data = buildLntJson(getBenchmarks())
anatofuz
parents:
diff changeset
139 submitToServer(data)