Phase 75-2: C5-only Inline Slots (P2) - GO (+1.10%)
Extends Phase 75-1 pattern to C5 class (28.5% of C4-C7 ops): - Created 4 new boxes: env_box, tls_box, fast_path_api, TLS variable - Integration: 2 minimal boundary points (alloc/free for C5) - Test strategy: C5-only isolation (baseline C5=OFF+C6=ON, treatment C5=ON+C6=ON) - Default OFF: zero overhead when disabled Results (10-run Mixed SSOT, WS=400, C6 already enabled): - Baseline (C5=OFF, C6=ON): 44.26 M ops/s (σ=0.37) - Treatment (C5=ON, C6=ON): 44.74 M ops/s (σ=0.54) - Delta: +0.49 M ops/s (+1.10%) Status: ✅ GO - C5 individual contribution confirmed Cumulative since Phase 75-0: +2.87% (C6) + 1.10% (C5) = potential +3.97% combined Next: Phase 75-3 (test C5+C6 interaction + non-additivity + promote to preset default) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
142
scripts/phase75_c5_inline_test.sh
Executable file
142
scripts/phase75_c5_inline_test.sh
Executable file
@ -0,0 +1,142 @@
|
||||
#!/bin/bash
|
||||
# Phase 75-2: C5 Inline Slots A/B Test (C5-only, with C6=ON baseline)
|
||||
#
|
||||
# Strategy: Isolate C5 individual contribution
|
||||
# Baseline: C5=OFF, C6=ON (from Phase 75-1, now the new baseline)
|
||||
# Treatment: C5=ON, C6=ON (adds C5 on top)
|
||||
#
|
||||
# Decision Gate:
|
||||
# GO: +1.0% or higher
|
||||
# NEUTRAL: -1.0% to +1.0%
|
||||
# NO-GO: -1.0% or lower
|
||||
|
||||
set -e
|
||||
|
||||
echo "==========================================="
|
||||
echo "Phase 75-2: C5 Inline Slots A/B Test"
|
||||
echo "==========================================="
|
||||
echo "(Baseline: C5=OFF, C6=ON; Treatment: C5=ON, C6=ON)"
|
||||
echo ""
|
||||
|
||||
# Build baseline (C6=ON, C5=OFF)
|
||||
echo "Building baseline (C6=ON, C5=OFF)..."
|
||||
HAKMEM_TINY_C6_INLINE_SLOTS=1 make clean > /dev/null 2>&1
|
||||
HAKMEM_TINY_C6_INLINE_SLOTS=1 make -j bench_random_mixed_hakmem > /tmp/c5_inline_build_baseline.log 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: Baseline build failed!"
|
||||
tail -20 /tmp/c5_inline_build_baseline.log
|
||||
exit 1
|
||||
fi
|
||||
echo "Baseline build: OK"
|
||||
|
||||
# Run baseline 10x
|
||||
echo ""
|
||||
echo "Running baseline 10x (WS=400, ITERS=20000000)..."
|
||||
echo "Config: C5=OFF, C6=ON"
|
||||
for i in {1..10}; do
|
||||
echo " Run $i/10 (C5=OFF, C6=ON)"
|
||||
HAKMEM_WARM_POOL_SIZE=16 HAKMEM_TINY_C6_INLINE_SLOTS=1 HAKMEM_TINY_C5_INLINE_SLOTS=0 \
|
||||
./bench_random_mixed_hakmem 20000000 400 1 2>&1
|
||||
done > /tmp/c5_inline_baseline.log 2>&1
|
||||
|
||||
# Build treatment (C6=ON, C5=ON)
|
||||
echo ""
|
||||
echo "Building treatment (C6=ON, C5=ON)..."
|
||||
HAKMEM_TINY_C6_INLINE_SLOTS=1 HAKMEM_TINY_C5_INLINE_SLOTS=1 make clean > /dev/null 2>&1
|
||||
HAKMEM_TINY_C6_INLINE_SLOTS=1 HAKMEM_TINY_C5_INLINE_SLOTS=1 make -j bench_random_mixed_hakmem > /tmp/c5_inline_build_treatment.log 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: Treatment build failed!"
|
||||
tail -20 /tmp/c5_inline_build_treatment.log
|
||||
exit 1
|
||||
fi
|
||||
echo "Treatment build: OK"
|
||||
|
||||
# Run treatment 10x with perf stat
|
||||
echo ""
|
||||
echo "Running treatment 10x with perf stat (C5=ON, C6=ON)..."
|
||||
echo "Config: C5=ON, C6=ON"
|
||||
for i in {1..10}; do
|
||||
echo " Run $i/10 (C5=ON, C6=ON)"
|
||||
HAKMEM_WARM_POOL_SIZE=16 HAKMEM_TINY_C6_INLINE_SLOTS=1 HAKMEM_TINY_C5_INLINE_SLOTS=1 \
|
||||
perf stat -e cycles,instructions,branches,branch-misses,cache-misses,dTLB-load-misses \
|
||||
./bench_random_mixed_hakmem 20000000 400 1 2>&1
|
||||
done > /tmp/c5_inline_treatment.log 2>&1
|
||||
|
||||
# Analysis
|
||||
echo ""
|
||||
echo "==========================================="
|
||||
echo "ANALYSIS: Throughput Comparison"
|
||||
echo "==========================================="
|
||||
|
||||
BASELINE_AVG=$(grep "Throughput" /tmp/c5_inline_baseline.log | awk '{print $3}' | sed 's/ops\/s//' | awk '{s+=$1; n++} END {printf "%.2f", s/n/1000000}')
|
||||
TREATMENT_AVG=$(grep "Throughput" /tmp/c5_inline_treatment.log | awk '{print $3}' | sed 's/ops\/s//' | awk '{s+=$1; n++} END {printf "%.2f", s/n/1000000}')
|
||||
|
||||
echo "Baseline (C5=OFF, C6=ON): $BASELINE_AVG M ops/s"
|
||||
echo "Treatment (C5=ON, C6=ON): $TREATMENT_AVG M ops/s"
|
||||
|
||||
DELTA=$(awk "BEGIN {printf \"%.2f\", $TREATMENT_AVG - $BASELINE_AVG}")
|
||||
DELTA_PCT=$(awk "BEGIN {printf \"%.2f\", (($TREATMENT_AVG - $BASELINE_AVG) / $BASELINE_AVG) * 100}")
|
||||
|
||||
echo "Delta: +$DELTA M ops/s (+$DELTA_PCT%)"
|
||||
|
||||
echo ""
|
||||
echo "==========================================="
|
||||
echo "PERF STAT ANALYSIS (Treatment)"
|
||||
echo "==========================================="
|
||||
|
||||
# Extract perf stat averages from treatment
|
||||
INSTRUCTIONS=$(grep "instructions" /tmp/c5_inline_treatment.log | awk '{sum+=$1; count++} END {printf "%.0f", sum/count}')
|
||||
BRANCHES=$(grep -w "branches" /tmp/c5_inline_treatment.log | awk '{sum+=$1; count++} END {printf "%.0f", sum/count}')
|
||||
CACHE_MISSES=$(grep "cache-misses" /tmp/c5_inline_treatment.log | awk '{sum+=$1; count++} END {printf "%.0f", sum/count}')
|
||||
DTLB_MISSES=$(grep "dTLB-load-misses" /tmp/c5_inline_treatment.log | awk '{sum+=$1; count++} END {printf "%.0f", sum/count}')
|
||||
|
||||
echo "Instructions: $INSTRUCTIONS"
|
||||
echo "Branches: $BRANCHES"
|
||||
echo "Cache-misses: $CACHE_MISSES"
|
||||
echo "dTLB-load-misses: $DTLB_MISSES"
|
||||
|
||||
echo ""
|
||||
echo "==========================================="
|
||||
echo "DECISION GATE (+1.0% GO threshold)"
|
||||
echo "==========================================="
|
||||
|
||||
# Decision logic
|
||||
GO_THRESHOLD=1.0
|
||||
NOGO_THRESHOLD=-1.0
|
||||
|
||||
if (( $(echo "$DELTA_PCT >= $GO_THRESHOLD" | bc -l) )); then
|
||||
echo "Result: GO (+$DELTA_PCT%)"
|
||||
echo "Recommendation: Proceed to Phase 75-3 (C5+C6 interaction test)"
|
||||
DECISION="GO"
|
||||
elif (( $(echo "$DELTA_PCT <= $NOGO_THRESHOLD" | bc -l) )); then
|
||||
echo "Result: NO-GO ($DELTA_PCT%)"
|
||||
echo "Recommendation: REVERT immediately, keep C6-only from Phase 75-1"
|
||||
DECISION="NO-GO"
|
||||
else
|
||||
echo "Result: NEUTRAL ($DELTA_PCT%)"
|
||||
echo "Recommendation: Freeze, evaluate in Phase 76"
|
||||
DECISION="NEUTRAL"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "==========================================="
|
||||
echo "LOGS & DATA"
|
||||
echo "==========================================="
|
||||
echo "Build logs:"
|
||||
echo " - Baseline: /tmp/c5_inline_build_baseline.log"
|
||||
echo " - Treatment: /tmp/c5_inline_build_treatment.log"
|
||||
echo ""
|
||||
echo "Benchmark logs:"
|
||||
echo " - Baseline: /tmp/c5_inline_baseline.log"
|
||||
echo " - Treatment: /tmp/c5_inline_treatment.log"
|
||||
echo ""
|
||||
echo "==========================================="
|
||||
|
||||
# Exit with status based on decision
|
||||
if [ "$DECISION" = "GO" ]; then
|
||||
exit 0
|
||||
elif [ "$DECISION" = "NO-GO" ]; then
|
||||
exit 1
|
||||
else
|
||||
exit 2 # NEUTRAL
|
||||
fi
|
||||
Reference in New Issue
Block a user