Files
hakmem/docs/analysis/ALLOC_GATE_ANALYSIS.md
Moe Charm (CI) 0f15adae4e Phase ALLOC-GATE-OPT-1: tiny_alloc_gate_fast 統計計測
- AllocGateStats 構造体追加(size2class/route/env/class分布)
- malloc_tiny_fast にカウンタ埋め込み
- ENV: HAKMEM_ALLOC_GATE_STATS (default 0)
- 挙動変更なし(計測のみ)

計測結果:
- Mixed: total=542k, size2class=0, route_calls=0, env_checks=275k, C4-C7=95.2%
  - size_to_class/route_for_class は完全削減済み(LUT 効果)
  - C4-C7 が 95% → ULTRA fast path が有効
  - env_checks ≈ c7_calls → C7 ULTRA の ENV gate が毎回呼ばれる
- C6-heavy: total=11 → malloc_tiny_fast はほぼ通らない(mid/pool 主体)

結論:
- alloc gate は既に十分最適化済み(LUT + ULTRA で削減済み)
- さらなる最適化余地は小さい(env_checks は軽量化済み、数%以下の効果)
- 次フェーズでは free dispatcher (29%) や C7 ULTRA refill (7%) など、他のボトルネックを狙う

詳細: docs/analysis/ALLOC_GATE_ANALYSIS.md

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-11 21:32:40 +09:00

119 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ALLOC_GATE_ANALYSIS
## Phase ALLOC-GATE-OPT-1 計測結果
### Mixed 16-1024B (1M iter, ws=400)
```
[ALLOC_GATE_STATS] total=542033 size2class=0 route_calls=0 env_checks=275089 c0=0 c1=0 c2=8746 c3=17279 c4=34727 c5=68871 c6=137321 c7=275089
```
**Throughput**: 42.5M ops/s
**分析**:
- total_calls: 542,033 malloc_tiny_fast 呼び出し数)
- size_to_class: **0 calls** (毎回は呼ばれていない!)
- route_for_class: **0 calls** (毎回は呼ばれていない!)
- avg per alloc: 0 calls/alloc LUT により完全に削減済み)
- env_checks: 275,089 C7 ULTRA の ENV gate が主体)
- env_checks ≈ c7 calls → C7 ULTRA 毎回 ENV check あり
- class 分布:
- C7: 50.7% (275,089 / 542,033)
- C6: 25.3% (137,321 / 542,033)
- C5: 12.7% (68,871 / 542,033)
- C4: 6.4% (34,727 / 542,033)
- C3: 3.2% (17,279 / 542,033)
- C2: 1.6% (8,746 / 542,033)
- C1/C0: 0.0%
- **C4〜C7: 95.2%** hot classes が支配的)
**コメント**:
- **size_to_class と route_for_class が完全に削減済み** → LUT (tiny_front_v3) が効いている
- **env_checks が C7 alloc で毎回発生** → tiny_c7_ultra_enabled_env() が毎回呼ばれている
- C4/C5/C6 ULTRA の ENV check は早期リターンLUT で class 判定済み)のため計測されず
- **C4〜C7 が 95%** → class-specific fast path の検討価値あり(ただし既に ULTRA で対応済み)
### C6-heavy (257-768B, 1M iter, ws=400)
```
[ALLOC_GATE_STATS] total=11 size2class=0 route_calls=0 env_checks=0 c0=0 c1=1 c2=1 c3=0 c4=0 c5=0 c6=9 c7=0
```
**Throughput**: 27.4M ops/s
**分析**:
- total_calls: **11** (ほぼ全て mid route に落ちている)
- size_to_class: 0 calls
- route_for_class: 0 calls
- env_checks: 0 C6 ULTRA は OFF のため)
- class 分布:
- C6: 81.8% (9 / 11)
- C1/C2: 各 1 回(初期化時のノイズ)
**コメント**:
- **C6-heavy では malloc_tiny_fast がほぼ呼ばれていない** → mid/pool 経路が主体
- total_calls=11 は初期化時の SuperSlab 確保等のノイズ
- C6-heavy の alloc gate 最適化は効果なし(そもそも通らない)
---
## Phase ALLOC-GATE-OPT-1B 候補施策
### 候補 A: C7 ULTRA ENV gate の snapshot 化
**条件**: env_checks ≈ c7_calls (毎回呼ばれている)
**施策**: tiny_c7_ultra_enabled_env() を初期化時に1回だけ評価し、結果を TLS snapshot に保持
**期待**: ENV check overhead 削減(ただし既に tiny_c7_ultra_enabled_env() 自体が static cached
**評価**: 効果は限定的ENV gate は既に sentinel パターンで最適化済み)
### 候補 B: size_to_class / route_for_class の snapshot 化
**条件**: size_to_class=0, route_calls=0 (既に削減済み)
**施策**: 不要LUT により完全に削減済み)
**評価**: **既に最適化済みで追加改善なし**
### 候補 C: class-specific fast path (C4-C7)
**条件**: C4〜C7 が 95% 以上
**施策**: C4〜C7 用の直線パスと、その他サイズ用の旧ルートを分岐
**期待**: hot classes を完全に直線化
**評価**: **既に C4-C7 ULTRA で実装済み**(寄生型 TLS キャッシュで fast path 確立)
---
## 判断基準
### ✅ 良い発見
- **size_to_class / route_for_class は既に完全削減済み**LUT 効果)
- **C4-C7 ULTRA で hot classes の fast path は確立済み**95% カバー)
### ❌ さらなる最適化の余地は小さい
- env_checks は C7 ULTRA の構造的コスト(毎回 ENV check する設計)
- tiny_c7_ultra_enabled_env() 自体は既に sentinel cached で軽量
- snapshot 化しても効果は誤差範囲(数%以下)
- alloc gate 内部は既に十分薄いLUT + ULTRA で最適化済み)
### 次フェーズへの示唆
- **alloc gate よりも別の箇所を狙うべき**
- PERF-ULTRA-REBASE-3 では tiny_alloc_gate_fast = 18% だが、内訳は「LUT overhead」「ULTRA ENV check」「class dispatch」等に分散
- 18% を削るよりも、他のボトルネックfree dispatcher 29%、C7 ULTRA refill 7% 等)を狙う方が効果的
- **alloc gate 自体は Phase FREE-DISPATCHER-OPT-1 と同様に「既に最適化済み」** と判断
---
## 結論
**Phase ALLOC-GATE-OPT-1 の成果**:
- ✅ alloc gate の内訳を可視化
- ✅ size_to_class / route_for_class が完全削減済みLUT 効果)を確認
- ✅ C4-C7 が 95% で、ULTRA fast path が有効なことを確認
- ✅ env_checks は C7 ULTRA の構造的コスト(軽量化済み)
**Phase ALLOC-GATE-OPT-1B の方針**:
- **追加最適化は見送り**
- alloc gate は既に十分薄く、さらなる改善余地は小さい(数%以下)
- 次フェーズでは **free dispatcher (29%)****C7 ULTRA refill (7%)** など、他のボトルネックを狙う