aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/lld.py
blob: 1575dddff26df338e1d43a17e22d8e72573fa70b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import matplotlib.pyplot as plt
import numpy as np
import os
from urllib.request import urlretrieve
import subprocess
import sys

from src.benchmark import Benchmark
from src.util import print_status


class BenchmarkLld(Benchmark):
    def __init__(self):
        self.name = "lld"
        self.descrition = """This benchmark runs the lld benchmarks provided
                             by the llvm project."""

        self.run_dir = "lld-speed-test/{test}"
        # TODO: don't hardcode ld.lld location
        self.cmd = "/usr/bin/ld.lld @response.txt"

        self.args = {"test": ["chrome", "clang-fsds", "gold", "linux-kernel",
                              "llvm-as-fsds", "scylla", "clang", "clang-gdb-index",
                              "gold-fsds", "llvm-as", "mozilla"]}

        self.requirements = ["ld.lld"]
        super().__init__()

    def prepare(self):
        super().prepare()

        def reporthook(blocknum, blocksize, totalsize):
            readsofar = blocknum * blocksize
            if totalsize > 0:
                percent = readsofar * 1e2 / totalsize
                s = "\r%5.1f%% %*d / %d" % (
                    percent, len(str(totalsize)), readsofar, totalsize)
                sys.stderr.write(s)
            else:  # total size is unknown
                sys.stderr.write("\rdownloaded %d" % (readsofar,))

        test_dir = "lld-speed-test"
        test_archive = f"{test_dir}.tar.xz"
        if not os.path.isdir(test_dir):
            if not os.path.isfile(test_archive):
                choice = input("Download missing test archive (1.1GB) [Y/n/x] ")
                if not choice in ['', 'Y', 'y']:
                    return False

                url = f"https://s3-us-west-2.amazonaws.com/linker-tests/{test_archive}"
                urlretrieve(url, test_archive, reporthook)
                sys.stderr.write("\n")

            # Extract tests
            p = subprocess.run(["tar", "xf", test_archive], stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE, universal_newlines=True)

            # delete archive
            if p.returncode == 0:
                os.remove(test_archive)
                

        self.args["test"] = os.listdir(test_dir)

        return True

    def cleanup(self):
        for perm in self.iterate_args():
            a_out = os.path.join("lld-speed-test", perm.test, "a.out")
            if os.path.isfile(a_out):
                os.remove(a_out)
            

    def summary(self):
        args = self.results["args"]
        allocators = self.results["allocators"]

        for perm in self.iterate_args(args=args):
            for i, allocator in enumerate(allocators):
                
                plt.bar([i],
                        self.results["stats"][allocator][perm]["mean"]["task-clock"],
                        yerr=self.results["stats"][allocator][perm]["std"]["task-clock"],
                        label=allocator, color=allocators[allocator]["color"])
            
            plt.legend(loc="best")
            plt.ylabel("Zeit in ms")
            plt.title(f"Gesamte Laufzeit {perm.test}")
            plt.savefig(".".join([self.name, perm.test, "runtime", "png"]))
            plt.clf()

        # TODO: get memusage
        # Memusage
        # self.barplot_single_arg("{VmHWM}",
                                # ylabel='"Max RSS in KB"',
                                # title='"Highwatermark of Vm (VmHWM)"',
                                # filepostfix="rss")

        # self.export_stats_to_csv("VmHWM")
        self.export_stats_to_csv("task-clock")

        # self.export_stats_to_dataref("VmHWM")
        self.export_stats_to_dataref("task-clock")


lld = BenchmarkLld()