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