aboutsummaryrefslogtreecommitdiff
path: root/src/allocators
diff options
context:
space:
mode:
Diffstat (limited to 'src/allocators')
-rw-r--r--src/allocators/all.py5
-rw-r--r--src/allocators/chattymalloc.py2
-rw-r--r--src/allocators/glibc.py4
-rw-r--r--src/allocators/tcmalloc.py59
-rw-r--r--src/allocators/tcmalloc/tcmalloc_2.7_cacheline_exclusive.patch26
-rw-r--r--src/allocators/tcmalloc/tcmalloc_bazel_build_so.patch22
-rw-r--r--src/allocators/tcmallocs.py27
7 files changed, 134 insertions, 11 deletions
diff --git a/src/allocators/all.py b/src/allocators/all.py
index 4ac0819..9dfd563 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
+import src.allocators.tcmallocs
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,
+ *src.allocators.tcmallocs.allocators,
jemalloc, hoard, mesh, supermalloc, scalloc, tbbmalloc, llalloc, # streamflow,
mimalloc, snmalloc, rpmalloc]
diff --git a/src/allocators/chattymalloc.py b/src/allocators/chattymalloc.py
index f6618ef..30106a6 100644
--- a/src/allocators/chattymalloc.py
+++ b/src/allocators/chattymalloc.py
@@ -28,4 +28,4 @@ from src.allocator import Allocator, BUILDDIR
chattymalloc = Allocator("chattymalloc",
LD_PRELOAD=os.path.join(BUILDDIR, "chattymalloc.so"),
- cmd_prefix="env CHATTYMALLOC_FILE={{result_dir}}/chatty_{{perm}}.txt")
+ cmd_prefix="env CHATTYMALLOC_FILE={{result_dir}}/{{perm}}.trace")
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 f81f88b..97c94e2 100644
--- a/src/allocators/tcmalloc.py
+++ b/src/allocators/tcmalloc.py
@@ -14,31 +14,76 @@
#
# You should have received a copy of the GNU General Public License
# along with allocbench.
-
"""TCMalloc definition for allocbench"""
-from src.allocator import Allocator
+from src.allocator import Allocator, BUILDDIR
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")
+
+tcmalloc_align = TCMalloc("TCMalloc-Aligned",
+ version="1676100265bd189df6b5513feac15f102542367e",
+ color="xkcd:light blue")
+
+tcmalloc_align.LD_PRELOAD = f"{BUILDDIR}/align_to_cl.so {tcmalloc_align.LD_PRELOAD}"
+
+
+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_gperftools_align = TCMallocGperftools("TCMalloc-Aligned",
+ version="gperftools-2.7",
+ color="xkcd:navy blue")
+
+tcmalloc_gperftools_align.LD_PRELOAD = f"{BUILDDIR}/align_to_cl.so {tcmalloc_gperftools_align.LD_PRELOAD}"
+
+tcmalloc_gperftools_cacheline_exclusive = TCMallocGperftools("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_2.7_cacheline_exclusive.patch b/src/allocators/tcmalloc/tcmalloc_2.7_cacheline_exclusive.patch
new file mode 100644
index 0000000..bdd63e3
--- /dev/null
+++ b/src/allocators/tcmalloc/tcmalloc_2.7_cacheline_exclusive.patch
@@ -0,0 +1,26 @@
+diff --git src/common.cc src/common.cc
+index 203afdf..9257518 100644
+--- src/common.cc
++++ src/common.cc
+@@ -79,7 +79,7 @@ int AlignmentForSize(size_t size) {
+ if (size > kMaxSize) {
+ // Cap alignment at kPageSize for large sizes.
+ alignment = kPageSize;
+- } else if (size >= 128) {
++ } else if (size >= 512) {
+ // Space wasted due to alignment is at most 1/8, i.e., 12.5%.
+ alignment = (1 << LgFloor(size)) / 8;
+ } else if (size >= kMinAlign) {
+diff --git a/src/common.h b/src/common.h
+index cb45315..4131a13 100644
+--- src/common.h
++++ src/common.h
+@@ -61,7 +61,7 @@ typedef uintptr_t Length;
+ // waste due alignment of 25%. (eg malloc of 24 bytes will get 32 bytes)
+ static const size_t kMinAlign = 8;
+ #else
+-static const size_t kMinAlign = 16;
++static const size_t kMinAlign = 64;
+ #endif
+
+ // Using large pages speeds up the execution at a cost of larger memory use.
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
new file mode 100644
index 0000000..3d61226
--- /dev/null
+++ b/src/allocators/tcmallocs.py
@@ -0,0 +1,27 @@
+# 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/>.
+
+"""Collection containing all glibc variants"""
+
+import src.allocators.tcmalloc as tcm
+
+
+allocators = [tcm.tcmalloc,
+ tcm.tcmalloc_align,
+ tcm.tcmalloc_gperftools_nofs,
+ tcm.tcmalloc_gperftools_align,
+ tcm.tcmalloc_gperftools_cacheline_exclusive]