aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/larson.py
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fl.fischer@fau.de>2020-05-06 16:56:32 +0200
committerFlorian Fischer <florian.fl.fischer@fau.de>2020-06-02 11:18:47 +0200
commit8174a918ea3b7cb216bf7ea98cfdc10661b5c37d (patch)
tree0747ec3ccb9f8d7eeccfac35977fc17855ca3bbb /src/benchmarks/larson.py
parent8f52e8fc02dd235582f5961941bcd564e9a681cd (diff)
downloadallocbench-8174a918ea3b7cb216bf7ea98cfdc10661b5c37d.tar.gz
allocbench-8174a918ea3b7cb216bf7ea98cfdc10661b5c37d.zip
make the whole project more python idiomatic
* rename src directory to allocbench * make global variable names UPPERCASE * format a lot of code using yapf * use lowercase ld_preload and ld_library_path as Allocator members * name expected Errors 'err' and don't raise a new Exception * disable some pylint messages
Diffstat (limited to 'src/benchmarks/larson.py')
-rw-r--r--src/benchmarks/larson.py101
1 files changed, 0 insertions, 101 deletions
diff --git a/src/benchmarks/larson.py b/src/benchmarks/larson.py
deleted file mode 100644
index db38789..0000000
--- a/src/benchmarks/larson.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright 2018-2019 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/>.
-"""Larson server benchmark
-
-This benchmark was build by Paul Larson at Microsoft Research. It
-simulates a server: each thread has a set of allocations. From which it selects
-a random slot. The allocation in this slot is freed, a new one with a random size
-allocated, written to and stored in the selected slot. When a thread finished its
-allocations it will pass its objects to a new thread.
-
-Larson benchmark usage: ./larson sleep min-size max-size chunks malloc_frees seed threads
-
-In the paper "Memory Allocation for Long-Running Server Applications" the authors
-use 1000 chunks per thread and 50000 malloc and free pairs per thread which
-correspond to a "bleeding rate" of 2% which they observed in real world systems.
-The allocations are uniformly distributed between min-size and max-size.
-
-allocbench runs larson with different distributions and thread counts.
-The other arguments are the same as the original authors used in their paper.
-
-mimalloc-bench uses 1000 chunks per thread and 10000 malloc and free pairs
-simulating 10% bleeding. I don't know why they use different values than the
-original paper.
-
-
-Interpretation:
-
-This benchmark is intended to model a real world server workload.
-But the use of a uniformly distribution of allocation sizes clearly differs from
-real applications. Although the results can be a metric of scalability and
-false sharing because it uses multiple threads, which pass memory around.
-"""
-
-import re
-
-from src.benchmark import Benchmark
-import src.plots as plt
-
-THROUGHPUT_RE = re.compile(
- "^Throughput =\\s*(?P<throughput>\\d+) operations per second.$")
-
-
-class BenchmarkLarson(Benchmark):
- """Definition of the larson benchmark"""
- def __init__(self):
- name = "larson"
-
- # Parameters taken from the paper "Memory Allocation for Long-Running Server
- # Applications" from Larson and Krishnan
- self.cmd = "larson{binary_suffix} 5 8 {maxsize} 1000 50000 1 {threads}"
-
- self.args = {
- "maxsize": [64, 512, 1024],
- "threads": Benchmark.scale_threads_for_cpus(2)
- }
-
- self.requirements = ["larson"]
- super().__init__(name)
-
- @staticmethod
- def process_output(result, stdout, stderr, target, perm):
- for line in stdout.splitlines():
- res = THROUGHPUT_RE.match(line)
- if res:
- result["throughput"] = int(res.group("throughput"))
- return
-
- def summary(self):
- # Plot threads->throughput and maxsize->throughput
- plt.plot(self,
- "{throughput}/1000000",
- fig_options={
- 'ylabel': "MOPS/s",
- 'title': "Larson: {arg} {arg_value}",
- },
- file_postfix="throughput")
-
- plt.plot(self,
- "({L1-dcache-load-misses}/{L1-dcache-loads})*100",
- fig_options={
- 'ylabel': "l1 cache misses in %",
- 'title': "Larson cache misses: {arg} {arg_value}",
- },
- file_postfix="cachemisses")
-
-
-larson = BenchmarkLarson()