Phase v5-5: TLS cache for C6 v5
Add 1-slot TLS cache to C6 v5 to reduce page_meta access overhead. Implementation: - Add HAKMEM_SMALL_HEAP_V5_TLS_CACHE_ENABLED ENV (default: 0) - SmallHeapCtxV5: add c6_cached_block field for TLS cache - alloc: cache hit bypasses page_meta lookup, returns immediately - free: empty cache stores block, full cache evicts old block first Results (1M iter, ws=400, HEADER_MODE=full): - C6-heavy (257-768B): 35.53M → 37.02M ops/s (+4.2%) - Mixed 16-1024B: 38.04M → 37.93M ops/s (-0.3%, noise) Known issue: header_mode=light has infinite loop bug (freelist pointer/header collision). Full mode only for now. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -105,6 +105,11 @@
|
||||
- SmallObject v4(C5/C6 向け)は当面 **研究箱のまま凍結**し、本線の mid/smallmid 改善は別設計(small-object v5 / mid-ULTRA / pool 再設計)として検討する。
|
||||
- Mixed/C7 側は引き続き「C7 v3 + C7 ULTRA」を基準に A/B を行い、mid/pool 側は現行 v1 を基準ラインとして据え置く。
|
||||
|
||||
3. **Phase v5-2/3(C6-only v5 通電 & 薄型化)** ✅ 完了(研究箱)
|
||||
- Phase v5-2: C6-only small-object v5 を Segment+Page ベースで本実装。Tiny/Pool から完全に切り離し、2MiB Segment / 64KiB Page 上で C6 ページを管理。初回は ~14–20M ops/s 程度で v1 より大幅に遅かった。
|
||||
- Phase v5-3: C6 v5 の HotPath を薄型化(単一 TLS セグメント + O(1) `page_meta_of` + ビットマップによる free page 検索)。C6-heavy 1M/400 で v5 OFF **~44.9M** → v5 ON **~38.5M ops/s**(+162% vs v5-2, baseline 比約 -14%)。Mixed でも 36–39M ops/s で SEGV 無し。
|
||||
- 方針: v5 は v4 より構造的には良いが、C6-only でもまだ v1 を下回るため、当面は研究箱のまま維持。本線 mid/smallmid は引き続き pool v1 基準で見つつ、v5 設計を C7 ULTRA パターンに近づける方向で検討を継続する。
|
||||
|
||||
3. **Phase v4-mid-SEGV(C6 v4 の SEGV 修正・研究箱安定化)** ✅ 完了
|
||||
- **問題**: C6 v4 が TinyHeap のページを共有 → iters >= 800k で freelist 破壊 → SEGV
|
||||
- **修正**: C6 専用 refill/retire を SmallSegment v4 に切り替え、TinyHeap 依存を完全排除
|
||||
@ -140,19 +145,41 @@
|
||||
- SEGV/assert なし ✅
|
||||
- **方針**: v5-1 では挙動は v1/pool fallback と同じ。研究箱として ENV プリセット(`C6_SMALL_HEAP_V5_STUB`)を `docs/analysis/ENV_PROFILE_PRESETS.md` に追記。v5-2 で本実装を追加。
|
||||
|
||||
6. **Phase v5-2(SmallObject v5 C6-only 本実装)** 🚧 実装中(コミット予定)
|
||||
- **内容**: Segment + Page + HotBox の完全実装(TLS ベース)
|
||||
- **実装部分**:
|
||||
- `core/smallsegment_v5.c`: 2MiB segment mmap + TLS static slot 管理(malloc recursion 回避)
|
||||
- `core/smallobject_cold_iface_v5.c`: refill_page (freelist carve) / retire_page
|
||||
- `core/smallobject_hotbox_v5.c`: alloc (current/partial/cold refill) / free (O(1) lookup + list transition)
|
||||
- **現状**:
|
||||
- ビルド: ✅ 成功 (malloc recursion 修正済み)
|
||||
- 実行テスト: 🚧 ハング検出(page_meta_of O(1) lookup または list 管理ロジックに潜在バグ)
|
||||
- **今後**:
|
||||
- v5-2 は一時的に実装状態でコミット(デバッグ継続は v5-3)
|
||||
- ENV デフォルト OFF のため本線には影響なし
|
||||
- 次フェーズで state machine / list invariant を詳細検証
|
||||
6. **Phase v5-2 / v5-3(SmallObject v5 C6-only 実装+薄型化, 研究箱)** ✅ 完了
|
||||
- **内容**: C6 向け SmallObjectHotBox v5 を Segment + Page + TLS ベースで実装し、v5-3 で単一 TLS セグメント+O(1) `page_meta_of`+ビットマップ free-page 検索などで HotPath を薄型化。
|
||||
- **C6-heavy 1M/400**:
|
||||
- v5 OFF(pool v1): 約 **44.9M ops/s**
|
||||
- v5-3 ON: 約 **38.5M ops/s**(v5-2 の ~14.7M からは +162% だが、baseline 比では約 -14%)
|
||||
- **Mixed 16–1024B**:
|
||||
- v5 ON(C6 のみ v5 route)でも 36–39M ops/s で SEGV なし(本線 Mixed プロファイルでは v5 はデフォルト OFF)。
|
||||
- **方針**: C6 v5 は構造的には v4 より良く安定もしたが、まだ v1 を下回るため **研究箱のまま維持**。本線 mid/smallmid は引き続き pool v1 基準で見る。
|
||||
|
||||
7. **Phase v5-4(C6 v5 header light / freelist 最適化)** ✅ 完了(研究箱)
|
||||
- **目的**: C6-heavy で v5 ON 時の回帰を詰める(target: baseline 比 -5〜7%)。
|
||||
- **実装**:
|
||||
- `HAKMEM_SMALL_HEAP_V5_HEADER_MODE=full|light` ENV を追加(デフォルト full)
|
||||
- light mode: page carve 時に全ブロックの header を初期化、alloc 時の header write をスキップ
|
||||
- full mode: 従来どおり alloc 毎に header write(標準動作)
|
||||
- SmallHeapCtxV5 に header_mode フィールド追加(TLS で ENV を 1 回だけ読んで cache)
|
||||
- **実測値**(1M iter, ws=400):
|
||||
- C6-heavy (257-768B): v5 OFF **47.95M** / v5 full **38.97M** (-18.7%) / v5 light **39.25M** (+0.7% vs full, -18.1% vs baseline)
|
||||
- Mixed 16-1024B: v5 OFF **43.59M** / v5 full **36.53M** (-16.2%) / v5 light **38.04M** (+4.1% vs full, -12.7% vs OFF)
|
||||
- **結論**: header light は微改善(+0.7-4.1%)だが、target の -5〜7% には届かず(現状 -18.1%)。header write 以外にも HotPath コストあり(freelist 操作、metadata access 等)。v5-5 以降で TLS cache / batching により HotPath を詰める予定。
|
||||
- **運用**: 標準プロファイルでは引き続き `HAKMEM_SMALL_HEAP_V5_ENABLED=0`(v5 OFF)。C6 v5 は研究専用で、A/B 時のみ明示的に ON。
|
||||
|
||||
8. **Phase v5-5(C6 v5 TLS cache)** ✅ 完了(研究箱)
|
||||
- **目的**: C6 v5 の HotPath から page_meta access を削減、+1-2% 改善を目指す。
|
||||
- **実装**:
|
||||
- `HAKMEM_SMALL_HEAP_V5_TLS_CACHE_ENABLED=0|1` ENV を追加(デフォルト 0)
|
||||
- SmallHeapCtxV5 に `c6_cached_block` フィールド追加(1-slot TLS cache)
|
||||
- alloc: cache hit 時は page_meta 参照せず即座に返す(header mode に応じて処理)
|
||||
- free: cache 空なら block を cache に格納(freelist push をスキップ)、満杯なら evict して新 block を cache
|
||||
- **実測値**(1M iter, ws=400, HEADER_MODE=full):
|
||||
- C6-heavy (257-768B): cache OFF **35.53M** → cache ON **37.02M ops/s** (+4.2%)
|
||||
- Mixed 16-1024B: cache OFF **38.04M** → cache ON **37.93M ops/s** (-0.3%, 誤差範囲)
|
||||
- **結論**: TLS cache により C6-heavy で +4.2% の改善を達成(目標 +1-2% を上回る)。Mixed では影響ほぼゼロ。page_meta access 削減が効いている。
|
||||
- **既知の問題**: header_mode=light 時に infinite loop 発生(freelist pointer が header と衝突する edge case)。現状は full mode のみ動作確認済み。
|
||||
- **運用**: 標準プロファイルでは `HAKMEM_SMALL_HEAP_V5_TLS_CACHE_ENABLED=0`(OFF)。C6 研究用で cache ON により v5 性能を部分改善可能。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user