Files
hakmem/docs/analysis/RESEARCH_BOXES_SSOT.md
Moe Charm (CI) e4c5f05355 Phase 86: Free Path Legacy Mask (NO-GO, +0.25%)
## Summary

Implemented Phase 86 "mask-only commit" optimization for free path:
- Bitset mask (0x7f for C0-C6) to identify LEGACY classes
- Direct call to tiny_legacy_fallback_free_base_with_env()
- No indirect function pointers (avoids Phase 85's -0.86% regression)
- Fail-fast on LARSON_FIX=1 (cross-thread validation incompatibility)

## Results (10-run SSOT)

**NO-GO**: +0.25% improvement (threshold: +1.0%)
- Control:    51,750,467 ops/s (CV: 2.26%)
- Treatment:  51,881,055 ops/s (CV: 2.32%)
- Delta:      +0.25% (mean), -0.15% (median)

## Root Cause

Competing optimizations plateau:
1. Phase 9/10 MONO LEGACY (+1.89%) already capture most free path benefit
2. Remaining margin insufficient to overcome:
   - Two branch checks (mask_enabled + has_class)
   - I-cache layout tax in hot path
   - Direct function call overhead

## Phase 85 vs Phase 86

| Metric | Phase 85 | Phase 86 |
|--------|----------|----------|
| Approach | Indirect calls + table | Bitset mask + direct call |
| Result | -0.86% | +0.25% |
| Verdict | NO-GO (regression) | NO-GO (insufficient) |

Phase 86 correctly avoided indirect call penalties but revealed architectural
limit: can't escape Phase 9/10 overlay without restructuring.

## Recommendation

Free path optimization layer has reached practical ceiling:
- Phase 9/10 +1.89% + Phase 6/19/FASTLANE +16-27% ≈ 18-29% total
- Further attempts on ceremony elimination face same constraints
- Recommend focus on different optimization layers (malloc, etc.)

## Files Changed

### New
- core/box/free_path_legacy_mask_box.h (API + globals)
- core/box/free_path_legacy_mask_box.c (refresh logic)

### Modified
- core/bench_profile.h (added refresh call)
- core/front/malloc_tiny_fast.h (added Phase 86 fast path check)
- Makefile (added object files)
- CURRENT_TASK.md (documented result)

All changes conditional on HAKMEM_FREE_PATH_LEGACY_MASK=1 (default OFF).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-18 22:05:34 +09:00

2.9 KiB
Raw Blame History

Research Boxes SSOT凍結箱の扱いと迷子防止

目的: 「凍結箱が増えて混乱する」を防ぐ。削除はしないlayout tax で性能が符号反転しやすいため)。 代わりに **“見える化 + 触らない規約 + cleanenv”**で整理する。

原則Box Theory 運用)

  • 本線SSOT: scripts/run_mixed_10_cleanenv.sh + HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE を正とする。
  • 研究箱FROZEN: 既定 OFF。使うときは ENV を明示し、A/B は同一バイナリで行う。
  • 削除禁止(原則):
    • .o をリンクから外す / 大量削除は layout tax で速度が動くので封印。
    • 代替: #if HAKMEM_*_COMPILED の compile-out、または hot path からの完全除外(参照しない)で“凍結”する。

“ころころ”の典型原因と対策

  • HAKMEM_PROFILE 未指定 → route が変わり数値が破綻
    • 対策: 比較スクリプトは必ず HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE を明示
  • export 漏れ(過去実験の ENV が残っている)
    • 対策: scripts/run_mixed_10_cleanenv.sh を正として運用
  • 別バイナリ比較layout差
    • 対策: allocator reference は scripts/run_allocator_preload_matrix.sh同一バイナリLD_PRELOADも併用
  • CPU power/thermal の変動(同一マシンでも起きる)
    • 対策: HAKMEM_BENCH_ENV_LOG=1scripts/run_mixed_10_cleanenv.sh が簡易環境ログを出力するgovernor/EPP/freq

研究箱の“棚卸し”のやり方(手順)

  1. ノブ一覧を出す:
    • scripts/list_hakmem_knobs.sh
  2. SSOTで常に固定する値は scripts/run_mixed_10_cleanenv.sh に寄せる:
    • “本線ON”はデフォルト値にして、漏れ防止で export ...=${...:-<default>}
    • “研究箱OFF”は export ...=0 で明示
  3. 研究箱を触るときは、必ず結果docに:
    • 対象ブ、default、A/B条件binary、profile、ITERS/WS、RUNS
    • GO/NEUTRAL/NO-GO と rollback 方法

いまのおすすめ方針(短縮)

  • 本線の性能/安定を崩さない目的なら「研究箱を消す」より「SSOTで踏まない」を徹底するのが安全。
  • 研究箱を“削除”するのは、次の条件を満たしたときだけ:
    • (1) 少なくとも 2週間以上使っていない、(2) SSOT/bench_profile/cleanenv が参照していない、 (3) 同一バイナリ A/B で削除しても性能が変わらないlayout tax 無い)ことを確認した。

外部相談のSSOT貼り付けパケット

凍結箱が増えてくると「どの経路を踏んでるか」が外部に説明しづらくなるので、 レビュー依頼は “圧縮パケット” を正として使う:

  • 生成: scripts/make_chatgpt_pro_packet_free_path.sh
  • スナップショット: docs/analysis/FREE_PATH_REVIEW_PACKET_CHATGPT.md