aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fl.fischer@fau.de>2020-02-19 13:12:30 +0100
committerFlorian Fischer <florian.fl.fischer@fau.de>2020-02-19 13:12:30 +0100
commit7017f4774c5e33a84ddf662af9689b7b4ab290ce (patch)
treee602ad30bf8521c8c4a187bcfe4d00d8c2baea66
parenta2ba38e85297ffc101b5db4a9b9f45330d224ca4 (diff)
parent64adaca5ef13770988dc732e23d17d5df10a58cc (diff)
downloadallocbench-7017f4774c5e33a84ddf662af9689b7b4ab290ce.tar.gz
allocbench-7017f4774c5e33a84ddf662af9689b7b4ab290ce.zip
Merge branch 'master' into align_to_cl
-rw-r--r--src/allocators/all.py5
-rw-r--r--src/allocators/glibc.py4
-rw-r--r--src/allocators/tcmalloc.py46
-rw-r--r--src/allocators/tcmalloc/tcmalloc_bazel_build_so.patch22
-rw-r--r--src/allocators/tcmallocs.py7
-rw-r--r--src/artifact.py8
-rw-r--r--src/benchmark.py20
-rw-r--r--src/chattymalloc.c3
8 files changed, 99 insertions, 16 deletions
diff --git a/src/allocators/all.py b/src/allocators/all.py
index 4ac0819..8be79e7 100644
--- a/src/allocators/all.py
+++ b/src/allocators/all.py
@@ -18,7 +18,7 @@
"""Collection containing all available allocators"""
import src.allocators.glibcs
-from src.allocators.tcmalloc import tcmalloc, tcmalloc_nofs
+from src.allocators.tcmalloc import tcmalloc, tcmalloc_gperftools, tcmalloc_gperftools_nofs
from src.allocators.jemalloc import jemalloc
from src.allocators.hoard import hoard
from src.allocators.mesh import mesh
@@ -31,6 +31,7 @@ from src.allocators.snmalloc import snmalloc
from src.allocators.rpmalloc import rpmalloc
-allocators = [*src.allocators.glibcs.allocators, tcmalloc, tcmalloc_nofs,
+allocators = [*src.allocators.glibcs.allocators,
+ tcmalloc, tcmalloc_gperftools, tcmalloc_gperftools_nofs,
jemalloc, hoard, mesh, supermalloc, scalloc, tbbmalloc, llalloc, # streamflow,
mimalloc, snmalloc, rpmalloc]
diff --git a/src/allocators/glibc.py b/src/allocators/glibc.py
index 2718343..faeadd4 100644
--- a/src/allocators/glibc.py
+++ b/src/allocators/glibc.py
@@ -17,6 +17,8 @@
"""Glibc definitions"""
+from multiprocessing import cpu_count
+
from src.allocator import Allocator, LIBRARY_PATH
from src.artifact import GitArtifact
@@ -37,7 +39,7 @@ class Glibc(Allocator):
self.build_cmds = ["mkdir -p glibc-build",
"cd glibc-build; {srcdir}/configure --prefix={dir} " + configure_args,
"cd glibc-build; make",
- "cd glibc-build; make install"]
+ f"cd glibc-build; make -l {cpu_count()} install"]
self.cmd_prefix = "{dir}/lib/ld-linux-x86-64.so.2 --library-path {dir}/lib:" + LIBRARY_PATH
diff --git a/src/allocators/tcmalloc.py b/src/allocators/tcmalloc.py
index ce00df3..7d51bdd 100644
--- a/src/allocators/tcmalloc.py
+++ b/src/allocators/tcmalloc.py
@@ -14,7 +14,6 @@
#
# You should have received a copy of the GNU General Public License
# along with allocbench.
-
"""TCMalloc definition for allocbench"""
from src.allocator import Allocator, BUILDDIR
@@ -24,32 +23,61 @@ from src.artifact import GitArtifact
class TCMalloc(Allocator):
"""TCMalloc allocator"""
- sources = GitArtifact("tcmalloc", "https://github.com/gperftools/gperftools.git")
+ sources = GitArtifact("tcmalloc", "https://github.com/google/tcmalloc.git")
+
+ def __init__(self, name, **kwargs):
+
+ self.LD_PRELOAD = "{dir}/libtcmalloc.so"
+ self.patches = ["{patchdir}/tcmalloc_bazel_build_so.patch"]
+ self.build_cmds = [
+ "cd {srcdir}; bazel build tcmalloc/tcmalloc.so --compilation_mode opt",
+ "mkdir -p {dir}",
+ "cp {srcdir}/bazel-bin/tcmalloc/tcmalloc.so {dir}/libtcmalloc.so"
+ ]
+
+ super().__init__(name, **kwargs)
+
+
+tcmalloc = TCMalloc("TCMalloc",
+ color="xkcd:blue",
+ version="1676100265bd189df6b5513feac15f102542367e")
+
+
+class TCMallocGperftools(Allocator):
+ """gperftools TCMalloc allocator"""
+
+ sources = GitArtifact("gperftools",
+ "https://github.com/gperftools/gperftools.git")
def __init__(self, name, **kwargs):
self.LD_PRELOAD = "{dir}/lib/libtcmalloc.so"
self.prepare_cmds = ["./autogen.sh"]
- self.build_cmds = ["cd {srcdir}; ./configure --prefix={dir}",
- "cd {srcdir}; make install -j4"]
+ self.build_cmds = [
+ "cd {srcdir}; ./configure --prefix={dir}",
+ "cd {srcdir}; make install -j4"
+ ]
super().__init__(name, **kwargs)
-tcmalloc = TCMalloc("TCMalloc", color="xkcd:blue", version="gperftools-2.7")
+tcmalloc_gperftools = TCMallocGperftools("TCMalloc-gperftools",
+ color="xkcd:dark blue",
+ version="gperftools-2.7")
-tcmalloc_nofs = TCMalloc("TCMalloc-NoFalsesharing",
+tcmalloc_gperftools_nofs = TCMallocGperftools("TCMalloc-NoFalsesharing",
patches=["{patchdir}/tcmalloc_2.7_no_active_falsesharing.patch"],
version="gperftools-2.7",
color="xkcd:navy")
-tcmalloc_align = TCMalloc("TCMalloc-Aligned",
+tcmalloc_gperftools_align = TCMallocGperftools("TCMalloc-Aligned",
version="gperftools-2.7",
color="xkcd:light blue")
-tcmalloc_align.LD_PRELOAD = f"{BUILDDIR}/align_to_cl.so {tcmalloc_align.LD_PRELOAD}"
+tcmalloc_gperftools_align.LD_PRELOAD = f"{BUILDDIR}/align_to_cl.so {tcmalloc_gperftools_align.LD_PRELOAD}"
-tcmalloc_cacheline_exclusive = TCMalloc("TCMalloc-Cacheline-Exclusive",
+tcmalloc_gperftools_cacheline_exclusive = TCMalloc("TCMalloc-Cacheline-Exclusive",
patches=["{patchdir}/tcmalloc_2.7_cacheline_exclusive.patch"],
version="gperftools-2.7",
color="xkcd:royal blue")
+
diff --git a/src/allocators/tcmalloc/tcmalloc_bazel_build_so.patch b/src/allocators/tcmalloc/tcmalloc_bazel_build_so.patch
new file mode 100644
index 0000000..cdd2840
--- /dev/null
+++ b/src/allocators/tcmalloc/tcmalloc_bazel_build_so.patch
@@ -0,0 +1,22 @@
+diff --git tcmalloc/BUILD tcmalloc/BUILD
+index 66d160e..25946af 100644
+--- tcmalloc/BUILD
++++ tcmalloc/BUILD
+@@ -109,6 +109,17 @@ cc_library(
+ alwayslink = 1,
+ )
+
++# This library provides tcmalloc as shared object
++cc_binary(
++ name = "tcmalloc.so",
++ copts = TCMALLOC_DEFAULT_COPTS,
++ linkshared = 1,
++ linkstatic = 1,
++ deps = overlay_deps + tcmalloc_deps + [
++ ":tcmalloc",
++ ]
++)
++
+ # Provides tcmalloc always; use per-thread mode.
+ #
+ cc_library(
diff --git a/src/allocators/tcmallocs.py b/src/allocators/tcmallocs.py
index fe8121f..46eccda 100644
--- a/src/allocators/tcmallocs.py
+++ b/src/allocators/tcmallocs.py
@@ -17,7 +17,10 @@
"""Collection containing all glibc variants"""
-from src.allocators.tcmalloc import tcmalloc, tcmalloc_nofs, tcmalloc_align
+import src.allocators.tcmalloc as tcm
-allocators = [tcmalloc, tcmalloc_nofs, tcmalloc_align]
+allocators = [tcm.tcmalloc,
+ tcm.tcmalloc_gperftools_nofs,
+ tcm.tcmalloc_gperftools_align,
+ tcm.tcmalloc_gperftools_cacheline_exclusive]
diff --git a/src/artifact.py b/src/artifact.py
index 7f020f2..a358446 100644
--- a/src/artifact.py
+++ b/src/artifact.py
@@ -77,6 +77,14 @@ class GitArtifact(Artifact):
if not os.path.exists(self.repo):
self.retrieve()
+ # update repo
+ print_status(f'Updating git repository "{self.name}" ...')
+ try:
+ run_cmd(["git", "fetch"], output_verbosity=1, cwd=self.repo)
+ except CalledProcessError as e:
+ print_error(f"Failed to update {self.name}")
+ raise e
+
worktree_cmd = ["git", "worktree", "add", location, checkout]
print_debug("create new worktree. By running: ", worktree_cmd,
f"in {self.repo}")
diff --git a/src/benchmark.py b/src/benchmark.py
index c96ff18..a8ec0c4 100644
--- a/src/benchmark.py
+++ b/src/benchmark.py
@@ -1,3 +1,21 @@
+# Copyright 2018-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/>.
+"""Benchmark class providing general purpose implementation of required methods"""
+
import atexit
from collections import namedtuple
import errno
@@ -441,7 +459,7 @@ class Benchmark:
# we measure the cmd -> prepare it accordingly
if self.servers == []:
- argv = self.prepare_argv(self.cmd, alloc, os.environ, substitutions)
+ argv = self.prepare_argv(self.cmd, os.environ, alloc, substitutions)
# we measure the server -> run cmd as it is
else:
argv = self.prepare_argv(self.cmd, substitutions=substitutions, prepend=False)
diff --git a/src/chattymalloc.c b/src/chattymalloc.c
index bde18d4..17a9a31 100644
--- a/src/chattymalloc.c
+++ b/src/chattymalloc.c
@@ -29,6 +29,7 @@ along with allocbench. If not, see <http://www.gnu.org/licenses/>.
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
+#include <sys/syscall.h>
#include <unistd.h>
#include "chattymalloc.h"
@@ -123,7 +124,7 @@ static void
write_trace(char func, void* ptr, size_t size, size_t var_arg)
{
if (unlikely(tid == 0)) {
- tid = gettid();
+ tid = syscall(SYS_gettid);;
}
uint64_t idx = __atomic_fetch_add (&next_entry, 1, __ATOMIC_SEQ_CST);