#!/usr/bin/env bash set -euo pipefail # A/B sweep for Mid (2–32KiB) with WRAP L1 ON, varying DYN1 CAP and min bundle. # Saves logs under docs/benchmarks/. RUNTIME=${RUNTIME:-1} THREADS_CSV=${THREADS:-"1,4"} CAPS=${CAPS:-"32,64,128"} MINB=${MINB:-"2,3,4"} DYN1=${DYN1:-14336} BENCH_TIMEOUT=${BENCH_TIMEOUT:-} KILL_GRACE=${KILL_GRACE:-2} ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" OUTDIR="$ROOT_DIR/docs/benchmarks/$(date +%Y%m%d_%H%M%S)_AB_MID" mkdir -p "$OUTDIR" LIB="$(readlink -f "$ROOT_DIR/libhakmem.so")" LARSON="$ROOT_DIR/mimalloc-bench/bench/larson/larson" echo "A/B sweep (Mid 2–32KiB) RUNTIME=${RUNTIME}s THREADS=${THREADS_CSV}" | tee "$OUTDIR/summary.txt" echo "DYN1=${DYN1} CAPS={${CAPS}} MINB={${MINB}}" | tee -a "$OUTDIR/summary.txt" if [[ -z "${BENCH_TIMEOUT}" ]]; then BENCH_TIMEOUT=$(( RUNTIME + 3 )) fi IFS=',' read -r -a TARR <<< "$THREADS_CSV" IFS=',' read -r -a CARR <<< "$CAPS" IFS=',' read -r -a MARR <<< "$MINB" for cap in "${CARR[@]}"; do for mb in "${MARR[@]}"; do for t in "${TARR[@]}"; do label="cap${cap}_mb${mb}_T${t}" echo "== $label ==" | tee -a "$OUTDIR/summary.txt" timeout -k "${KILL_GRACE}s" "${BENCH_TIMEOUT}s" \ env HAKMEM_WRAP_L2=1 HAKMEM_WRAP_L25=1 \ HAKMEM_LEARN=0 HAKMEM_MID_DYN1="$DYN1" HAKMEM_CAP_MID_DYN1="$cap" \ HAKMEM_POOL_MIN_BUNDLE="$mb" \ LD_PRELOAD="$LIB" "$LARSON" "$RUNTIME" 2048 32768 10000 1 12345 "$t" 2>&1 \ | tee "$OUTDIR/${label}.log" | tail -n 3 | tee -a "$OUTDIR/summary.txt" done done done echo "Saved: $OUTDIR" | tee -a "$OUTDIR/summary.txt"