Docs: Phase FREE-LEGACY-OPT-4-4 completion summary + design notes

Phase 4-4 で C6 ULTRA free+alloc 統合(寄生型 TLS キャッシュ)が完了。
- Mixed 16-1024B: 40.2M → 42.3M ops/s (+5.2%)
- C6 legacy 完全排除: 137,319 → 0 (-100%)
- Legacy 半減: 266,942 → 129,623 (-51.4%)
- 次ターゲット: C5 (残存 Legacy の 53.1%)

設計メモを FREE_LEGACY_PATH_ANALYSIS.md に追記:
- Free-only TLS が失敗する理由
- Free+alloc 統合で成功する理由
- 寄生型 TLS キャッシュの設計原理
- C5/C4 への一般化可能性

次フェーズ候補を CURRENT_TASK.md に追記:
- 選択肢 1: C5 ULTRA への展開
- 選択肢 2: Tiny Alloc Hotpath 最適化
- 判断ポイント: stats 確認後に決定

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Moe Charm (CI)
2025-12-11 19:11:44 +09:00
parent c848a60696
commit 224cc8d1ca
2 changed files with 477 additions and 10 deletions

View File

@ -622,3 +622,184 @@ Throughput = 42.2M ops/s
- C6 ULTRA free+alloc は **本命候補に昇格**(ただし ENV デフォルト OFF は維持)
- 他クラス (C5, C4) への展開を検討per-class TLS freelist
- Core v6 との比較v6 は -12% だったが、alloc 連携で改善の可能性)
---
## 設計メモFree-only vs Free+Alloc 統合
### Free-only TLS キャッシュが失敗する理由
Phase 4-3 実績:
- Fast path ヒット: 128 / 137,319 (0.09%)
- Throughput: baseline 比 0% improvement
**根本原因**:
1. キャッシュが満杯 (128 blocks) になる
2. 以降の free はすべて legacy へ overflow
3. Alloc が TLS を消費しないため、キャッシュは積もる一方
### Free+Alloc 統合で成功する理由
Phase 4-4 実績:
- Fast path ヒット (free): 137,319
- Fast path ヒット (alloc): 137,241
- Legacy by class[6]: 137,319 → **0**
- Throughput: **+4.9%**
**メカニズム**:
```
Iteration N:
free() → TLS push (+1 count)
Iteration N+1:
alloc() → TLS pop (-1 count) ← キャッシュ drain!
Result:
- count は常に [0, CAP) 範囲を保つ
- overflow 発生しない
- Legacy fallback 発生しない
```
### 設計原理
**寄生型 TLS キャッシュParasitic TLS Cache**:
```
Core v6 (独立型):
├─ 専用 segment 管理
├─ Page 管理
└─ Cold refill/retire
→ オーバーヘッド大(-12% の原因)
C6 ULTRA (寄生型):
├─ 既存 allocator に TLS cache を「寄生」させる
├─ Segment check: free 側のみss_fast_lookup で初回学習)
└─ Alloc 側: TLS pop のみ15行
→ Overhead minimal+4.9% gain
```
### 一般化可能性
この「寄生型」パターンは C5, C4 にも拡張可能:
```c
// C5 ULTRA TLS proposed
typedef struct {
void* freelist[64]; // C5 ブロック用(小ぶり)
uint8_t count;
uintptr_t seg_base/end;
} TinyC5UltraFreeTLS;
// Alloc pop ロジックC6 と同じ)
if (tiny_class_is_c5(class_idx) && tiny_c5_ultra_free_enabled()) {
TinyC5UltraFreeTLS* ctx = tiny_c5_ultra_free_tls();
if (ctx->count > 0) {
void* base = ctx->freelist[--ctx->count];
return tiny_base_to_user_inline(base);
}
}
```
**注意**: L1 cache 圧迫を避けるため、TLS capacity を class size に応じて調整C6: 128, C5: 64 など)。
---
## Phase 4-4 後の Free Path Distribution
### C6 ULTRA ON 後の新しい Legacy 分布
**測定条件**: Mixed 16-1024B, 1M iterations, ws=400, HAKMEM_TINY_C6_ULTRA_FREE_ENABLED=1
**実行結果**:
```
[FREE_PATH_STATS] total=542031 c7_ultra=275089 c6_ultra_free=137319 c6_ultra_alloc=137241 small_v3=0 v6=0 tiny_v1=0 pool_v1=8081 remote=0 super_lookup=0 legacy_fb=129623
[FREE_PATH_STATS_LEGACY_BY_CLASS] c0=0 c1=0 c2=8746 c3=17279 c4=34727 c5=68871 c6=0 c7=0
Throughput = 42266311 ops/s (42.3M ops/s)
```
### 分析結果
**劇的な改善**:
| 項目 | Phase 4-3 (OFF) | Phase 4-4 (ON) | 変化 |
|------|----------------|---------------|------|
| C7 ULTRA fast | 275,089 (50.7%) | 275,089 (50.7%) | 変化なし |
| C6 ULTRA free | 0 (0%) | **137,319 (25.3%)** | **新規追加** |
| C6 ULTRA alloc | 0 (0%) | **137,241 (25.3%)** | **新規追加** |
| Legacy fallback | 266,942 (49.2%) | **129,623 (23.9%)** | **-51.4%** |
| Pool v1 fast | 8,081 (1.5%) | 8,081 (1.5%) | 変化なし |
| Throughput | 40.2M ops/s | **42.3M ops/s** | **+5.2%** |
**Legacy by class の変化**:
| Class | サイズ範囲 | Phase 4-3 (OFF) | Phase 4-4 (ON) | 削減率 |
|-------|-----------|----------------|---------------|--------|
| C0 | 1-16B | 0 | 0 | - |
| C1 | 17-32B | 0 | 0 | - |
| C2 | 33-64B | 8,746 | 8,746 | 0% |
| C3 | 65-128B | 17,279 | 17,279 | 0% |
| C4 | 129-256B | 34,727 | 34,727 | 0% |
| C5 | 257-512B | 68,871 | 68,871 | 0% |
| **C6** | **513-1024B** | **137,319** | **0** | **-100%** |
| C7 | 1025+B | 0 | 0 | - |
| **合計** | - | **266,942** | **129,623** | **-51.4%** |
**キーポイント**:
1. **C6 legacy の完全排除**: 137,319 0 (**-100%**)
- すべての C6 free C6 ULTRA fast path に吸収された
- C6 alloc も同数 (137,241) TLS pop で直接サーブ
- TLS キャッシュが過充填せず完璧な alloc/free サイクルを実現
2. **Legacy の半減**: 266,942 129,623 (**-51.4%**)
- Legacy 13.7 万回削減された
- 残存 Legacy C2-C5 のみC0/C1/C6/C7 0
3. **新しい最大ターゲット**: **C5 (68,871)**
- 残存 Legacy 53.1% を占める
- 次の最適化ターゲットの最有力候補
4. **Throughput 改善**: 40.2M 42.3M ops/s (**+5.2%**)
- Phase 4-4 の期待値 (+4.9%) を上回る
- C6 処理の完全な高速化が達成された
### 残存 Legacy の内訳Phase 4-4 後)
| Class | 呼び出し回数 | Legacy 内比率 | 全体比率 | 視覚化 |
|-------|------------|-------------|---------|--------|
| C2 | 8,746 | 6.7% | 1.6% | ███ |
| C3 | 17,279 | 13.3% | 3.2% | ███████ |
| C4 | 34,727 | 26.8% | 6.4% | ██████████████ |
| **C5** | **68,871** | **53.1%** | **12.7%** | ██████████████████████████ |
| **合計** | **129,623** | **100.0%** | **23.9%** | |
### 次フェーズの方針
**優先度 1: C5 ULTRA への展開**
- 残存 Legacy 53.1% (68,871) を占める
- C6 と同じ寄生型 TLS キャッシュパターンを適用
- TLS capacity 64 blocks に設定C6 128 より小さく
- 期待値: Legacy を追加で 50% 削減 (129K 60-65K)、+2-3% 改善
**優先度 2: C4 ULTRA への展開**
- 残存 Legacy 26.8% (34,727) を占める
- C5 後の次のターゲット
- 期待値: +1-2% 改善
**優先度 3: Tiny Alloc Hotpath 最適化**
- 残存 Legacy (C2-C5) の間接パス最適化
- branch 削減ENV overhead 削減
- 期待値: +1-2% 改善
### 技術的結論
**寄生型 TLS キャッシュの成功**:
1. Free-only は失敗 (0.09% ヒット率)
2. Free+alloc 統合で成功 (100% ヒット率)
3. Overhead minimal (+5.2% gain)
4. C6 legacy を完全排除
**次の展開**:
- C5 C4 C3/C2 の順で段階的に展開
- L1 cache 圧迫に注意TLS capacity 調整
- 各クラスで A/B テストを実施し効果を検証