Files
hakmem/docs/analysis/PHASE14_POINTER_CHASE_REDUCTION_1_NEXT_INSTRUCTIONS.md
Moe Charm (CI) f8fb05bc13 Phase 14 v1: Pointer-Chase Reduction (tcache) NEUTRAL (+0.20%)
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>
2025-12-15 01:28:50 +09:00

3.3 KiB
Raw Blame History

Phase 14: Pointer-Chase Reduction v1 — 次の指示書Tiny tcache intrusive LIFO

0. Status

  • Phase 13 v1 / E5-2 で header write tax は NEUTRAL → 次の仮説へ
  • 次の芯: thread cache / pointer chasesystem malloc の tcache と構造差が濃厚)

設計: docs/analysis/PHASE14_POINTER_CHASE_REDUCTION_1_DESIGN.md


1. 目的GO 条件)

Mixed 10-runclean 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.h
  • core/box/tiny_tcache_env_box.c

ENV:

  • HAKMEM_TINY_TCACHE=0/1default: 0
  • HAKMEM_TINY_TCACHE_CAP=64default: 64

API:

  • tiny_tcache_enabled()
  • tiny_tcache_cap()
  • tiny_tcache_env_refresh_from_env()

要件:

  • hot path に getenv() を置かないcached read のみ)

Patch 2: L1 tcache Boxintrusive 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) -> bool
  • tiny_tcache_try_pop(class_idx) -> void*BASE or NULL

Patch 3: 統合点は unified_cache の内部call site を増やさない)

修正:

  • core/front/tiny_unified_cache.hunified_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 のとき:

  1. preset へ追加(まずは MIXED_TINYV3_C7_SAFE のみ)
  2. CURRENT_TASK.md に A/B を記録
  3. rollback 手順:
    • export HAKMEM_TINY_TCACHE=0

NO-GO/NEUTRAL のとき:

  • research box freezedefault OFF のまま保持)

Update2025-12-15

v1 の統合点(core/front/tiny_unified_cache.h)だけだと、現行の main alloc hot pathtiny_hot_alloc_fast())が tcache を消費しないため、 HAKMEM_TINY_TCACHE=1 で “sink” になりやすい。

次は hot pathcore/box/tiny_front_hot_box.h)へ pop/push を接続し、通電した状態で再 A/B を取るPhase 14 v2:

  • docs/analysis/PHASE14_POINTER_CHASE_REDUCTION_2_NEXT_INSTRUCTIONS.md