aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/falsesharing.py
blob: 85d0a92085056d2cfc568b9e54e82e75253b5215 (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
import matplotlib.pyplot as plt
import numpy as np
import re

from src.benchmark import Benchmark

time_re = re.compile("^Time elapsed = (?P<time>\\d*\\.\\d*) seconds.$")


class Benchmark_Falsesharing(Benchmark):
    def __init__(self):
        self.name = "falsesharing"
        self.descrition = """This benchmarks makes small allocations and writes
                             to them multiple times. If the allocated objects
                             are on the same cache line the writes will be
                             expensive because of cache thrashing."""

        self.cmd = "cache-{bench}{binary_suffix} {threads} 100 8 1000000"

        self.args = {
                        "bench": ["thrash", "scratch"],
                        "threads": Benchmark.scale_threads_for_cpus(2)
                    }

        self.requirements = ["cache-thrash", "cache-scratch"]
        super().__init__()

    def process_output(self, result, stdout, stderr, allocator, perm, verbose):
        result["time"] = time_re.match(stdout).group("time")

    def summary(self):
        # Speedup thrash
        args = self.results["args"]
        nthreads = args["threads"]
        allocators = self.results["allocators"]

        for bench in self.results["args"]["bench"]:
            for allocator in allocators:
                y_vals = []

                single_threaded_perm = self.Perm(bench=bench, threads=1)
                single_threaded = np.mean([float(m["time"])
                                          for m in self.results[allocator][single_threaded_perm]])

                for perm in self.iterate_args_fixed({"bench": bench}, args=args):

                    d = [float(m["time"]) for m in self.results[allocator][perm]]

                    y_vals.append(single_threaded / np.mean(d))

                plt.plot(nthreads, y_vals, marker='.', linestyle='-',
                         label=allocator, color=allocators[allocator]["color"])

            plt.legend()
            plt.xlabel("threads")
            plt.ylabel("speedup")
            plt.title(bench + " speedup")
            plt.savefig(self.name + "." + bench + ".png")
            plt.clf()

        self.plot_fixed_arg("({L1-dcache-load-misses}/{L1-dcache-loads})*100",
                            ylabel="'l1 cache misses in %'",
                            title="'cache misses: ' + arg + ' ' + str(arg_value)",
                            filepostfix="l1-misses",
                            fixed=["bench"])

        self.plot_fixed_arg("({LLC-load-misses}/{LLC-loads})*100",
                            ylabel="'llc cache misses in %'",
                            title="'LLC misses: ' + arg + ' ' + str(arg_value)",
                            filepostfix="llc-misses",
                            fixed=["bench"])


falsesharing = Benchmark_Falsesharing()