diff options
Diffstat (limited to 'src/allocators')
| -rw-r--r-- | src/allocators/all.py | 5 | ||||
| -rw-r--r-- | src/allocators/chattymalloc.py | 2 | ||||
| -rw-r--r-- | src/allocators/glibc.py | 4 | ||||
| -rw-r--r-- | src/allocators/tcmalloc.py | 59 | ||||
| -rw-r--r-- | src/allocators/tcmalloc/tcmalloc_2.7_cacheline_exclusive.patch | 26 | ||||
| -rw-r--r-- | src/allocators/tcmalloc/tcmalloc_bazel_build_so.patch | 22 | ||||
| -rw-r--r-- | src/allocators/tcmallocs.py | 27 |
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] |
