Implementation:
- Intrusive LIFO tcache layer (L1) before UnifiedCache
- TLS per-class bins (head pointer + count)
- Intrusive next pointers (via tiny_next_store/load SSOT)
- Cap: 64 blocks per class (default)
- ENV: HAKMEM_TINY_TCACHE=0/1 (default: 0, OFF)
A/B Test Results (Mixed 10-run):
- Baseline (TCACHE=0): 51,083,379 ops/s
- Optimized (TCACHE=1): 51,186,838 ops/s
- Mean delta: +0.20% (below +1.0% GO threshold)
- Median delta: +0.59%
Verdict: NEUTRAL - Freeze as research box (default OFF)
Root Cause (v1 wiring incomplete):
- Free side pushes to tcache via unified_cache_push()
- Alloc hot path (tiny_hot_alloc_fast) doesn't consume tcache
- tcache becomes "sink" without alloc-side pop → ROI not measurable
Files:
- Created: core/box/tiny_tcache_{env_box,box}.h, tiny_tcache_env_box.c
- Modified: core/front/tiny_unified_cache.h (integration)
- Modified: core/bench_profile.h (refresh sync)
- Modified: Makefile (build integration)
- Results: docs/analysis/PHASE14_POINTER_CHASE_REDUCTION_1_AB_TEST_RESULTS.md
- v2 Instructions: docs/analysis/PHASE14_POINTER_CHASE_REDUCTION_2_NEXT_INSTRUCTIONS.md
Next: Phase 14 v2 (connect tcache to tiny_front_hot_box alloc/free hot path)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
3.3 KiB
3.3 KiB
Phase 14: Pointer-Chase Reduction v1 — 次の指示書(Tiny tcache intrusive LIFO)
0. Status
- Phase 13 v1 / E5-2 で header write tax は NEUTRAL → 次の仮説へ
- 次の芯: thread cache / pointer chase(system malloc の tcache と構造差が濃厚)
設計: docs/analysis/PHASE14_POINTER_CHASE_REDUCTION_1_DESIGN.md
1. 目的(GO 条件)
Mixed 10-run(clean env)で:
- GO: mean +1.0% 以上
- NO-GO: mean -1.0% 以下(即 rollback / freeze)
- NEUTRAL: ±1.0%(research box freeze)
2. 実装パッチ順(小さく積む)
Patch 1: L0 ENV Box(戻せる + refresh)
新規:
core/box/tiny_tcache_env_box.hcore/box/tiny_tcache_env_box.c
ENV:
HAKMEM_TINY_TCACHE=0/1(default: 0)HAKMEM_TINY_TCACHE_CAP=64(default: 64)
API:
tiny_tcache_enabled()tiny_tcache_cap()tiny_tcache_env_refresh_from_env()
要件:
- hot path に
getenv()を置かない(cached read のみ)
Patch 2: L1 tcache Box(intrusive LIFO)
新規:
core/box/tiny_tcache_box.h
中身:
__threadの head/count を class 別に持つ(8クラス固定)- next pointer の読み書きは
tiny_next_store/loadを必須にする
API:
tiny_tcache_try_push(class_idx, base) -> booltiny_tcache_try_pop(class_idx) -> void*(BASE or NULL)
Patch 3: 統合点は unified_cache の内部(call site を増やさない)
修正:
core/front/tiny_unified_cache.h(unified_cache_push/popの先頭に “1回だけ if”)
方針:
- tcache hit: 即 return(配列に触らない)
- miss/overflow: 既存 array cache にフォールバック
Patch 4: bench_profile の refresh 同期
修正:
core/bench_profile.h
追加:
bench_setenv_default(...)後にtiny_tcache_env_refresh_from_env()を呼ぶ
3. A/B テスト(同一バイナリ)
Baseline:
HAKMEM_TINY_TCACHE=0 scripts/run_mixed_10_cleanenv.sh
Optimized:
HAKMEM_TINY_TCACHE=1 scripts/run_mixed_10_cleanenv.sh
任意(cap 探索は research):
HAKMEM_TINY_TCACHE=1 HAKMEM_TINY_TCACHE_CAP=32 scripts/run_mixed_10_cleanenv.sh
HAKMEM_TINY_TCACHE=1 HAKMEM_TINY_TCACHE_CAP=64 scripts/run_mixed_10_cleanenv.sh
HAKMEM_TINY_TCACHE=1 HAKMEM_TINY_TCACHE_CAP=128 scripts/run_mixed_10_cleanenv.sh
4. 可視化(最小)
必要なら tcache hit/miss を TLS カウンタで持つ(atomic 禁止)。
“勝ち筋確認が必要なときだけ” fprintf(stderr, ...) でワンショット dump(常時ログ禁止)。
5. 昇格(GO の場合のみ)
GO のとき:
- preset へ追加(まずは
MIXED_TINYV3_C7_SAFEのみ) CURRENT_TASK.mdに A/B を記録- rollback 手順:
export HAKMEM_TINY_TCACHE=0
NO-GO/NEUTRAL のとき:
- research box freeze(default OFF のまま保持)
Update(2025-12-15)
v1 の統合点(core/front/tiny_unified_cache.h)だけだと、現行の main alloc hot path(tiny_hot_alloc_fast())が tcache を消費しないため、
HAKMEM_TINY_TCACHE=1 で “sink” になりやすい。
次は hot path(core/box/tiny_front_hot_box.h)へ pop/push を接続し、通電した状態で再 A/B を取る(Phase 14 v2):
docs/analysis/PHASE14_POINTER_CHASE_REDUCTION_2_NEXT_INSTRUCTIONS.md