blob: a9a654cbefeaf19515e8824351ff003afa1c0ccd [file]
#!/bin/bash
#
# Build and run Chapter 5 experiments.
#
# Usage:
# ./run.sh [experiment] [simd]
#
# experiment: e5_1 | e5_2 | e5_4 | all (default: all)
# simd: on | off | both (default: both)
#
# Examples:
# ./run.sh all both # run all experiments with SIMD ON and OFF
# ./run.sh e5_1 on # run E5-1 only with SIMD ON
# ./run.sh e5_4 # run E5-4 (SIMD irrelevant for this one)
#
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
EXPERIMENT=${1:-all}
SIMD_MODE=${2:-both}
# E5-1 / E5-2 row counts (reduce for quick testing)
CODEC_ROWS=${CODEC_ROWS:-20000000} # 20M per dtype
FILTER_ROWS=${FILTER_ROWS:-200000000} # 200M
# Find cmake
CMAKE=$(command -v cmake 2>/dev/null || echo "")
if [ -z "$CMAKE" ] && [ -x "/Applications/CMake.app/Contents/bin/cmake" ]; then
CMAKE="/Applications/CMake.app/Contents/bin/cmake"
fi
if [ -z "$CMAKE" ]; then
echo "ERROR: cmake not found"
exit 1
fi
NCPU=$(sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 4)
# ─── Build helper ────────────────────────────────────────────────────────────
build_target() {
local target=$1
local simd=$2 # ON or OFF
local label=$3 # C1 or C3
local BUILD_DIR="$PROJECT_DIR/cmake-build-release-${label}"
echo " [build] $target (SIMD=$simd) -> $BUILD_DIR"
mkdir -p "$BUILD_DIR"
cd "$BUILD_DIR"
"$CMAKE" -DCMAKE_BUILD_TYPE=Release \
-DENABLE_SIMD=$simd \
-DENABLE_THREADS=OFF \
-DBUILD_TEST=OFF \
"$PROJECT_DIR" > /dev/null 2>&1
"$CMAKE" --build . --target "$target" -j"$NCPU" 2>&1 | tail -3
cd "$SCRIPT_DIR"
}
# ─── E5-1: Codec Throughput ─────────────────────────────────────────────────
run_e5_1() {
local simd=$1 # ON or OFF
local label=$2 # C1 or C3
local BUILD_DIR="$PROJECT_DIR/cmake-build-release-${label}"
local OUT_DIR="$SCRIPT_DIR/E5_1_codec"
build_target codec_bench "$simd" "$label"
echo " [run] codec_bench (${label}, ${CODEC_ROWS} rows)"
"$BUILD_DIR/experiment/chap05/codec_bench" "$CODEC_ROWS" "$OUT_DIR"
echo ""
}
# ─── E5-2: Filter + Late Materialization ────────────────────────────────────
run_e5_2() {
local simd=$1
local label=$2
local BUILD_DIR="$PROJECT_DIR/cmake-build-release-${label}"
local OUT_DIR="$SCRIPT_DIR/E5_2_filter_latmat"
build_target filter_bench "$simd" "$label"
echo " [run] filter_bench (${label}, ${FILTER_ROWS} rows)"
"$BUILD_DIR/experiment/chap05/filter_bench" all "$FILTER_ROWS" "$OUT_DIR"
echo ""
}
# ─── E5-4: Block Filter Precision ──────────────────────────────────────────
run_e5_4() {
# E5-4 is SIMD-independent (pure decoder analysis), build with default
local BUILD_DIR="$PROJECT_DIR/cmake-build-release-C1"
local OUT_DIR="$SCRIPT_DIR/E5_4_block_filter"
build_target block_filter_bench OFF C1
echo " [run] block_filter_bench"
"$BUILD_DIR/experiment/chap05/block_filter_bench" "$OUT_DIR"
echo ""
}
# ─── Main ────────────────────────────────────────────────────────────────────
echo "========================================"
echo " Chapter 5: SIMD & Filter Experiments"
echo "========================================"
echo " experiment: $EXPERIMENT"
echo " simd_mode: $SIMD_MODE"
echo " codec_rows: $CODEC_ROWS"
echo " filter_rows: $FILTER_ROWS"
echo ""
run_with_simd() {
local exp=$1
if [ "$SIMD_MODE" = "off" ] || [ "$SIMD_MODE" = "both" ]; then
echo "━━━ ${exp} (C1: SIMD OFF) ━━━"
"run_${exp}" OFF C1
fi
if [ "$SIMD_MODE" = "on" ] || [ "$SIMD_MODE" = "both" ]; then
echo "━━━ ${exp} (C3: SIMD ON) ━━━"
"run_${exp}" ON C3
fi
}
case "$EXPERIMENT" in
e5_1)
run_with_simd e5_1
;;
e5_2)
run_with_simd e5_2
;;
e5_4)
run_e5_4
;;
all)
run_e5_4
run_with_simd e5_1
run_with_simd e5_2
;;
*)
echo "Unknown experiment: $EXPERIMENT"
echo "Usage: $0 [e5_1|e5_2|e5_4|all] [on|off|both]"
exit 1
;;
esac
echo "========================================"
echo " Done! Results in:"
echo " E5-1: $SCRIPT_DIR/E5_1_codec/"
echo " E5-2: $SCRIPT_DIR/E5_2_filter_latmat/"
echo " E5-4: $SCRIPT_DIR/E5_4_block_filter/"
echo "========================================"