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>
This commit is contained in:
118
docs/analysis/ALLOC_GATE_ANALYSIS.md
Normal file
118
docs/analysis/ALLOC_GATE_ANALYSIS.md
Normal file
@ -0,0 +1,118 @@
|
||||
# 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%)** など、他のボトルネックを狙う
|
||||
@ -309,3 +309,25 @@ Throughput: **12.39M ops/s**(DEBUG/-O0 相当)
|
||||
- **pthread_once が8.21%**: 初期化同期のオーバーヘッドが目立つ(ワークロードが軽い証拠)
|
||||
|
||||
**所感**: C6-heavy でも pool v1 が主要経路として機能しているが、ULTRA の効果測定には不十分なサンプル数
|
||||
|
||||
---
|
||||
|
||||
## Phase ALLOC-GATE-OPT-1 計測前の前提 (2025-12-11)
|
||||
|
||||
**最新 perf(REBASE-3) より**:
|
||||
- tiny_alloc_gate_fast: self% ≈ 18%
|
||||
- tiny_route_for_class_calls: 267,967 calls (alloc 側が主体)
|
||||
- FREE_DISPATCHER では ENV/route が既に snapshot で削減済み
|
||||
|
||||
→ alloc 側が未最適化の可能性が高い
|
||||
|
||||
**計測目的**:
|
||||
- size→class 変換の回数(毎回か?)
|
||||
- route_for_class 呼び出し回数(毎回か?初期化時のみか?)
|
||||
- alloc-side ENV check 回数(C4-C7 ULTRA の ENV gate 等)
|
||||
- クラス別分布(C0〜C7 のどれが主体か)
|
||||
|
||||
**期待される発見**:
|
||||
- route_for_class が alloc 毎に呼ばれているなら → snapshot 化で削減可能
|
||||
- size_to_class が重いなら → インライン化・LUT 化
|
||||
- C4〜C7 が 80% 以上なら → class-specific fast path 検討
|
||||
|
||||
Reference in New Issue
Block a user