diff --git a/.gitignore b/.gitignore index f16f800..f623cc7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +archives/ extern/ out/ bench/doc/ diff --git a/Dockerfile b/Dockerfile index fe54d99..3c86bc8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,36 @@ ARG platform=ubuntu FROM ubuntu:24.04 AS ubuntu - +RUN apt-get update +RUN apt-get install -y --no-install-recommends build-essential git gpg \ + g++ clang lld llvm-dev unzip dos2unix linuxinfo bc libgmp-dev wget \ + cmake python3 ruby ninja-build libtool autoconf sed ghostscript \ + time curl automake libatomic1 libgflags-dev libsnappy-dev \ + zlib1g-dev libbz2-dev liblz4-dev libzstd-dev libreadline-dev \ + pkg-config gawk util-linux +# Install bazel +RUN apt-get install -y --no-install-recommends apt-transport-https curl gnupg +RUN curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg +RUN mv bazel.gpg /etc/apt/trusted.gpg.d/bazel.gpg +RUN echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" > /etc/apt/sources.list.d/bazel.list +RUN apt-get update && apt-get install bazel FROM fedora:latest AS fedora - +RUN dnf -y --quiet --nodocs install gcc-c++ clang lld llvm-devel unzip \ + dos2unix bc gmp-devel wget gawk cmake python3 ruby ninja-build libtool \ + autoconf git patch time sed ghostscript libatomic libstdc++ which \ + gflags-devel xz readline-devel snappy-devel +RUN dnf -y --quiet copr enable ohadm/bazel +RUN dnf -y --quiet --nodocs install bazel8 FROM alpine:latest AS alpine +RUN echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories +RUN apk update RUN apk add --no-cache bash - +RUN apk add -q clang lld unzip dos2unix bc gmp-dev wget cmake python3 \ + automake gawk samurai libtool git build-base linux-headers autoconf \ + util-linux sed ghostscript libatomic gflags-dev readline-dev snappy-dev +RUN apk add -q bazel@testing FROM ${platform} AS bench-env @@ -17,17 +39,13 @@ RUN mkdir -p /mimalloc-bench COPY . /mimalloc-bench WORKDIR /mimalloc-bench -# Install dependencies -RUN ./build-bench-env.sh packages - -# Build benchmarks -RUN ./build-bench-env.sh bench - -RUN ./build-bench-env.sh redis - -RUN ./build-bench-env.sh rocksdb -RUN ./build-bench-env.sh lean +RUN make benchmarks +RUN make redis +RUN make rocksdb +RUN make lean +RUN make lua +RUN make linux FROM bench-env AS benchmark @@ -37,8 +55,8 @@ ARG allocator=mi ARG benchs=cfrac ARG repeats=1 -RUN ./build-bench-env.sh $allocator +RUN make $allocator # Run benchmarks WORKDIR /mimalloc-bench/out/bench -RUN ../../bench.sh $allocator $benchs -r=$repeats \ No newline at end of file +RUN ../../bench.sh $allocator $benchs -r=$repeats diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..09c707d --- /dev/null +++ b/Makefile @@ -0,0 +1,304 @@ +SUDO=sudo +ifeq ($(shell whoami), root) +$(warning running as root, avoid doing this if possible.) +SUDO= +endif + +DARWIN=no +PROCS=$(shell nproc) +EXTSO=so +SHA256SUM=sha256sum +SHA256SUM_FLAGS=-c --status +ORIG= + +ifeq ($(shell uname), Darwin) +DARWIN=yes +PROCS=$(shell sysctl -n hw.physicalcpu) +EXTSO=dylib +SHA256SUM=shasum -a 256 +SHA256SUM_FLAGS=-c -s +export HOMEBREW_NO_EMOJI=1 +ORIG=_orig +endif + +ifneq ($(shell grep -e 'ID=alpine' /etc/os-release),) +SHA256SUM_FLAGS=-c -s +endif + +BENCHMARKS_EXTERN=lean linux lua redis rocksdb +ALLOCS = dh ff fg gd hd hm iso je lf lp lt mesh mi mi2 mng nomesh rmalloc rp sc scudo sg sm sn tbb tc tcg yal +PDFDOC=extern/large.pdf + +######################################################################## +# Environment flags for the individual make processes, may just be the # +# respective target name. # +######################################################################## + +fg_ENV=SSE2RNG=1 +iso_ENV=library +mesh_ENV=build +lf_ENV=liblite-malloc-shared.so +lt_ENV=-C gnu.make.lib +hd_ENV=-C src +redis_ENV=USE_JEMALLOC=no MALLOC=libc BUILD_TLS=no -C src +rocksdb_ENV=DISABLE_WARNING_AS_ERROR=1 DISABLE_JEMALLOC=1 ROCKSDB_DISABLE_TCMALLOC=1 db_bench + +# TODO: Mac seems to report 'arm64' here +ifeq ($(shell uname -m), aarch64) +ALLOCS := $(filter-out fg lt mesh nomesh sc sm, $(ALLOCS)) +endif + +all: allocs benchmarks_all +allocs: $(ALLOCS) +benchmarks_all: benchmarks $(BENCHMARKS_EXTERN) + +# TODO: Mac seems to report 'arm64' here +ifeq ($(shell uname -m), aarch64) +# gd uses SSE on x86, but ARC4 on ARM - and arc4 needs a fix +gd_ENV := ARC4RNG=1 +extern/gd/.built: extern/gd/.unpacked + sed -i_orig 's/getentropy(/_getentropy(/g' $(@D)/rng/arc4random.{c,h} + make -C $(@D) $(gd_ENV) -j$(PROCS) + touch $@ +endif + +.PHONY: all allocs benchmarks benchmarks_all benchmarks_big + +benchmarks: bench/CMakeLists.txt bench/shbench/sh6bench-new.c bench/shbench/sh8bench-new.c $(PDFDOC) + cmake -B out/bench -S bench + cmake --build out/bench -j $(PROCS) + +PDF_URL=https://raw.githubusercontent.com/geekaaron/Resources/master/resources/Writing_a_Simple_Operating_System--from_Scratch.pdf +$(PDFDOC): + mkdir -p extern + wget --no-verbose -O $(PDFDOC) $(PDF_URL) + +bench/shbench/sh6bench-new.c: bench/shbench/sh6bench.patch bench/shbench/sh6bench.c + dos2unix $< + patch -p1 -o $@ $(filter-out $<, $^) $< + +bench/shbench/sh8bench-new.c: bench/shbench/sh8bench.patch bench/shbench/SH8BENCH.C + dos2unix $< + patch -p1 -o $@ $(filter-out $<, $^) $< + +bench/shbench/sh6bench.c: bench/shbench/bench.zip + cd $(@D) && unzip -o $( make +sc_ENV=BUILDTYPE=Release +extern/sc/.built: extern/sc/Makefile + make -C $(@D) $(sc_ENV) -j$(PROCS) + touch $@ + +extern/sc/Makefile: extern/sc/build/gyp/gyp + cd $(@D) && build/gyp/gyp --depth=. scalloc.gyp + +extern/sc/build/gyp/gyp: extern/sc/.unpacked + cd extern/sc && tools/make_deps.sh + +#scudo: partial checkout, native clang, in a sub-directory +extern/scudo/.unpacked: + git clone --depth 1 --single-branch -b $(scudo_VERSION) --sparse --filter=blob:none $(scudo_URL) $(@D) + cd $(@D) && git sparse-checkout add compiler-rt/lib/scudo/standalone + touch $@ + +extern/scudo/.built: extern/scudo/.unpacked + cd $(@D)/compiler-rt/lib/scudo/standalone && clang++ -flto -fuse-ld=lld -fPIC -fno-exceptions $(CXXFLAGS) -fno-rtti -fvisibility=internal -O3 -I include -shared -o libscudo.$(EXTSO) *.cpp + touch $@ + +#sm: make, but a fix before +extern/sm/.built: extern/sm/.unpacked + sed -i "s/-Werror//" $(@D)/Makefile.include + make -C $(@D)/release -j$(PROCS) ../release/lib/libsupermalloc.so + touch $@ + +#sn: cmake+ninja, builds in sn/release +extern/sn/.built: extern/sn/release/build.ninja + cd $(@D)/release && ninja libsnmallocshim.$(EXTSO) libsnmallocshim-checks.$(EXTSO) + touch $@ + +extern/sn/release/build.ninja: extern/sn/.unpacked + env CXX=clang++ cmake -S $(@D)/.. -B $(@D) -G Ninja -DCMAKE_BUILD_TYPE=Release + +#tbb: cmake to configure +extern/tbb/.built: extern/tbb/.configured + make -C $(@D) -j$(PROCS) + touch $@ + +extern/tbb/.configured: extern/tbb/.unpacked + cd $(@D) && cmake -DCMAKE_BUILD_TYPE=Release -DTBB_BUILD=OFF -DTBB_TEST=OFF -DTBB_OUTPUT_DIR_BASE=bench -DCMAKE_POLICY_VERSION_MINIMUM=3.5 . + touch $@ + +#tc: autogen+configure +extern/tc/.built: extern/tc/Makefile + make -C $(@D) -j $(PROCS) + touch $@ + +extern/tc/Makefile: extern/tc/configure + cd $(@D) && CXXFLAGS="$(CXXFLAGS) -w -DNDEBUG -O2" ./configure --enable-minimal --disable-debugalloc + +extern/tc/configure: extern/tc/.unpacked + cd $(@D) && ./autogen.sh + +#tcg: bazel +extern/tcg/.built: extern/tcg/.unpacked + cd $(@D) && bazel build -c opt tcmalloc + touch $@ + +#yal: custom shell script +extern/yal/.built: extern/yal/.unpacked + cd $(@D) && ./build.sh -V + touch $@ + +######################################################################## +# benchmarks residing in ./extern # +######################################################################## +# lean: cmake, additional mathlib setup +extern/lean/.built: extern/lean/.unpacked + patch -d $(@D) -p1 -N -r- < patches/lean.patch + mkdir -p $(@D)/out/release + env CC=gcc CXX="g++" cmake -S $(@D)/src -B $(@D)/out/release -DCUSTOM_ALLOCATORS=OFF -DLEAN_EXTRA_CXX_FLAGS="-w" -DCMAKE_POLICY_VERSION_MINIMUM=3.5 + make -C $(@D)/out/release -j$(PROCS) bin_lean + mkdir -p extern/mathlib + cp -u $(@D)/leanpkg/leanpkg.toml extern/mathlib + touch $@ + +# lua only needs to be fetched, not more. +extern/lua/.built: extern/lua/.unpacked + touch $@ + +# linux only needs to be fetched, not more. +extern/linux/.built: extern/linux/.unpacked + touch $@ diff --git a/README.md b/README.md index efce48f..c5c34b5 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,8 @@ Collection of various benchmarks from the academic literature, together with automated scripts to pull specific versions of benchmark programs and allocators from Github and build them. -Due to the large variance in programs and allocators, the suite is currently -only developed for Unix-like systems, and specifically Ubuntu with `apt-get`, Fedora with `dnf`, -and macOS (for a limited set of allocators and benchmarks). The only system-installed allocator used is glibc's implementation that ships as part of Linux's libc. -All other allocators are downloaded and built as part of `build-bench-env.sh` -- -if you are looking to run these benchmarks on a different Linux distribution look at -the `setup_packages` function to see the packages required to build the full set of -allocators. - +All other allocators are downloaded and built with `make`. It is quite easy to add new benchmarks and allocator implementations -- please do so!. @@ -27,19 +20,77 @@ Enjoy, Daan - Note that all the code in the `bench` directory is not part of _mimalloc-bench_ as such, and all programs in the `bench` directory are governed under their own specific licenses and copyrights as detailed in their `README.md` (or `license.txt`) files. They are just included here for convenience. +# Dependencies +Some of the allocators and benchmarks need packages installed on the +system to be built and/or run. See the following collection for your +distribution: +
+ Ubuntu/Debian + +```bash +sudo apt-get install --no-install-recommends build-essential git gpg \ + g++ clang lld llvm-dev unzip dos2unix linuxinfo bc libgmp-dev wget \ + cmake python3 ruby ninja-build libtool autoconf sed ghostscript \ + time curl automake libatomic1 libgflags-dev libsnappy-dev \ + zlib1g-dev libbz2-dev liblz4-dev libzstd-dev libreadline-dev \ + pkg-config gawk util-linux bazel-bootstrap +``` +
+ +
+ Fedora + +```bash +sudo dnf --nodocs gcc-c++ clang lld llvm-devel unzip dos2unix bc \ + gmp-devel wget gawk cmake python3 ruby ninja-build libtool autoconf \ + git patch time sed ghostscript libatomic libstdc++ which gflags-devel \ + xz readline-devel snappy-devel dnf-plugins-core +sudo dnf copr -y enable ohadm/bazel +sudo dnf --nodocs install bazel8 +``` +
+ +
+ Alpine + +```bash +sudo apk add clang lld unzip dos2unix bc gmp-dev wget cmake python3 \ + automake gawk samurai libtool git build-base linux-headers autoconf \ + util-linux sed ghostscript libatomic gflags-dev readline-dev snappy-dev +echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" | sudo tee -a /etc/apk/repositories +sudo apk add -q bazel@testing +``` +
+ +
+ ArchLinux + +```bash +sudo pacman -S dos2unix wget cmake ninja automake libtool time gmp sed \ + ghostscript bazelisk gflags snappy python-six +``` +
+ +
+ Mac OS + +```bash +brew install dos2unix wget cmake ninja automake libtool gnu-time gmp \ + mpir gnu-sed ghostscript bazelisk gflags snappy +``` +
# Benchmarking -The `build-bench-env.sh` script with the `all` argument will automatically pull -all needed benchmarks and allocators and build them in the `extern` directory: +`make all` will automatically pull all needed benchmarks and allocators +and build them in the `extern` directory: ``` -~/dev/mimalloc-bench> ./build-bench-env.sh all +~/dev/mimalloc-bench> make all ``` It starts installing packages and you will need to enter the sudo password. All other programs are build in the `mimalloc-bench/extern` directory. diff --git a/VERSIONS b/VERSIONS new file mode 100644 index 0000000..2aa3fae --- /dev/null +++ b/VERSIONS @@ -0,0 +1,32 @@ +dh: master, master, https://github.com/emeryberger/DieHard +ff: master, master, https://github.com/bwickman97/ffmalloc +fg: master, master, https://github.com/UTSASRG/FreeGuard +gd: master, master, https://github.com/UTSASRG/Guarder +hd: 6577c22b, 6577c22, https://github.com/emeryberger/Hoard +hm: 11, 995ce07, https://github.com/GrapheneOS/hardened_malloc +iso: 1.2.5, 2670d5f, https://github.com/struct/isoalloc +je: 5.3.0, 54eaed1d, https://github.com/jemalloc/jemalloc +lean: 21d264a66d53b0a910178ae7d9529cb5886a39b6, 21d264a66, https://github.com/leanprover-community/lean +lf: master, master, https://github.com/Begun/lockfree-malloc +linux: 6.6.105, fe9731e1, https://github.com/torvalds/linux +lp: main, main, https://github.com/WebKit/WebKit +lt: master, master, https://github.com/r-lyeh-archived/ltalloc +lua: v5.4.7, 1ab3208a, https://github.com/lua/lua +mesh: master, master, https://github.com/plasma-umass/mesh +mi2: v2.1.2, 43ce4bd7, https://github.com/microsoft/mimalloc +mi: v1.8.2, b66e3214, https://github.com/microsoft/mimalloc +mng: master, master, https://github.com/richfelker/mallocng-draft +pa: main, main, https://github.com/1c3t3a/partition_alloc_builder +redis: 6.2.7, e6f6709, https://github.com/redis/redis +rmalloc: master, master, https://github.com/newell-romario/rmalloc +rocksdb: 10.10.1, 4595a5e9, https://github.com/facebook/rocksdb +rp: 1.4.5, e4393ff, https://github.com/mjansson/rpmalloc +sc: master, master, https://github.com/cksystemsgroup/scalloc +scudo: main, main, https://github.com/llvm/llvm-project +sg: master, master, https://github.com/ssrg-vt/SlimGuard +sm: master, master, https://github.com/kuszmaul/SuperMalloc +sn: 0.7.1, 32495fd, https://github.com/Microsoft/snmalloc +tbb: v2021.9.0, a00cc3b8, https://github.com/oneapi-src/oneTBB +tcg: 98fd24303c7b5ef5e30da625f11fb623a5e038b6, 98fd2430, https://github.com/google/tcmalloc +tc: gperftools-2.16.90, 83edb60, https://github.com/gperftools/gperftools +yal: main, main, https://github.com/jorisgeer/yalloc diff --git a/bench.sh b/bench.sh index eea5148..8f52494 100755 --- a/bench.sh +++ b/bench.sh @@ -24,14 +24,6 @@ tests_run="" tests_exclude="" readonly tests_exclude_macos="sh6bench sh8bench redis" -# -------------------------------------------------------------------- -# benchmark versions -# -------------------------------------------------------------------- - -readonly version_redis=6.2.7 -readonly version_rocksdb=10.10.1 -readonly version_linux=6.5.1 - # -------------------------------------------------------------------- # Environment # -------------------------------------------------------------------- @@ -69,7 +61,7 @@ esac # -------------------------------------------------------------------- readonly curdir=`pwd` -if ! test -f ../../build-bench-env.sh; then +if ! test -f ../../bench.sh; then echo "error: you must run this script from the 'out/bench' directory!" exit 1 fi @@ -98,7 +90,7 @@ readonly lib_tbb="$localdevdir/tbb/bench_release/libtbbmalloc_proxy$extso" readonly lib_tbb_dir="$(dirname $lib_tbb)" -alloc_lib_add "dh" "$localdevdir/dh/src/build/libdieharder$extso" +alloc_lib_add "dh" "$localdevdir/dh/build/libdieharder$extso" alloc_lib_add "ff" "$localdevdir/ff/libffmallocnpmt$extso" alloc_lib_add "fg" "$localdevdir/fg/libfreeguard$extso" alloc_lib_add "gd" "$localdevdir/gd/libguarder$extso" @@ -110,9 +102,9 @@ alloc_lib_add "je" "$localdevdir/je/lib/libjemalloc$extso" alloc_lib_add "lf" "$localdevdir/lf/liblite-malloc-shared$extso" alloc_lib_add "lp" "$localdevdir/lp/Source/bmalloc/libpas/build-cmake-default/Release/libpas_lib$extso" alloc_lib_add "lt" "$localdevdir/lt/gnu.make.lib/libltalloc$extso" -alloc_lib_add "mesh" "$localdevdir/mesh/build/lib/libmesh$extso" +alloc_lib_add "mesh" "$localdevdir/mesh/bazel-bin/src/libmesh$extso" alloc_lib_add "mng" "$localdevdir/mng/libmallocng$extso" -alloc_lib_add "nomesh" "$localdevdir/nomesh/build/lib/libmesh$extso" +alloc_lib_add "nomesh" "$localdevdir/nomesh/bazel-bin/src/libmesh$extso" alloc_lib_add "pa" "$localdevdir/pa/partition_alloc_builder/out/Default/libpalib$extso" alloc_lib_add "rp" "$lib_rp" alloc_lib_add "sc" "$localdevdir/sc/out/Release/lib.target/libscalloc$extso" @@ -164,10 +156,10 @@ fi readonly luadir="$localdevdir/lua" readonly leandir="$localdevdir/lean" readonly leanmldir="$leandir/../mathlib" -readonly redis_dir="$localdevdir/redis-$version_redis/src" +readonly redis_dir="$localdevdir/redis/src" readonly pdfdoc="$localdevdir/large.pdf" -readonly rocksdb_dir="$localdevdir/rocksdb-$version_rocksdb" -readonly linux_dir="$localdevdir/linux-$version_linux" +readonly rocksdb_dir="$localdevdir/rocksdb" +readonly linux_dir="$localdevdir/linux" readonly spec_dir="$localdevdir/../../spec2017" readonly spec_base="base" diff --git a/build-bench-env.sh b/build-bench-env.sh deleted file mode 100755 index 5cd32b2..0000000 --- a/build-bench-env.sh +++ /dev/null @@ -1,899 +0,0 @@ -#!/bin/bash -# Copyright 2018-2024, Microsoft Research, Daan Leijen, Julien Voisin, Matthew Parkinson - -set -eo pipefail - -CFLAGS='-march=native' -CXXFLAGS='-march=native' - -procs=8 -extso=".so" -case "$OSTYPE" in - darwin*) - export HOMEBREW_NO_EMOJI=1 - darwin="1" - extso=".dylib" - procs=`sysctl -n hw.physicalcpu`;; - *) - darwin="" - if command -v nproc > /dev/null; then - procs=`nproc` - fi;; -esac - -SUDO=sudo -if [ "$EUID" -eq 0 ]; then - echo "[*] $0 is running as root, avoid doing this if possible." - SUDO="" -fi - -SHA256SUM_CMD="sha256sum" -if test "$darwin" = "1"; then - SHA256SUM_CMD="shasum -a 256" -fi - -curdir=`pwd` -rebuild=0 -all=0 - -# allocator versions -readonly version_dh=master -readonly version_ff=master # ~unmaintained since 2021 -readonly version_fg=master # ~unmaintained since 2018 -readonly version_gd=master # ~unmaintained since 2021 -readonly version_hd=6577c22b # HEAD as of 2025-07-18, no release since 2019 -readonly version_hm=11 -readonly version_iso=1.2.5 -readonly version_je=5.3.0 -readonly version_lf=master # ~unmaintained since 2018 -readonly version_lp=main -readonly version_lt=master # ~unmaintained since 2019 -readonly version_mesh=master # ~unmaintained since 2021 -readonly version_mi=v1.8.2 -readonly version_mi2=v2.1.2 -readonly version_mng=master # ~unmaintained -readonly version_nomesh=$version_mesh -readonly version_pa=main -readonly version_rp=1.4.5 -readonly version_sc=master # unmaintained since 2016 -readonly version_scudo=main -readonly version_sg=master # ~unmaintained since 2021 -readonly version_sm=master # ~unmaintained since 2017 -readonly version_sn=0.7.4 -readonly version_tbb=v2021.9.0 -readonly version_tc=gperftools-2.18 -readonly version_tcg=81f4e44f23f2936303f9404fee7315119b9df623 # 2026-02-23 -readonly version_yal=main -readonly version_rmalloc=master - -# benchmark versions -readonly version_redis=6.2.7 -readonly version_lean=21d264a66d53b0a910178ae7d9529cb5886a39b6 # build fix for recent compilers -readonly version_rocksdb=10.10.1 -readonly version_lua=v5.4.7 -readonly version_linux=6.5.1 - -# HTTP-downloaded files checksums -readonly sha256sum_sh6bench="506354d66b9eebef105d757e055bc55e8d4aea1e7b51faab3da35b0466c923a1" -readonly sha256sum_sh8bench="12a8e75248c9dcbfee28245c12bc937a16ef56ec9cbfab88d0e348271667726f" - -# allocators -setup_dh=0 -setup_ff=0 -setup_fg=0 -setup_gd=0 -setup_hd=0 -setup_hm=0 -setup_iso=0 -setup_je=0 -setup_lf=0 -setup_lp=0 -setup_lt=0 -setup_mesh=0 -setup_mi=0 -setup_mi2=0 -setup_mng=0 -setup_nomesh=0 -setup_pa=0 -setup_rp=0 -setup_sc=0 -setup_scudo=0 -setup_sg=0 -setup_sm=0 -setup_sn=0 -setup_tbb=0 -setup_tc=0 -setup_tcg=0 -setup_yal=0 -setup_rmalloc=0 - -# bigger benchmarks -setup_bench=0 -setup_lean=0 -setup_redis=0 -setup_rocksdb=0 -setup_linux=0 - -# various -setup_packages=0 - - -# Parse command-line arguments -while : ; do - flag="$1" - case "$flag" in - *=*) flag_arg="${flag#*=}";; - no-*) flag_arg="0" - flag="${flag#no-}";; - none) flag_arg="0" ;; - *) flag_arg="1" ;; - esac - # echo "option: $flag, arg: $flag_arg" - case "$flag" in - "") break;; - all|none) - all=$flag_arg - setup_dh=$flag_arg - setup_ff=$flag_arg - setup_fg=$flag_arg - setup_gd=$flag_arg - setup_hd=$flag_arg - setup_iso=$flag_arg - setup_je=$flag_arg - setup_lp=$flag_arg - setup_mi=$flag_arg - setup_mi2=$flag_arg - setup_pa=$flag_arg - setup_sn=$flag_arg - setup_sg=$flag_arg - setup_tbb=$flag_arg - setup_tc=$flag_arg - setup_yal=$flag_arg - setup_rmalloc=$flag_arg - if [ -z "$darwin" ]; then - setup_tcg=$flag_arg # lacking 'malloc.h' - setup_dh=$flag_arg - setup_fg=$flag_arg - setup_lf=$flag_arg - setup_lt=$flag_arg # GNU only - setup_mng=$flag_arg # lacking getentropy() - setup_hm=$flag_arg # lacking - setup_mesh=$flag_arg - setup_rp=$flag_arg - setup_scudo=$flag_arg # lacking - setup_sm=$flag_arg # ../src/supermalloc.h:10:31: error: expected function body after function declarator + error: use of undeclared identifier 'MADV_HUGEPAGE' - else - if ! [ `uname -m` = "x86_64" ]; then - setup_dh=$flag_arg # does not compile on macos x64 - fi - fi - # only run Mesh's 'nomesh' configuration if asked - # setup_nomesh=$flag_arg - # bigger benchmarks - setup_lean=$flag_arg - setup_redis=$flag_arg - setup_rocksdb=$flag_arg - setup_linux=$flag_arg - setup_bench=$flag_arg - setup_packages=$flag_arg - ;; - bench) - setup_bench=$flag_arg;; - rmalloc) - setup_rmalloc=$flag_arg;; - ff) - setup_ff=$flag_arg;; - fg) - setup_fg=$flag_arg;; - dh) - setup_dh=$flag_arg;; - gd) - setup_gd=$flag_arg;; - hd) - setup_hd=$flag_arg;; - hm) - setup_hm=$flag_arg;; - iso) - setup_iso=$flag_arg;; - je) - setup_je=$flag_arg;; - lf) - setup_lf=$flag_arg;; - lp) - setup_lp=$flag_arg;; - lt) - setup_lt=$flag_arg;; - lean) - setup_lean=$flag_arg;; - mng) - setup_mng=$flag_arg;; - mesh) - setup_mesh=$flag_arg;; - mi) - setup_mi=$flag_arg;; - mi2) - setup_mi2=$flag_arg;; - nomesh) - setup_nomesh=$flag_arg;; - pa) - setup_pa=$flag_arg;; - packages) - setup_packages=$flag_arg;; - redis) - setup_redis=$flag_arg;; - rocksdb) - setup_rocksdb=$flag_arg;; - linux) - setup_linux=$flag_arg;; - rp) - setup_rp=$flag_arg;; - sc) - setup_sc=$flag_arg;; - scudo) - setup_scudo=$flag_arg;; - sg) - setup_sg=$flag_arg;; - sm) - setup_sm=$flag_arg;; - sn) - setup_sn=$flag_arg;; - tbb) - setup_tbb=$flag_arg;; - tc) - setup_tc=$flag_arg;; - tcg) - setup_tcg=$flag_arg;; - yal) - setup_yal=$flag_arg;; - - -r|--rebuild) - rebuild=1;; - -j=*|--procs=*) - procs=$flag_arg;; - -h|--help|-\?|help|\?) - echo "./build-bench-env [options]" - echo "" - echo " all setup and build (almost) everything" - echo "" - echo " --procs= number of processors (=$procs)" - echo " --rebuild force re-clone and re-build for given tools" - echo "" - echo " dh setup dieharder ($version_dh)" - echo " ff setup ffmalloc ($version_ff)" - echo " fg setup freeguard ($version_fg)" - echo " gd setup guarder ($version_gd)" - echo " hd setup hoard ($version_hd)" - echo " hm setup hardened_malloc ($version_hm)" - echo " iso setup isoalloc ($version_iso)" - echo " je setup jemalloc ($version_je)" - echo " lf setup lockfree-malloc ($version_lf)" - echo " lp setup libpas ($version_lp)" - echo " lt setup ltmalloc ($version_lt)" - echo " mesh setup mesh allocator ($version_mesh)" - echo " mi setup mimalloc ($version_mi)" - echo " mi2 setup mimalloc ($version_mi2)" - echo " mng setup mallocng ($version_mng)" - echo " nomesh setup mesh allocator w/o meshing ($version_mesh)" - echo " pa setup PartitionAlloc ($version_pa)" - echo " rp setup rpmalloc ($version_rp)" - echo " sc setup scalloc ($version_sc)" - echo " scudo setup scudo ($version_scudo)" - echo " sg setup slimguard ($version_sg)" - echo " sm setup supermalloc ($version_sm)" - echo " sn setup snmalloc ($version_sn)" - echo " tbb setup Intel TBB malloc ($version_tbb)" - echo " tc setup tcmalloc ($version_tc)" - echo " tcg setup Google's tcmalloc ($version_tcg)" - echo " yal setup yalloc ($version_yal)" - echo " rmalloc setup rmalloc($version_rmalloc)" - echo "" - echo " bench build all local benchmarks" - echo " lean setup lean 3 benchmark" - echo " packages setup required packages" - echo " redis setup redis benchmark" - echo " rocksdb setup rocksdb benchmark" - echo " linux setup linux benchmark" - echo "" - echo "Prefix an option with 'no-' to disable an option" - exit 0;; - *) echo "warning: unknown option \"$1\"." 1>&2 - esac - shift -done - -if test -f ./build-bench-env.sh; then - echo "" - echo "use '-h' to see all options" - echo "use 'all' to build all allocators" - echo "" - echo "building with $procs threads" - echo "--------------------------------------------" - echo "" -else - echo "error: must run from the toplevel mimalloc-bench directory!" - exit 1 -fi - -mkdir -p extern -readonly devdir="$curdir/extern" - -function phase { - cd "$curdir" - echo - echo - echo "--------------------------------------------" - echo "$1" - echo "--------------------------------------------" - echo -} - -function write_version { # name, git-tag, repo - commit=$(git log -n1 --format=format:"%h") - echo "$1: $2, $commit, $3" > "$devdir/version_$1.txt" -} - -function partial_checkout { # name, git-tag, git repo, directory to download - phase "build $1: version $2" - pushd $devdir - if test "$rebuild" = "1"; then - rm -rf "$1" - fi - if test -d "$1"; then - echo "$devdir/$1 already exists; no need to git clone" - cd "$1" - else - mkdir "$1" - cd "$1" - git init - git remote add origin $3 - git config extensions.partialClone origin - git sparse-checkout set $4 - fi - git fetch --depth=1 --filter=blob:none origin $2 - git checkout $2 - git reset origin/$2 --hard - write_version $1 $2 $3 -} - -function checkout { # name, git-tag, git repo, options - phase "build $1: version $2" - pushd $devdir - if test "$rebuild" = "1"; then - rm -rf "$1" - fi - if test -d "$1"; then - echo "$devdir/$1 already exists; no need to git clone" - else - git clone $4 $3 $1 - fi - cd "$1" - git checkout $2 - write_version $1 $2 $3 -} - -function check_checksum { # name, sha256sum - if (echo "$2 $1" | $SHA256SUM_CMD --check --status); then - echo "$1 has correct checksum" - else - echo "$1 has wrong checksum" - echo "$2 was expected" - $SHA256SUM_CMD $1 - fi -} - -function aptinstall { - echo "" - echo "> $SUDO apt install $1" - echo "" - $SUDO apt install -y --no-install-recommends $1 -} - -function dnfinstall { - echo "" - echo "> $SUDO dnf -y --quiet --nodocs install $1" - echo "" - $SUDO dnf -y --quiet --nodocs install $1 -} - -function apkinstall { - echo "" - echo "> apk add -q $1" - echo "" - apk add -q $1 -} - -function brewinstall { - echo "" - echo "> brew install $1" - echo "" - brew install $1 -} - -function aptinstallbazel { - echo "" - echo "> installing bazel" - echo "" - aptinstall apt-transport-https curl gnupg - curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg - $SUDO mv bazel.gpg /etc/apt/trusted.gpg.d/bazel.gpg - echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | $SUDO tee /etc/apt/sources.list.d/bazel.list - $SUDO apt update -qq - aptinstall bazel -} - -function dnfinstallbazel { - echo "" - echo "> installing bazel" - echo "" - dnfinstall dnf-plugins-core - $SUDO dnf copr -y enable vbatts/bazel - dnfinstall bazel5 -} - -if test "$all" = "1"; then - if test "$rebuild" = "1"; then - phase "clean $devdir for a full rebuild" - pushd "$devdir" - cd .. - rm -rf "extern/*" - popd - fi -fi - - -if test "$setup_packages" = "1"; then - phase "install packages" - if grep -q 'ID=fedora' /etc/os-release 2>/dev/null; then - # no 'apt update' equivalent needed on Fedora - dnfinstall "gcc-c++ clang lld llvm-devel unzip dos2unix bc gmp-devel wget gawk \ - cmake python3 ruby ninja-build libtool autoconf git patch time sed \ - ghostscript libatomic libstdc++ which gflags-devel xz readline-devel snappy-devel" - # bazel5 is broken on the copr: https://github.com/bazelbuild/bazel/issues/19295 - #dnfinstallbazel - elif grep -q -e 'ID=debian' -e 'ID=ubuntu' /etc/os-release 2>/dev/null; then - echo "updating package database... ($SUDO apt update)" - $SUDO apt update -qq - aptinstall "build-essential git gpg g++ clang lld llvm-dev unzip dos2unix linuxinfo bc libgmp-dev wget \ - cmake python3 ruby ninja-build libtool autoconf sed ghostscript time \ - curl automake libatomic1 libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev \ - liblz4-dev libzstd-dev libreadline-dev pkg-config gawk util-linux" - aptinstallbazel - elif grep -q -e 'ID=alpine' /etc/os-release 2>/dev/null; then - echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories - apk update - apkinstall "clang lld unzip dos2unix bc gmp-dev wget cmake python3 automake gawk \ - samurai libtool git build-base linux-headers autoconf util-linux sed \ - ghostscript libatomic gflags-dev readline-dev snappy-dev" - apkinstall "bazel@testing" - elif brew --version 2> /dev/null >/dev/null; then - brewinstall "dos2unix wget cmake ninja automake libtool gnu-time gmp mpir gnu-sed \ - ghostscript bazelisk gflags snappy" - elif grep -q 'Arch Linux' /etc/os-release; then - sudo pacman -S dos2unix wget cmake ninja automake libtool time gmp sed ghostscript bazelisk gflags snappy - fi -fi - -if test "$setup_rmalloc" = "1"; then - checkout rmalloc $version_rmalloc https://github.com/newell-romario/rmalloc - cmake -DCMAKE_BUILD_TYPE=RELEASE . - make - popd -fi - -if test "$setup_hm" = "1"; then - checkout hm $version_hm https://github.com/GrapheneOS/hardened_malloc - make CONFIG_NATIVE=true CONFIG_WERROR=false VARIANT=light -j $proc - make CONFIG_NATIVE=true CONFIG_WERROR=false VARIANT=default -j $proc - popd -fi - -if test "$setup_gd" = "1"; then - checkout gd $version_gd https://github.com/UTSASRG/Guarder - make -j $procs - popd -fi - -if test "$setup_iso" = "1"; then - checkout iso $version_iso https://github.com/struct/isoalloc - make library -j $procs - popd -fi - -if test "$setup_lf" = "1"; then - checkout lf $version_lf https://github.com/Begun/lockfree-malloc - make -j $procs liblite-malloc-shared.so - popd -fi - -if test "$setup_ff" = "1"; then - checkout ff $version_ff https://github.com/bwickman97/ffmalloc - make -j $procs - popd -fi - -if test "$setup_mng" = "1"; then - checkout mng $version_mng https://github.com/richfelker/mallocng-draft - make -j $procs - popd -fi - -if test "$setup_scudo" = "1"; then - partial_checkout scudo $version_scudo https://github.com/llvm/llvm-project "compiler-rt/lib/scudo/standalone" - cd "compiler-rt/lib/scudo/standalone" - # TODO: make the next line prettier instead of hardcoding everything. - clang++ -flto -fuse-ld=lld -fPIC -std=c++17 -fno-exceptions $CXXFLAGS -fno-rtti -fvisibility=internal -msse4.2 -O3 -I include -shared -o libscudo$extso *.cpp -pthread - cd - - popd -fi - -if test "$setup_fg" = "1"; then - checkout "fg" $version_fg https://github.com/UTSASRG/FreeGuard - make -j $procs SSE2RNG=1 - popd -fi - -if test "$setup_lp" = "1"; then - partial_checkout lp $version_lp https://github.com/WebKit/WebKit "Source/bmalloc/libpas" - cd "Source/bmalloc/libpas" - ORIG="" - if test "$darwin" = "1"; then - ORIG="_orig" - fi - sed -i $ORIG '/Werror/d' CMakeLists.txt - # Fix compilation with recent compilers - # (at least clang16 that enforces -Wimplicit-function-declaration) - sed -i $ORIG 's/extra_cmake_options=""/extra_cmake_options="-D_GNU_SOURCE=1"/' build.sh - # Remove once/if https://github.com/WebKit/WebKit/pull/1219 is merged - sed -i $ORIG 's/cmake --build $build_dir --parallel/cmake --build $build_dir --target pas_lib --parallel/' build.sh - if test "$darwin" = "1"; then - ./build.sh -s cmake -v default -t pas_lib - else - CC=clang CXX=clang++ LDFLAGS='-lpthread -latomic -pthread' bash ./build.sh -s cmake -v default -t pas_lib - fi - cd - - popd -fi - -if test "$setup_lt" = "1"; then - checkout lt $version_lt https://github.com/r-lyeh-archived/ltalloc - make -j $procs -C gnu.make.lib - popd -fi - -if test "$setup_pa" = "1"; then - checkout pa $version_pa https://github.com/1c3t3a/partition_alloc_builder.git - - # Setup depot_tools for building - if test -d depot_tools; then - echo "depot_tools alrady exist, no cloning" - else - git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git --depth=1 - fi - export PATH="$PATH:$PWD/depot_tools" - - # Fetch sources - this relies on a standalone build of PA - gclient config https://github.com/1c3t3a/partition_alloc_builder.git - gclient sync - cd partition_alloc_builder - - gn gen out/Default - autoninja -C out/Default - popd -fi - -if test "$setup_sg" = "1"; then - checkout sg $version_sg https://github.com/ssrg-vt/SlimGuard - make -j $procs - popd -fi - -if test "$setup_dh" = "1"; then - checkout dh $version_dh https://github.com/emeryberger/DieHard - # remove all the historical useless junk - rm -rf ./benchmarks/ ./src/archipelago/ ./src/build/ ./src/exterminator/ ./src/local/ ./src/original-diehard/ ./src/replicated/ ./docs - cd src - cmake -S . -B build - cmake --build build -j `nproc` - cd ../.. - popd -fi - -if test "$setup_tbb" = "1"; then - checkout tbb $version_tbb https://github.com/oneapi-src/oneTBB - cmake -DCMAKE_BUILD_TYPE=Release -DTBB_BUILD=OFF -DTBB_TEST=OFF -DTBB_OUTPUT_DIR_BASE=bench . - make -j $procs - popd -fi - -if test "$setup_tc" = "1"; then - checkout tc $version_tc https://github.com/gperftools/gperftools - if test -f configure; then - echo "already configured" - else - ./autogen.sh - CXXFLAGS="$CXXFLAGS -w -DNDEBUG -O2" ./configure --enable-minimal --disable-debugalloc - fi - make -j $procs # ends with error on benchmark, but thats ok. - #echo "" - #echo "(note: the error 'Makefile:3912: recipe for target 'malloc_bench' failed' is expected)" - popd -fi - -if test "$setup_tcg" = "1"; then - checkout tcg $version_tcg https://github.com/google/tcmalloc - bazel build -c opt tcmalloc - popd -fi - -if test "$setup_hd" = "1"; then - checkout hd $version_hd https://github.com/emeryberger/Hoard - cd src - if [ "`uname -m -s`" = "Darwin x86_64" ] ; then - sed -i_orig 's/-arch arm64/ /g' GNUmakefile # fix the makefile - fi - make -j $procs - popd -fi - -if test "$setup_je" = "1"; then - checkout je $version_je https://github.com/jemalloc/jemalloc - if test -f config.status; then - echo "$devdir/jemalloc is already configured; no need to reconfigure" - else - ./autogen.sh --enable-doc=no --enable-static=no --disable-stats - fi - make -j $procs - [ "$CI" ] && rm -rf ./src/*.o # jemalloc has like ~100MiB of object files - [ "$CI" ] && rm -rf ./lib/*.a # jemalloc produces 80MiB of static files - popd -fi - -if test "$setup_rp" = "1"; then - checkout rp $version_rp https://github.com/mjansson/rpmalloc - if test -f build.ninja; then - echo "$devdir/rpmalloc is already configured; no need to reconfigure" - else - python3 configure.py - fi - # fix build using clang-16 - # see https://github.com/mjansson/rpmalloc/issues/316 - sed -i 's/-Werror//' build.ninja - ninja - popd -fi - -if test "$setup_sn" = "1"; then - checkout sn $version_sn https://github.com/Microsoft/snmalloc - if test -f release/build.ninja; then - echo "$devdir/snmalloc is already configured; no need to reconfigure" - else - mkdir -p release - cd release - # CXX11_DESTRUCTORS is needed as broken on Alpine without, should be fixed in the future upstrem. - env CXX=clang++ cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release -DSNMALLOC_CLEANUP=CXX11_DESTRUCTORS - cd .. - fi - cd release - ninja libsnmallocshim$extso libsnmallocshim-checks$extso - popd -fi - -if test "$setup_sm" = "1"; then - checkout sm $version_sm https://github.com/kuszmaul/SuperMalloc - rm -rf ./doc ./paper "./short-talk" - sed -i "s/-Werror//" Makefile.include - cd release - make -j $procs - popd -fi - -if test "$setup_mesh" = "1"; then - checkout mesh $version_mesh https://github.com/plasma-umass/mesh - cmake . - make # https://github.com/plasma-umass/Mesh/issues/96 - popd -fi - -if test "$setup_nomesh" = "1"; then - checkout nomesh $version_nomesh https://github.com/plasma-umass/mesh - cmake . -DDISABLE_MESHING=ON - make # https://github.com/plasma-umass/Mesh/issues/96 - popd -fi - -if test "$setup_sc" = "1"; then - checkout sc $version_sc https://github.com/cksystemsgroup/scalloc - if test -f Makefile; then - echo "$devdir/scalloc is already configured; no need to reconfigure" - else - if test -f build/gyp/gyp; then - echo "$devdir/scalloc has the gyp tools installed; no need to re-download" - else - tools/make_deps.sh - fi - build/gyp/gyp --depth=. scalloc.gyp - fi - BUILDTYPE=Release make -j $procs - popd -fi - -if test "$setup_mi" = "1"; then - checkout mi $version_mi https://github.com/microsoft/mimalloc - - echo "" - echo "- build mimalloc release" - - cmake -B out/release - cmake --build out/release --parallel $procs - - echo "" - echo "- build mimalloc debug with full checking" - - cmake -B out/debug -DMI_CHECK_FULL=ON - cmake --build out/debug --parallel $procs - - echo "" - echo "- build mimalloc secure" - - cmake -B out/secure -DMI_SECURE=ON - cmake --build out/secure --parallel $procs - popd -fi - -if test "$setup_mi2" = "1"; then - checkout mi2 $version_mi2 https://github.com/microsoft/mimalloc - - echo "" - echo "- build mimalloc2 release" - - cmake -B out/release - cmake --build out/release --parallel $procs - - echo "" - echo "- build mimalloc2 debug with full checking" - - cmake -B out/debug -DMI_CHECK_FULL=ON - cmake --build out/debug --parallel $procs - - echo "" - echo "- build mimalloc2 secure" - - cmake -B out/secure -DMI_SECURE=ON - cmake --build out/secure --parallel $procs - popd -fi - -if test "$setup_yal" = "1"; then - checkout yal $version_yal https://github.com/jorisgeer/yalloc - ./build.sh -V -fi - -phase "install benchmarks" - -if test "$setup_rocksdb" = "1"; then - phase "build rocksdb $version_rocksdb" - - pushd "$devdir" - if test -d "rocksdb-$version_rocksdb"; then - echo "$devdir/rocksdb-$version_rocksdb already exists; no need to download it" - else - wget --no-verbose "https://github.com/facebook/rocksdb/archive/refs/tags/v$version_rocksdb.tar.gz" -O rocksdb-$version_rocksdb.tar.gz - tar xzf "rocksdb-$version_rocksdb.tar.gz" - rm "./rocksdb-$version_rocksdb.tar.gz" - fi - - cd "rocksdb-$version_rocksdb" - DISABLE_WARNING_AS_ERROR=1 DISABLE_JEMALLOC=1 ROCKSDB_DISABLE_TCMALLOC=1 make db_bench -j $procs - [ "$CI" ] && find . -name '*.o' -delete - popd -fi - -if test "$setup_lean" = "1"; then - phase "build lean $version_lean" - checkout lean $version_lean https://github.com/leanprover-community/lean - set +e - patch -p1 -N -r- < ../../patches/lean.patch - set -e - mkdir -p out/release - cd out/release - env CC=gcc CXX="g++" cmake ../../src -DCUSTOM_ALLOCATORS=OFF -DLEAN_EXTRA_CXX_FLAGS="-w" -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - echo "make -j$procs" - make -j $procs - rm -rf ./tests/ # we don't need tests - mkdir -p "$devdir/mathlib" - cp -u "$devdir/lean/leanpkg/leanpkg.toml" "$devdir/mathlib" - popd -fi - -if test "$setup_redis" = "1"; then - phase "build redis $version_redis" - - pushd "$devdir" - if test -d "redis-$version_redis"; then - echo "$devdir/redis-$version_redis already exists; no need to download it" - else - wget --no-verbose "https://download.redis.io/releases/redis-$version_redis.tar.gz" - tar xzf "redis-$version_redis.tar.gz" - rm "./redis-$version_redis.tar.gz" - fi - - cd "redis-$version_redis/src" - USE_JEMALLOC=no MALLOC=libc BUILD_TLS=no make -j $procs - popd -fi - -if test "$setup_bench" = "1"; then - phase "patch shbench" - pushd "bench/shbench" - if test -f sh6bench-new.c; then - echo "do nothing: bench/shbench/sh6bench-new.c already exists" - else - wget --no-verbose http://www.microquill.com/smartheap/shbench/bench.zip - check_checksum "bench.zip" "$sha256sum_sh6bench" - unzip -o bench.zip - dos2unix sh6bench.patch - dos2unix sh6bench.c - patch -p1 -o sh6bench-new.c sh6bench.c sh6bench.patch - fi - if test -f sh8bench-new.c; then - echo "do nothing: bench/shbench/sh8bench-new.c already exists" - else - wget --no-verbose http://www.microquill.com/smartheap/SH8BENCH.zip - check_checksum "SH8BENCH.zip" "$sha256sum_sh8bench" - unzip -o SH8BENCH.zip - dos2unix sh8bench.patch - dos2unix SH8BENCH.C - patch -p1 -o sh8bench-new.c SH8BENCH.C sh8bench.patch - fi - popd - - phase "get large PDF document" - - readonly pdfdoc="large.pdf" - readonly pdfurl="https://raw.githubusercontent.com/geekaaron/Resources/master/resources/Writing_a_Simple_Operating_System--from_Scratch.pdf " - #readonly pdfurl="https://www.intel.com/content/dam/develop/external/us/en/documents/325462-sdm-vol-1-2abcd-3abcd-508360.pdf" - pushd "$devdir" - if test -f "$pdfdoc"; then - echo "do nothing: $devdir/$pdfdoc already exists" - else - useragent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" - wget --no-verbose -O "$pdfdoc" -U "useragent" $pdfurl - fi - popd - - phase "get lua" - checkout lua $version_lua https://github.com/lua/lua - popd - - phase "build benchmarks" - - cmake -B out/bench -S bench - cmake --build out/bench --parallel $procs -fi - -if test "$setup_linux" = "1"; then - phase "fetch linux" - pushd "$devdir" - if test -d "linux-$version_linux"; then - echo "$devdir/linux-$version_linux already exists; no need to download it" - else - wget --no-verbose "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-$version_linux.tar.xz" - tar xf "linux-$version_linux.tar.xz" - rm "./linux-$version_linux.tar.xz" - fi - popd -fi - -curdir=`pwd` - -phase "installed allocators" -cat $devdir/version_*.txt 2>/dev/null | tee $devdir/versions.txt | column -t || true - -phase "done in $curdir" -echo "run the cfrac benchmarks as:" -echo "> cd out/bench" -echo "> ../../bench.sh alla cfrac" -echo -echo "to see all options use:" -echo "> ../../bench.sh help" -echo