aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/rdtsc.py
blob: b0cd808e12503884b00c0f5a9672b0ce7e67b26c (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
# Copyright 2020 Florian Fischer <florian.fl.fischer@fau.de>
#
# This file is part of allocbench.
#
# allocbench is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# allocbench is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with allocbench.  If not, see <http://www.gnu.org/licenses/>.
"""Definition of the rdtsc micro benchmark

This benchmark measures the clock cycles used by malloc.
It tries to spread the spawned thread on all cores exept the first one.
See: https://developers.redhat.com/blog/2016/03/11/practical-micro-benchmarking-with-ltrace-and-sched/
"""

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

from src.benchmark import Benchmark
import src.globalvars
import src.plots


class BenchmarkRdtsc(Benchmark):
    """rdtsc micro benchmark

    This benchmark allocates and frees n blocks in t concurrent threads measuring the used cycles.
    """
    def __init__(self):
        name = "rdtsc"

        self.cmd = "rdtsc {mode} 100000 64 {threads}"
        self.measure_cmd = ""

        self.args = {"threads": [1],
                     "mode": ['fresh', 'cached']}

        self.requirements = ["rdtsc"]
        super().__init__(name)

    def process_output(self, result, stdout, stderr, alloc, perm):
        all_cycles = []
        for line in stdout.splitlines():
            all_cycles.append(int(line.split()[1]))
        result["cycles"] = all_cycles

    def summary(self):
        for perm in self.iterate_args(args=self.results['args']):
            label = f'rdtsc_{perm}_cycles'
            fig = plt.figure(label)
            src.plots.FIGURES[label] = fig

            axes = plt.axes()
            axes.set_ylim([50, 800])

            for alloc in self.results['allocators']:
                d = np.sort(self.results[alloc][perm][0]['cycles'])
                plt.plot(d, label=alloc, color=src.plots._get_alloc_color(self, alloc))

            fig.savefig(f'{label}.{src.globalvars.summary_file_ext}')
            plt.legend()
            plt.title(str(perm))
            plt.show()


rdtsc = BenchmarkRdtsc()