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:
@ -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_v4(SmallHeapCtx)のイメージ
|
||||
```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 では:
|
||||
- C7(class7): 現状通り C7 ULTRA lane を利用。
|
||||
- 非常にホットな mid クラス(例: C6/C5)が現れた場合のみ、ULTRA lane を追加する候補。
|
||||
- それ以外の small-object 帯は SmallHeapCtx v4(multi-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 を読むだけに留める。
|
||||
|
||||
Reference in New Issue
Block a user