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:
@ -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 テストを実施し、効果を検証
|
||||
|
||||
Reference in New Issue
Block a user