Phase v4-mid-0: Small-object v4 型・IF 足場(箱化モジュール化)

- SmallHeapCtx/SmallPageMeta/SmallClassHeap typedef alias 追加
- SmallSegment struct (base/num_pages/owner_tid/magic) を smallsegment_v4_box.h に定義
- SmallColdIface_v4 direct function prototypes (refill/retire/remote_push/drain)
- smallobject_hotbox_v4.c の internal/public API 分離(small_segment_v4_internal)
- direct function stubs 実装(SmallColdIfaceV4 delegate 形式)
- ENV OFF デフォルト(ENABLED=0/CLASSES=0)で既存挙動 100% 不変
- ビルド成功・sanity 確認(mixed/C6-heavy、segv/assert なし)
- CURRENT_TASK.md に Phase v4-mid-0 記録

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Moe Charm (CI)
2025-12-10 23:23:07 +09:00
parent 2a13478dc7
commit 52c65da783
6 changed files with 214 additions and 17 deletions

View File

@ -39,3 +39,105 @@
- まず C7 ULTRA で固めた設計Segment + Page + TLS freelist + mask freeを「small-object 全体の共通パターン」として整理し、
- その上で 16〜2KiB 帯を SmallHeapCtx v4 に寄せるヘッダレス化・lookup 削減を C7 と mid で統合)、
という順番で進める。
---
## Phase v4-mid-design: mid/small-object 帯をどう乗せるか
### 方針サマリ
- 目標: 16〜2KiB 帯の small-object/mid を **SmallObjectHotBox_v4** に集約し、Mixed 16〜1024B を mimalloc の 5 割50〜60M ops/sに近づける。
- Hot/Cold/Policy の分離は C7 ULTRA と同様に維持する:
- Hot: per-thread `SmallHeapCtx`SmallClassHeap + SmallPageMetaで alloc/free を完結。
- Cold: `SmallColdIface_v4` から SmallSegmentBox_v4 / SuperslabBox / RemoteBox に橋渡し。
- Policy/Learning: `SmallPolicySnapshot` を上位箱が更新し、Hot は route_kind や block_size を読むだけ。
- C7 ULTRA は「C7 専用 TLS/Segment lane」として維持し、mid/small-object 帯は SmallHeapCtx v4 に寄せる形で共存させる。
### HotBox_v4SmallHeapCtxのイメージ
```c
typedef struct SmallPageMeta {
void* free_list; // block → next pointer
uint16_t used; // 現在使用中
uint16_t capacity; // スロット数
uint8_t class_idx; // サイズクラス (small-object 帯)
uint8_t flags; // HOT/PARTIAL/FULL/REMOTE_PENDING など
uint16_t page_idx; // セグメント内 index
void* segment; // SmallSegment* back pointer
} SmallPageMeta;
typedef struct SmallClassHeap {
SmallPageMeta* current;
SmallPageMeta* partial_head;
SmallPageMeta* full_head;
} SmallClassHeap;
typedef struct SmallHeapCtx {
SmallClassHeap cls[NUM_SMALL_CLASSES]; // 16〜2KiB を covering
} SmallHeapCtx;
```
- HotPath:
- alloc: `size→class_idx`LUT`route_kind==SMALL_V4` なら `SmallHeapCtx` 経由で `current→partial→cold_refill` の順に見る。
- free: `small_page_meta_of(ptr)`SegmentBox v4 が提供)→ owner/self 判定 → local free or remote_push。
- C7 ULTRA:
- ptr が ULTRA segment 上にある場合のみ ULTRA lane を通り、それ以外は SmallHeap v4 / 既存 v3 にフォールバックするオーバーレイ構造を維持。
### SmallSegmentBox_v4 と ptr→page→class の O(1) 解決
- C7 ULTRA で使っている 2MiB Segment + 64KiB Page を multi-class small-object 用に拡張:
```c
#define SMALL_SEGMENT_SIZE (2 * 1024 * 1024)
#define SMALL_PAGE_SIZE (64 * 1024)
typedef struct SmallSegment {
uintptr_t base;
uint32_t num_pages;
uint32_t owner_tid;
uint32_t magic;
SmallPageMeta page_meta[SMALL_SEGMENT_SIZE / SMALL_PAGE_SIZE];
} SmallSegment;
```
- ptr→page_meta の計算:
```c
static inline SmallPageMeta* small_page_meta_of(void* p) {
uintptr_t addr = (uintptr_t)p;
uintptr_t seg_base = addr & ~(SMALL_SEGMENT_SIZE - 1);
SmallSegment* seg = (SmallSegment*)seg_base;
// magic で small segment か確認Fail-Fast
size_t page_idx = (addr - seg_base) >> SMALL_PAGE_SHIFT; // 64KiB page
if (page_idx >= seg->num_pages) return NULL;
return &seg->page_meta[page_idx];
}
```
- これにより mid/small-object 帯でも `hak_super_lookup` / `mid_desc_lookup` / `classify_ptr` / `ss_map_lookup` を HotPath から排除し、ptr→page→class を O(1) にできる。
### ULTRA をどこまで広げるか
- ULTRA パターン(専用 Segment + TLS freelist + mask freeは C7 では成功済み。
- mid/smallmid では:
- C7class7: 現状通り C7 ULTRA lane を利用。
- 非常にホットな mid クラス(例: C6/C5が現れた場合のみ、ULTRA lane を追加する候補。
- それ以外の small-object 帯は SmallHeapCtx v4multi-class heapに載せ、ULTRA は「1〜2 クラス専用 lane」として限定的に使う。
- これにより:
- RSS/fragmentation の増加を抑えつつ、
- 「C7 ULTRA の勝ちパターン」を mid にも段階的に持ち込む余地を残せる。
### フェーズ案mid/small-object v4 導入)
1. Phase v4-mid-0:
- `SmallHeapCtx` / `SmallClassHeap` / `SmallPageMeta` / `SmallSegment` の struct と `SmallColdIface_v4` の関数シグネチャだけを追加(挙動は stub
- `HAKMEM_SMALL_HEAP_V4_ENABLED=0` 時は一切 v4 コードを通らない。
2. Phase v4-mid-1:
- C6-only で `route_kind=SMALL_V4_STUB` にして、`small_alloc_fast` / `small_free_fast` は即 v1/pool にフォールバックしつつ、`small_page_meta_of()` の O(1) 判定だけ実装。
- ptr→segment→page_meta の Fail-Fast を安定させる。
3. Phase v4-mid-2:
- C6-only で SmallHeap v4 を本実装page freelist / current/partial / refill/retireし、C6-heavy ベンチで v1/pool と A/B。
4. Phase v4-mid-3:
- Mixed 16〜1024B のうち一部クラス(例: C6, 次に C5を SMALL_V4 route に昇格。
- Stats/Learning で hot クラスを観察しつつ、徐々に small-object 帯を v4 に寄せていく。
### Learning/Stats 境界の注意
- Stats は page/segment 単位で集計し、HotPath では `page->used++/--` 以外を触らないretire/refill 時に Cold 側で aggregate
- Learning は StatsBox から `SmallPolicySnapshot` を生成し:
- route_kind[class]
- block_size[class]
- max_partial_pages[class]
を更新するだけ。HotBox_v4 側は snapshot を読むだけに留める。