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
|
import matplotlib.pyplot as plt
import multiprocessing
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": range(1, multiprocessing.cpu_count() * 2 + 1)
}
self.requirements = ["cache-thrash", "cache-scratch"]
super().__init__()
def process_output(self, result, stdout, stderr, target, perm, verbose):
result["time"] = time_re.match(stdout).group("time")
def summary(self):
# Speedup thrash
args = self.results["args"]
nthreads = args["threads"]
targets = self.results["targets"]
for bench in self.results["args"]["bench"]:
for target in targets:
y_vals = []
single_threaded_perm = self.Perm(bench=bench, threads=1)
single_threaded = np.mean([float(m["time"])
for m in self.results[target][single_threaded_perm]])
for perm in self.iterate_args_fixed({"bench": bench}, args=args):
d = [float(m["time"]) for m in self.results[target][perm]]
y_vals.append(single_threaded / np.mean(d))
plt.plot(nthreads, y_vals, marker='.', linestyle='-',
label=target, color=targets[target]["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="'l1 cache misses in %'",
title="'LLC misses: ' + arg + ' ' + str(arg_value)",
filepostfix="llc-misses",
fixed=["bench"])
falsesharing = Benchmark_Falsesharing()
|