Files
hakmem/CURRENT_TASK.md
Moe Charm (CI) 79674c9390 Phase v10: Remove legacy v3/v4/v5 implementations
Removal strategy: Deprecate routes by disabling ENV-based routing
- v3/v4/v5 enum types kept for binary compatibility
- small_heap_v3/v4/v5_enabled() always return 0
- small_heap_v3/v4/v5_class_enabled() always return 0
- Any v3/v4/v5 ENVs are silently ignored, routes to LEGACY

Changes:
- core/box/smallobject_hotbox_v3_env_box.h: stub functions
- core/box/smallobject_hotbox_v4_env_box.h: stub functions
- core/box/smallobject_v5_env_box.h: stub functions
- core/front/malloc_tiny_fast.h: remove alloc/free cases (20+ lines)

Benefits:
- Cleaner routing logic (v6/v7 only for SmallObject)
- 20+ lines deleted from hot path validation
- No behavioral change (routes were rarely used)

Performance: No regression expected (v3/v4/v5 already disabled by default)

Next: Set Learner v7 default ON, production testing

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 06:09:12 +09:00

94 KiB
Raw Blame History

HAKMEM 状況メモコンパクト版, 2025-12-11

このファむルは「いた䜕を基準に A/B するか」「どの箱が本線か」だけを短くたずめたものです。 過去フェヌズの詳现なログは CURRENT_TASK_ARCHIVE_20251210.md ず各 docs/analysis/* に残しおいたす。


いたの本筋タスクHAKMEM v3 / v7 向けメモ

  • HAKMEM v2 䞖代は「第1章の完成版」ULTRA + MID v3 + v6/v7 研究箱。ここから先は v2 をベヌスラむンにし぀぀、v3/v7 でさらに攻めるフェヌズ。
  • いた以降の「v3 / v7 本筋タスク」はこの 3 ぀だけ:
    1. SmallObjectHotBox_v7 を small/mid 向けコアずしお再蚭蚈する
      • 既存 C6-only v7 実装ず SMALLOBJECT_V7_DESIGN.md を読み返し、small〜mid 党䜓を 1 個の SmallHeapCtx_v7 で芋る蚭蚈を固めるULTRA は L0 のたた維持。
    2. PolicyBox v7 を党クラスに拡匵する
      • いたは C6 v7 甹 stub だけ Policy 経由。将来は C2〜C7 すべおを route_kind[class] で決めるようにし、tiny_route_env_box.h を段階的に瞮退させる。
    3. RegionId / Segment / PageStats の共通「物理局」を small/mid/pool に展開する方針を決める
      • v6/v7 で䜜った RegionIdBox/SmallSegment/PageStats のパタヌンを、mid/pool v3 にどう再利甚するかを蚭蚈ノヌトに萜ずす実装は別フェヌズ。
  • それ以倖の最適化ULTRA の埮調敎や MID v3 / v7 の枝刈りは「おたけタスク」ずしお扱い、䞊の 3 ぀が揃うたでは 第2䞖代v3 コアの本筋を動かし過ぎない。

Phase V7-5a: C6 v7 極限最適化Hot path stats 削陀, 2025-12-12

目的

  • C6-only SmallObjectHotBox_v7 の -4.3% overheadPhase v7-3 時点を、Hot path からの stats 曎新削陀だけで ±0% 付近たで戻す。

実斜内容

  • v7 C6 Hot path から per-page stats 曎新を削陀。
    • alloc_count++ / free_count++ / live_current++/-- を ColdIface 経路refill/retire 時に移動。
    • Hot path での stats は HAKMEM_V7_HOT_STATS=1 のずきだけ ENV ゲヌトで有効デフォルト OFF。
  • Header-at-carve-time 完党移行は芋送り。
    • freelist が block[0] を next pointer ずしお䜿っおおり、「carve 時だけ header write」は v7 珟行構造では安党にできないため、ヘッダは匕き続き alloc 時に 1 byte 曞く前提を維持。

結果C6-heavy ベンチ

Metric v7 OFF (MID v3) v7 ON (v7-5a)
Throughput (avg) 9.26M ops/s 9.27M ops/s
差分 baseline +0.15%
  • 目暙だった -4.3% → ±2% を満たし、C6-only v7 は MID v3 ずほが同等±0%たで改善。
  • v7 C6 コアは「性胜的に MID v3 ず匵り合える研究箱」ずしお、次フェヌズmulti-class 拡匵 / headerless 再怜蚎 / Learner 連携の土台になった。

Phase V7-5b: C5+C6 multi-class 拡匵2025-12-12

目的

  • C6-only v7 で確保した ±0% 近蟺の性胜を維持したたた、C5 を v7 small/mid コアに茉せお C5 垯の性胜を底䞊げする。

実斜内容

  • SmallSegment_v7 / ColdIface_v7 / HotBox_v7 を C5+C6 察応に拡匵。
    • SMALL_V7_CLASS_SUPPORTED() macro に C5 を远加。
    • small_v7_block_size() を C5/C6 の䞡クラスを扱う switch に拡匵。
    • HotBox 偎の alloc/free の class validation を C5+C6 䞡方に察応。
  • TLS 構造は C6 lane を維持し぀぀、C5 に぀いおは v7 small コアに乗せるが TLS bloat が発生しない圢に留めるfast path の C6 を守る。

結果C6-heavy / C5+C6 v7 プロファむル

Config Avg Throughput Delta
C6-only v7 7.64M ops/s baseline
C5+C6 v7 7.97M ops/s +4.3%

採甚基準:

  • C6 性胜維持: ✅C6-only v7 ず比べお劣化なし
  • C5 net positive: ✅+4.3%
  • TLS bloat: ✅ なしC6 lane のキャッシュヒット率に悪圱響なし

→ v7 small/mid コアは C5+C6 2 クラス察応でも砎綻せず、C5 垯で +数% の改善が確認できた。次は C4 を v7 に茉せるかどうかを慎重に評䟡するか、Learner 連携や Mixed 16–1024B での A/B に進むフェヌズ。


Phase V7-6 構想: Mixed A/B + Learner 連携蚭蚈

方針v7-5c より先にやるこず

  • C4 v7 拡匵は、v4/v5 䞖代で TLS bloat を経隓しおいるこずもあり、C5+C6 v7 の成果を Mixed でちゃんず枬っおから 刀断する。
  • そのために、次の 2 本を「v7-6 の本筋」ずしお進める
    1. Mixed 16–1024B で v7 OFFMID v3 + ULTRA vs v7 C5+C6 ON の A/B を取り、v7 の利益が本線 Mixed プロファむルでどのくらい出おいるか確認する。
    2. SmallPolicyV7 ず Stats/Learner のむンタフェヌスを蚭蚈し、「Stats → Learner → Policy.route_kind[] 曎新」のデヌタフロヌを doc に萜ずす。

具䜓タスク蚭蚈フェヌズ

  • Mixed A/B:
    • プロファむル: HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE をベヌスに、C5+C6 v7 ON/OFF の 2 パタヌンで 16–1024B ベンチを実行。
    • 蚘録: ops/s, free/alloc 経路内蚳ULTRA / v7 / MID v3 / LEGACY、C5/C6 の hit 率を docs/analysis 偎に远蚘。
  • Learner 連携蚭蚈:
    • SmallPolicyV7 に察する曎新 API䟋: small_policy_v7_update_from_learner(...)のシグネチャず責務を決める。
    • SmallPageStatsV7たたは既存 Stats Boxから Learner が読むべきフィヌルドず、どのタむミングで snapshot を差し替えるかL3 のみ、L1/L0 は snapshot を読むだけを SMALLOBJECT_V7_DESIGN.md に远蚘。

このフェヌズはコヌド倉曎よりも蚭蚈ず A/B の敎理がメむンで、C4 v7 拡匵や Intrusive LIFO ずいった倧きな構造倉曎は、その結果を芋おから刀断する。


Phase V7-6: Mixed A/B 結果ず C5 ルヌト方針2025-12-12

Mixed / C5+C6 専甚での A/B 結果

Workload C6-only v7 C5+C6 v7 掚奚蚭定
C5+C6 専甚 (257–768B) baseline +4.3% CLASSES=0x60
Mixed 16–1024B +0.5% -8.0% CLASSES=0x40
  • 専甚 C5+C6 ワヌクロヌド257–768B だけを回すベンチでは、C5+C6 v7 で +4.3% の改善が出る。
  • 䞀方、Mixed 16–1024B では C5 たで v7 に茉せるず党䜓で -8% の回垰になり、C6-only v7 の方が安党。

結論: C5 の route は workload-dependent

  • C5 は「C5-heavy」なら v7 の方が埗だが、「Mixed」では MID v3 + ULTRA の方がトヌタルで速い。
  • 固定の ENV だけで C5 の route を決めるのは持続可胜ではなく、Learner で動的に切り替えられるようにするのが蚭蚈的に玠盎。

Learner 連携の方向性v7-7 以降の皮

  • デヌタフロヌ:
    • SmallPageStatsV7ColdIface 圚庫
      → 集玄構造 SmallLearnerStatsV7per-class alloc/free/remote 等
      → PolicyLearnerC5 垯が heavy かどうかを刀定
      → SmallPolicyV7.route_kind[C5] を SMALL_ROUTE_V7 / SMALL_ROUTE_MID_V3 のどちらかに曎新。
  • 最小構成:
    • C5 だけを察象に、「C5 alloc 比率が䞀定閟倀䟋: 30%を超えたら C5→v7、そうでなければ MID v3」に切り替えるシンプルなルヌルから始める。
    • L3 で snapshot を差し替え、L1/L0 は snapshot を読むだけ、ずいう Box Theory を守る。

このフェヌズの結果、「C5 は固定ルヌトではなく、Learner で遞び分けるべきクラス」ずいう䜍眮づけがはっきりした。次の倧きなタスクは、v7-7 でこの Learner 経路を䞀気通貫で通す蚭蚈・実装を進めるかどうかの刀断になる。


Phase V7-8: C5 Learner Mixed A/B2025-12-11

目的

  • C5 Learner 付き v7 が、C5/C6 専甚ワヌクロヌドず Mixed 16–1040B でどう振る舞うかを A/B で確認し、「C5 を本線で v7 に茉せるか」「Learner を研究箱に留めるか」を刀断する。

ベンチ結果芁玄

  • C5/C6 集䞭プロファむル200–500B 垯

    • v7 OFF: 箄 19M ops/s
    • v7+Learner: 箄 43M ops/s+126%
    • Learner は C5-heavy ず刀定し、C5 を V7 route に維持。
  • 党範囲 Mixed16–1040B

    • v7 OFF: 箄 27M ops/s
    • v7+Learner: 箄 25M ops/s玄 -7%
    • C5 比率 ≈ 28% < 閟倀 30% ずなり、Learner は C5 route を V7 → MID_V3 に切り替え。

所感 / 今の刀断

  • C5/C6 専甚ワヌクロヌドでは v7+Learner が非垞に匷い2.2×ので、C5/C6 専甚ベンチでは「C5+C6 v7 + Learner ON」を研究甚プリセットずしお維持する䟡倀がある。
  • 䞀方、党範囲 Mixed では route 切り替え埌でも玄 -7% のたたで、珟時点では MIXED_TINYV3_C7_SAFE 本線プロファむルに v7+Learner を垞時 ON するのは芋送り。
  • 圓面の本線:
    • Mixed: ULTRA + MID v3 基準v7 は C6-only を含めお OFF、C5 Learner も OFF。
    • C5/C6 専甚プロファむル: HAKMEM_SMALL_HEAP_V7_ENABLED=1, HAKMEM_SMALL_HEAP_V7_CLASSES=0x60 + Learner ON を研究箱ずしお opt-in。

Phase V7-7: C5 Learner 実装動的 route 切り替え

実装内容

  • SmallLearnerStatsV7 型ず API を远加smallobject_policy_v7_box.h:
    • SmallLearnerClassStatsV7: per-class の v7_allocs, v7_retires, sample_count 等。
    • SmallLearnerStatsV7: 䞊蚘の per-class 配列。
    • API 矀: record_refill(), record_retire(), evaluate(), stats_snapshot() など、L3 から呌ぶむンタフェヌス。
  • ColdIface_v7 に stats hook を远加smallobject_cold_iface_v7.c:
    • refill_page() で record_refill(class_idx, capacity) を呌び、v7 refill むベントを集蚈。
    • retire_page() で record_retire(class_idx, capacity) を呌び、v7 retire むベントを集蚈。
  • PolicyBox v7 から C5 route を動的に切り替えsmallobject_policy_v7.c:
    • C5 の v7 利甚比率C5 v7 alloc / 党䜓を Learner から受け取り、閟倀で刀定。
    • 閟倀: C5 ratio < 30% のずき C5 を SMALL_ROUTE_MID_V3 ぞ切り替え、それ以倖は SMALL_ROUTE_V7 のたた。
    • 評䟡間隔: v7 refill 100 回ごずに evaluate() を実行。
    • route_kind 曎新は version ベヌスで行い、TLS 偎のキャッシュず敎合を取る。

挙動確認

  • C5+C6 専甚シナリオ50/50 混圚:
    • C5 ratio ≈ 50% → C5 は v7 維持期埅どおり。
  • C6-heavy シナリオC6 90%, C5 10% 皋床:
    • C5 ratio ≈ 12% → Learner が C5 route を V7 → MID_V3 に切り替え。
    • ログ䟋: [LEARNER_V7] C5 route switch: V7 → MID_V3 (C5 ratio=12%, threshold=30%)

このフェヌズで、「C5-heavy なら v7、小さい C5 混入なら MID v3」ずいう切り替えが、自動・䞀気通貫の経路ずしお通電した。今埌はこの Learner を Mixed 16–1024B 本線プロファむルでどこたで掻かせるか、A/B ずチュヌニングで詰めおいくフェヌズに入る。


Phase ULTRA 総括2025-12-11

Tiny/ULTRA 局は「完成䞖代」ずしお固定化

最終成果: Mixed 16–1024B = 43.9M ops/sbaseline 30.6M → +43.5%

珟圚の本線構成:

  • C4–C7 ULTRA寄生型 TLS cacheで legacy 49% → 4.8% に削枛
  • v3 backendalloc_current_hit=100%, free_retire=0.1%で堅牢に
  • Dispatcher/gate snapshot で ENV/route を hot path から排陀
  • C7 ULTRA refill を division → bit shift で +11%

蚭蚈的な完成床:

  • Small objectC2–C7 = ULTRA 最適化枈みfast path も slow path も
  • v3 backend = ロゞック郚分は完党最適化残り 5% は header write/memcpy 等の内郚コスト
  • 研究箱v4/v5/v6は OFF で暙準プロファむルに圱響なし

今埌の倧きい倉曎は別ラむン:

  1. Headerless/v6 ç³»: header out-of-band 化で alloc 毎の write 削枛1-2%
  2. mid/pool v3: C6-heavy を 10M → 20–25M に改善する新蚭蚈
  3. 䞊蚘は Tiny/ULTRA 局に圱響を䞎えない独立ラむンで怜蚎予定

詳现: docs/analysis/PERF_EXEC_SUMMARY_ULTRA_PHASE_20251211.md 参照


Phase MID-V3: Mid/Pool HotBox v3 完成 → 本線採甚2025-12-12

圹割分担の明確化

MID v3: 257-768B 専甚C6 のみ䜿甚 C7 ULTRA: 769-1024B 専甚既存 ULTRA パス

この分担により、各局が最適化された経路を持぀

Size Range     | Allocator     | Performance
---------------|---------------|------------------
0-256B         | Tiny/ULTRA    | Optimized (frozen)
257-768B       | MID v3        | +19.8% (mixed)
769-1024B      | C7 ULTRA      | Optimized (frozen)
1025B-52KB     | Pool          | Existing path
52KB+          | Large mmap    | Existing path

実装完了 → 本線プロファむル採甚

  • ✅ MID-V3-05: 型定矩、RegionIdBox 統合、alloc/free 実装
  • ✅ MID-V3-6: hakmem.c メむン経路統合箱化モゞュヌル化
  • ✅ Performance: C6 +11.1%, Mixed (257-768B) +19.8%
  • ✅ Role separation: C7 を MID v3 から陀倖、ULTRA に䞀本化
  • ✅ Mainline adoption: C6_HEAVY_LEGACY_POOLV1 ず MIXED_TINYV3_C7_SAFE プロファむルでデフォルト ON

ENV 蚭定本線プロファむルでデフォルト ON

# Profile 経由で自動有効化:
HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1
# たたは
HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE

# 明瀺的に指定する堎合:
HAKMEM_MID_V3_ENABLED=1      # Master switch (profiles でデフォルト ON)
HAKMEM_MID_V3_CLASSES=0x40   # C6 only (profiles でデフォルト蚭定)
HAKMEM_MID_V3_DEBUG=1        # Debug logging (opt-in)

蚭蚈 doc: docs/analysis/MID_POOL_V3_DESIGN.md Profile doc: docs/analysis/ENV_PROFILE_PRESETS.md


Phase V6-HDR-0: C6-only headerless core 蚭蚈確定frozen

目的

Tiny/ULTRA 完成を受け、C6-only で headerless 蚭蚈 を実蚌する最小コアv6を構築する。 C7 ULTRA は既に完成・凍結されおおり、v6 は C6 専甚の研究ラむンずしお独立させる。

4å±€ Box Theory蚭蚈原則

┌──────────────────────────────────────────────────────────────┐
│ L0: ULTRA lanes (TinyC7UltraBox 等)                          │
│     - C7 ULTRA は frozen / v6 ずは独立                       │
│     - v6 ULTRA将来は C6-only で別途蚭蚈                   │
├───────────────────────────────────────────────────────────────
│ L1: TLS Box (SmallTlsLaneV6 / SmallHeapCtxV6)                │
│     - per-class TLS freelist + current page ptr              │
│     - 責務: fast alloc/freeheader 曞き蟌みなし           │
├───────────────────────────────────────────────────────────────
│ L2: Segment / ColdIface (SmallSegmentV6 / ColdIfaceV6)       │
│     - page_meta[], segment base/end 管理                     │
│     - refill / retire の page lifecycle 管理                 │
├───────────────────────────────────────────────────────────────
│ L3: Policy / RegionIdBox / Stats                             │
│     - RegionIdBox: ptr→(region_kind, region_id, page_meta)   │
│     - PageStatsV6: page lifetime summary占有率、retire 頻床│
│     - Policy: GC / compaction 決定将来                   │
└──────────────────────────────────────────────────────────────┘

蚭蚈ポむント

  1. C7 ULTRA は独立 frozen 箱

    • TinyC7UltraBox / C7UltraSegmentBox はそのたた維持
    • v6 は C7 に觊らないC6-only
  2. v6 は C6-only small coreheaderless 研究

    • alloc 時に header byte を曞かないout-of-band metadata
    • free 時は RegionIdBox で ptr 分類 → page_meta ぞ盎接アクセス
  3. ptr 分類は RegionIdBox に集玄

    • 埓来: classify_ptr / hak_super_lookup / ss_fast_lookup など分散
    • v6: region_id_lookup_v6(ptr) で (region_kind, region_id, page_meta*) を返す
    • region_kind: SMALL_V6 / POOL / LARGE / UNKNOWN
  4. Stats/Learning は page lifetime summary のみを L3 に枡す

    • L1/L2 で個別 block の stats は取らない
    • page retire 時に summary (total_allocs, avg_lifetime_ns) を L3 ぞ push

実装タスクPhase V6-HDR-0: 完了

No タスク 状態
1-1 CURRENT_TASK.md 敎理本セクション远加 ✅
1-2 SMALLOBJECT_CORE_V6_DESIGN.md 新芏䜜成 ✅
1-3 REGIONID_V6_DESIGN.md 新芏䜜成 ✅
2-1 SmallTlsLaneV6 / SmallHeapCtxV6 型スケルトン ✅
2-2 v6 TLS API (small_v6_tls_alloc/free) ✅
3-1 RegionIdBox 型ず lookup API スケルトン ✅
3-2 OBSERVE モヌドv6 free 入口にログ ✅
4-1 PageStatsV6 箱未接続 ✅
5-1 AGENTS.md に v6 研究箱ルヌル远蚘 ✅
5-2 サニティベンチMixed / C6-heavy ✅

ENV

  • HAKMEM_SMALL_CORE_V6_ENABLED=0 (default OFF)
  • HAKMEM_REGION_ID_V6_OBSERVE=0 (default OFF, ログ出力甚)
  • HAKMEM_PAGE_STATS_V6_ENABLED=0 (default OFF)

Phase V6-HDR-2: C6 headerless free 実隓 ON進行䞭

目的

V6-HDR-0/1 で䜜成した箱ず RegionId の配線を䜿い、C6 だけ headerless free を実際に通電する。 挙動は C6-heavy 専甚プロファむルでだけ倉える前提。

実装タスク

No タスク 状態
1 smallobject_v6_env_box.h 䜜成ENV ゲヌト管理 ✅
2 front から v6 free ルヌト接続 ✅
3 small_v6_headerless_free 本実装 ✅
4 front から v6 alloc ルヌト接続 ✅
5 small_v6_headerless_alloc 本実装 ✅
6 header 曞き蟌み 1回だけ化確認 ✅
7 ドキュメント曎新 ✅
8 C6-heavy ベンチテスト ✅

実装詳现

  1. smallobject_v6_env_box.h (新芏)

    • small_heap_v6_headerless_enabled(): ENV HAKMEM_SMALL_HEAP_V6_HEADERLESS
    • small_v6_region_observe_enabled(): ENV HAKMEM_SMALL_V6_REGION_OBSERVE
    • small_v6_headerless_route_enabled(class_idx): 結合ゲヌト
  2. smallobject_core_v6.c (倉曎)

    • small_v6_headerless_free(): RegionIdBox lookup → class_idx 取埗 → TLS push
    • small_v6_headerless_alloc(): TLS pop (header 曞き蟌みなし) + refill
  3. malloc_tiny_fast.h (倉曎)

    • TINY_ROUTE_SMALL_HEAP_V6 case で headerless free/alloc を呌び出し
    • ENV ゲヌト付きデフォルト OFF

Header 曞き蟌みポリシヌ

  • refill 時のみ: carve/refill で page から TLS にブロックを移動する際に header 曞き蟌み
  • alloc/free では曞かない: v6 headerless route では header に䞀切觊らない
  • front は埓来通り: class_idx hint は header byte から取埗front 偎の読み取りは維持

ENV 倉数

ENV Default Description
HAKMEM_SMALL_HEAP_V6_ENABLED 0 v6 route 有効化
HAKMEM_SMALL_HEAP_V6_CLASSES 0x40 v6 察象クラスマスク (0x40=C6)
HAKMEM_SMALL_HEAP_V6_HEADERLESS 0 headerless mode 有効化
HAKMEM_SMALL_V6_REGION_OBSERVE 0 class_idx 怜蚌ログ

ベンチマヌク結果

# Baseline (v6 OFF)
C6-heavy 257-768B: 26.8M ops/s

# v6 headerless ON
C6-heavy 257-768B: 26.7M ops/s

# v6 headerless ON + OBSERVE
C6-heavy 257-768B: 26.1M ops/s (MISMATCH なし)

Phase V6-HDR 総括: C6-only Headerless コア蚭蚈確定完了

実装完了V6-HDR-04

Phase タスク 成果
HDR-0 型スケルトン + OBSERVE RegionIdBox, SmallSegmentV6 基本実装
HDR-1 RegionIdBox 実配線 ptr→(kind, page_meta) 分類動䜜確認
HDR-2 v6 free/alloc ルヌト接続 Headerless free/alloc path 有効化
HDR-3 SmallSegmentV6 TLS 登録 TLS-scope segment registration 実装
HDR-4 性胜最適化 (P0+P1) Double validation 排陀 + page_meta TLS cache

性胜掚移C6-heavy 257-768B

V6-HDR-2: Region lookup overhead → -3.5%  -8.3% 回垰
V6-HDR-3: Segment registration → lookup が SMALL_V6 を返すように
V6-HDR-4: P0 (double validation排陀) + P1 (page_meta cache)
         → +2.7%  +12% 改善 (侀郹run)

実枬倀耇数run平均:
- Baseline (v6 OFF):        9.1M ops/s
- V6 HDR-4 (最適化埌):     ~9.0M ops/s (±0% 盞圓)

蚭蚈成果

  1. RegionIdBox が薄く保たれた - ptr 分類のみ、メタデヌタ蚈算は TLS 偎に寄せる
  2. Same-page TLS cache - 同䞀ペヌゞ内のアクセスで page_meta lookup 完党スキップ
  3. Headerless が実装可胜 - ±数% で baseline 盞圓の性胜を達成
  4. 耇数クラス察応 - C4/C5/C6 mixed でも安定動䜜研究箱

珟圚の状態

  • 研究箱ずしお凍結: C6-only headerless v6 は ENV opt-in の研究箱デフォルト OFF
  • 本線は unchanged: C7 ULTRA + v3 backend が匕き続き基準
  • 今埌: mid/pool v3 による C6-heavy 改善に泚力、v6 は参考蚭蚈ずしお保持

最終ベンチマヌク2025-12-12

# C6-heavy (257-768B)
Run 1: Baseline 9.48M → V6 8.56M  (-9.7%)
Run 2: Baseline 8.50M → V6 9.21M  (+8.3%)  ← 安定倀むメヌゞ
Run 3: Baseline 6.74M → V6 9.16M  (+35.8%, baseline 䞍調)

Average: V6 ず Baseline ほが盞圓±数%

# Mixed (16-1024B, v6 OFF)
Run 1: 9.14M ops/s
Run 2: 9.11M ops/s
Run 3: 7.09M ops/s
Average: ~8.4M ops/s 本線基準

ENV 倉数研究甚

# C6-only headerless v6研究箱
HAKMEM_SMALL_HEAP_V6_ENABLED=1
HAKMEM_SMALL_HEAP_V6_CLASSES=0x40      # C6 のみ
HAKMEM_SMALL_HEAP_V6_HEADERLESS=1
HAKMEM_SMALL_V6_REGION_OBSERVE=0       # デバッグ甚
HAKMEM_REGION_ID_V6_OBSERVE=0          # デバッグ甚

凍結宣蚀

  • v6 は研究箱ずしお凍結デフォルト OFF、ENV opt-in
  • 性胜: ±数% で baseline 盞圓 = headerless design 実珟可胜が実蚌されたため、基本的な蚭蚈目暙は達成
  • 今埌: mid/pool v3 による C6-heavy 本栌改善に泚力
  • 参考蚭蚈: RegionIdBox (分類のみ) + TLS-scope cache はマルチ region 察応時の参考に

Phase V7-0: SmallObjectHeap v7 / HAKMEM v3 コア蚭蚈スケルトン新芏, 蚭蚈のみ

目的

ULTRA + MID v3 + V6 C6-only 䞖代を「第1ç«  完成」ずしお締めたうえで、 small〜mid を䞀䜓で扱う新コア SmallObjectHotBox_v7= HAKMEM v3 small/mid コア の蚭蚈だけ先に固める。 このフェヌズでは 型ずドキュメントのみ を远加し、挙動は䞀切倉曎しない。

やったこず蚭蚈レベル

  • 新芏ドキュメント docs/analysis/SMALLOBJECT_V7_DESIGN.md を远加:
    • L0: ULTRA (C4–C7, FROZEN)
    • L1: SmallObjectHotBox_v7 (small/mid コア)
    • L2: SegmentBox_v7 / ColdIface_v7
    • L3: PolicyBox_v7 / RegionIdBox / PageStatsBox の 4 局構造を明文化。
    • SmallPageMeta_v7 / SmallClassHeap_v7 / SmallHeapCtx_v7 / SmallSegment_v7 の struct ひな圢を定矩Hot/cold フィヌルド分離。
    • RegionIdBox v7 の APIRegionLookupResult_v7 / region_id_lookup_v7()ず header の扱い薄く残すが fast path では極力觊らないを敎理。
    • small v7 / mid v7 / pool v3 の関係共通の RegionId/Segment/PageStats の䞊に parallel な HotBox を眮くを蚘茉。
    • Phase v7-0/1/2 のフェヌズ分割型远加→C6-only stub→C6-only 本実装をたずめた。

ここたでの前提・ルヌル

  • ULTRA 䞖代C4–C7 ULTRA / Tiny front v3は FROZEN本線ずしお維持する。
  • MID v3 は 257–768B 専任の本線箱ずしお維持する。
  • V6 C6-only headerless は研究箱ずしお凍結v7 の物理局蚭蚈の参考。
  • v7 は 別章HAKMEM v3 䞖代 ずしお蚭蚈し、ENV 経由で opt-in するたで front/gate から䞀切呌ばない。

次フェヌズ候補実装は別 AI 向け

  1. Phase v7-1: C6-only v7 stub
    • route kind に TINY_ROUTE_SMALL_HEAP_V7 を远加し、C6 クラスだけ v7 route を返すプロファむルを远加。
    • small_heap_alloc_fast_v7_stub / small_heap_free_fast_v7_stub を実装し、圓面はすべお MID v3 / V6 / pool v1 に即フォヌルバック。
    • RegionIdBox_v7 は OBSERVE モヌドで region_id_lookup_v7(ptr) を呌び、REGION_SMALL_V7 の統蚈だけ取る挙動䞍倉。
  2. Phase v7-2: C6-only v7 本実装small垯だけ
    • SegmentBox_v7 / ColdIface_v7 を実装し、C6 pages の refill/retire を Segment v7 経由にする。
    • small_heap_alloc_fast_v7 / small_heap_free_fast_v7 を実装し、C6-only small 垯を本圓に v7 TLS + Segment で回す。
    • C6-heavy / Mixed で v7 vs MID v3 vs V6 vs v2 本線を A/B し、SmallObjectHotBox_v7 の䟡倀を評䟡。

Phase V6-HDR-1: RegionIdBox 実配線・OBSERVE完了

目的

V6-HDR-0 で䜜成した RegionIdBox を C6 segment に実配線し、OBSERVE モヌドで ptr → (kind, page_meta.class_idx) の正圓性を怜蚌する。挙動倉曎なし。

実装タスク

No タスク 状態
1 RegionIdBox 実装を埋めるC6 segment lookup ✅
2 v6 free の REGION_OBSERVE ロゞック具䜓化 ✅
3 front 偎 class_idx ヒント配線確認 ✅
4 ドキュメント曎新CURRENT_TASK.md, REGIONID_V6_DESIGN.md ✅
5 テストOBSERVE ON でベンチ実行 ✅

実装詳现

  1. RegionIdBox 実装 (core/region_id_v6.c)

    • region_id_lookup_v6(ptr): small_page_meta_v6_of(ptr) を䜿甚しお C6 segment 刀定
    • TLS cache 付き高速版: region_id_lookup_cached_v6(ptr)
    • OBSERVE ログ: HAKMEM_REGION_ID_V6_OBSERVE=1 で有効
  2. REGION_OBSERVE ロゞック (core/smallobject_core_v6.c)

    • ENV: HAKMEM_SMALL_V6_REGION_OBSERVE=1新蚭、V6-HDR-1 専甚
    • free 入口で region_id_lookup_v6(ptr) を呌び、class_idx 怜蚌
    • 䞍䞀臎時: [V6_REGION_OBSERVE] MISMATCH ptr=... hint=X actual=Y
  3. front 配線確認結果

    • class_idx hint は free_tiny_fast() 内でヘッダバむト (header & 0x0F) から取埗
    • v6 route (TINY_ROUTE_SMALL_HEAP_V6) は珟圚未接続break でスキップ
    • これは「OBSERVE only, 挙動倉曎なし」の仕様通り

ENV

  • HAKMEM_SMALL_V6_REGION_OBSERVE=1: free path で class_idx 怜蚌ログを出力


1. ベヌスラむン1 thread, ws=400, iters=1M, seed=1

  • Mixed 16–1024B本線

    • コマンド: HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE ./bench_random_mixed_hakmem 1000000 400 1
    • 䞻な ENVbench_profile 経由:
      • HAKMEM_TINY_HEAP_PROFILE=C7_SAFE
      • HAKMEM_TINY_C7_HOT=1
      • HAKMEM_SMALL_HEAP_V3_ENABLED=1 / HAKMEM_SMALL_HEAP_V3_CLASSES=0x80C7-only v3
      • HAKMEM_TINY_C7_ULTRA_ENABLED=1UF-3 セグメント版, 2MiB/64KiB
      • HAKMEM_TINY_FRONT_V3_ENABLED=1 / HAKMEM_TINY_FRONT_V3_LUT_ENABLED=1
      • HAKMEM_POOL_V2_ENABLED=0
    • Throughput珟 HEAD, Release: 箄 44–45M ops/s
    • 競合:
      • mimalloc: ~110–120M ops/s
      • system: ~90M ops/s
  • C7-only (1024B 固定, C7 v3 + ULTRA)

    • C7 ULTRA OFF: ~38M ops/s
    • C7 ULTRA ON: ~57M ops/s玄 +50%以䞊
    • C7 向け蚭蚈ULTRA セグメント + TLS freelist + mask freeは成功パタヌンずみなし、今埌の small-object v4/mid に展開予定。
  • C6-heavy mid/smallmid (257–768B, C6 は mid/pool 経路)

    • コマンド: HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 ./bench_mid_large_mt_hakmem 1 1000000 400 1
    • 珟状 Throughput: 箄 10M ops/s
    • 過去 Phase82 では LEGACY + flatten で 23–27M ops/s を蚘録しおおり、珟行 HEAD では lookup 局hak_super_lookup/mid_desc_lookup 等がボトルネック化しおいる状態。

2. いた本線で有効な箱

  1. C7 v3 + C7 ULTRA (UF-3 セグメント版)

    • Hot: TinyC7UltraBoxTLS freelist + 2MiB Segment / 64KiB Page, mask 刀定。
    • Cold: C7UltraSegmentBoxpage_meta[] で page/class/used/capacity を管理。
    • 特城:
      • C7-only で ~38M→~57M ops/s。Mixed でも 35M→44–45M ops/s たで底䞊げ。
      • C7 ULTRA 管理倖の ptr は必ず C7 v3 free にフォヌルバックヘッダ付き Fail-Fast 経路を維持。
    • ENV:
      • HAKMEM_TINY_C7_ULTRA_ENABLED=1デフォルト ON
      • HAKMEM_TINY_C7_ULTRA_HEADER_LIGHT は研究箱デフォルト 0。
  2. SmallObject v3C7-only 本線

    • C7 ペヌゞ単䜍の freelist + current/partial 管理。ColdIface は Tiny v1 経由で Superslab/Warm/Stats を觊る。
    • C7 ULTRA ON 時は「セグメント内 ptr だけ ULTRA が先に食い、残りは v3 free」が基本構造。
  3. mid/pool v1C6 は䞀旊ここに固定, Phase C6-FREEZE

    • C6 は Tiny/SmallObject/ULTRA で特別扱いしない。
    • C6 専甚 smallheap v3/v4/ULTRA・pool flatten はすべお ENV opt-in の研究箱扱い。
    • 珟状 C6-heavy は ~10M ops/s。再蚭蚈タヌゲット。

3. small-object v4 / mid 向けの珟状ず方針

  • SmallObjectHotBox_v4 の箱構造蚭蚈枈み, 郚分実装

    • SmallPageMeta: free_list/used/capacity/class_idx/flags/page_idx/segment。
    • SmallClassHeap: current/partial_head/full_head。
    • SmallHeapCtx: per-thread で SmallClassHeap cls[NUM_SMALL_CLASSES] を持぀。
    • SmallSegment (v4): 2MiB Segment / 64KiB Page を前提に page_meta[] を持぀。
    • ColdIface_v4: small_cold_v4_refill_page / small_cold_v4_retire_page / small_cold_v4_remote_push/drain の 1 箱。
  • C6-only v4 実装Phase v4-mid-2, 研究箱

    • C6 の alloc/free を SmallHeapCtx v4 経由で凊理し、Segment v4 から refill/retire する経路を実装枈み。
    • C6-heavy A/BC6 v1 vs v4:
      • v4 OFF: ~9.4M ops/s
      • v4 ON : ~10.1M ops/s玄 +8〜9%
    • Mixed で C6-only v4 を ON にするず +1% 皋床ほが誀差内で回垰なし。
    • デフォルトでは HAKMEM_SMALL_HEAP_V4_ENABLED=0 / CLASSES=0x0 のため暙準プロファむルには圱響しない。
  • mid/smallmid の今埌の狙い

    • 珟状C6-heavy ~10M ops/s、lookup 系hak_super_lookup / mid_desc_lookup / classify_ptr / ss_map_lookupが ~40% を占める。
    • 方向性
      • C7 ULTRA で成功したパタヌンSegment + Page + TLS freelist + mask freeを small-object v4 に広げお、ptr→page→class を O(1) にする。
      • mid_desc_lookup / hak_super_lookup などの lookup 局を small-object v4 route から倖す。
      • C6/C5 は「hot mid クラス」ずしお段階的に v4 に茉せ、その他の mid/smallmid は SmallHeap v4 or pool v1 で扱う。

4. 今埌のフェヌズTODO 抂芁

  1. Phase v4-mid-3C5-only v4 研究箱 ✅ 完了

    • ENV: HAKMEM_SMALL_HEAP_V4_ENABLED=1 / HAKMEM_SMALL_HEAP_V4_CLASSES=0x20 で C5 を SmallHeap v4 route に茉せる。
    • A/B 結果:
      • C5-heavy (129–256B): v4 OFF 54.4M → v4 ON 48.7M ops/s (−10〜11%回垰)。既存 Tiny/front v3 経路が速い。
      • Mixed 16–1024B (C6+C5 v4): C6-only 28.3M → C5+C6 28.9M ops/s (+2%, 誀差〜埮改善)。回垰なし。
    • 方針: C5-heavy では v4 が劣埌するため、C5 v4 は研究箱のたた暙準プロファむルには入れない。Mixed では圱響小さいため C5+C6 v4 (0x60) も研究箱ずしお利甚可胜。
  2. Phase v4-mid-4/5/6C6/C5 v4 の蚺断ず䞀時凍結 ✅ 完了

    • C5 v4:
      • C5-heavy (129–256B): v4 OFF 54.4M → v4 ON 48.7M ops/s−10〜11% 回垰。既存 Tiny/front v3 経路が速い。
      • Mixed 16–1024B では C5+C6 v4 ON で +2〜3% 皋床の埮改善だが、本線ずしお採甚するほどのメリットは無い。
    • C6 v4:
      • 正しい C6-only ベンチMIN=256 MAX=510で v4 OFF ~58–67M → v4 ON ~48–50M ops/s−15〜28% 回垰。
      • stats から C6 alloc/free の 100% が v4 経路を通っおいるこずが確認でき、route/fallback ではなく v4 実装そのものが重いこずが刀明。
      • ws/iters を増やすず TinyHeap ずペヌゞ共有する蚭蚈起因のクラッシュも残存しおおり、C6 v4 を珟行蚭蚈のたた本線に茉せるのは難しい。
    • TLS fastlist:
      • C6 甹 TLS fastlist を远加したが、v4 ON 時の C6-heavy throughput はほが倉わらず48〜49M ops/s。根本的な回垰v4のペヌゞ管理/構造を打ち消すには至っおいない。
    • 方針:
      • 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 パタヌンに近づける方向で怜蚎を継続する。
  4. Phase v4-mid-SEGVC6 v4 の SEGV 修正・研究箱安定化 ✅ 完了

    • 問題: C6 v4 が TinyHeap のペヌゞを共有 → iters >= 800k で freelist 砎壊 → SEGV
    • 修正: C6 専甚 refill/retire を SmallSegment v4 に切り替え、TinyHeap 䟝存を完党排陀
    • 結果:
      • iters=1M, ws <= 390: SEGV 消倱 ✅
      • C6-only (MIN=257 MAX=768): v4 OFF ~47M → v4 ON ~43M ops/s−8.5% 回垰のみ、安定
      • Mixed 16–1024B: v4 ON で SEGV なし小幅回垰蚱容
    • 方針: C6 v4 は研究箱ずしお安定化完了。本線には茉せない既存 mid/pool v1 を䜿甚。
  5. Phase v5-0SmallObject v5 refactor: ENV統䞀・マクロ化・構造䜓最適化 ✅ 完了

    • 内容: v5 基盀の改善・最適化挙動は完党䞍倉
    • 改善項目:
      • ENV initialization を sentinel パタヌンで統䞀ENV_UNINIT/ENABLED/DISABLED + __builtin_expect
      • ポむンタマクロ化: BASE_FROM_PTR, PAGE_IDX, PAGE_META, VALIDATE_MAGIC, VALIDATE_PTR
      • SmallClassHeapV5 に partial_count 远加
      • SmallPageMetaV5 の field 再配眮hot fields 先頭集玄 → L1 cache 最適化, 24B
      • route priority ENV 远加: HAKMEM_ROUTE_PRIORITY={v4|v5|auto}
      • segment_size override ENV 远加: HAKMEM_SMALL_HEAP_V5_SEGMENT_SIZE
    • 挙動: 完党䞍倉v5 route は呌ばれない、ENV デフォルト OFF
    • テスト: Mixed 16–1024B で 43.0–43.8M ops/s倉化なし、SEGV/assert なし
    • 目暙: v5-1 で C6-only stub → v5-2 で本実装 → v5-3 で Mixed に段階昇栌
  6. Phase v5-1SmallObject v5 C6-only route stub 接続 ✅ 完了

    • 内容: C6 を v5 route に接続䞭身は v1/pool fallback
    • 実装:
      • tiny_route_env_box.h: C6 で HAKMEM_SMALL_HEAP_V5_ENABLED=1 なら TINY_ROUTE_SMALL_HEAP_V5 に分岐
      • malloc_tiny_fast.h: alloc/free switch に v5 case 远加fallthrough で v1/pool に萜ちる
      • smallobject_hotbox_v5.c: stub 実装alloc は NULL 返华、free は no-op
    • ENV: HAKMEM_SMALL_HEAP_V5_ENABLED=1 / HAKMEM_SMALL_HEAP_V5_CLASSES=0x40 で opt-in
    • テスト結果:
      • C6-heavy: v5 OFF ~15.5M → v5 ON ~16.4M ops/s倉化なし, 正垞
      • Mixed: 47.2M ops/s倉化なし
      • SEGV/assert なし ✅
    • 方針: v5-1 では挙動は v1/pool fallback ず同じ。研究箱ずしお ENV プリセットC6_SMALL_HEAP_V5_STUBを docs/analysis/ENV_PROFILE_PRESETS.md に远蚘。v5-2 で本実装を远加。
  7. 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 基準で芋る。
  8. 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。
  9. 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 性胜を郚分改善可胜。
  10. Phase v5-6C6 v5 TLS batching ✅ 完了研究箱

    • 目的: refill 頻床を削枛し、C6-heavy で v5 full+cache 比の远加改善を狙う。
    • 実装:
      • HAKMEM_SMALL_HEAP_V5_BATCH_ENABLED / HAKMEM_SMALL_HEAP_V5_BATCH_SIZE を远加し、SmallHeapCtxV5 に SmallV5Batch c6_batchslots[4] + countを持たせお、C6 v5 alloc/free で TLS バッチを優先的に䜿うようにした。
    • 実枬1M/400, HEADER_MODE=full, TLS cache=ON, v5 ON:
      • C6-heavy: batch OFF 36.71M → batch ON 37.78M ops/s+2.9%
      • Mixed 16–1024B: batch OFF 38.25M → batch ON 37.09M ops/s玄 -3%, C6-heavy 専甚オプションずしお蚱容
    • 方針: C6-heavy では cache に続いお batch でも +数% 改善を確認できたが、v5 党䜓は䟝然 baseline(v1/pool) より遅い。C6 v5 は匕き続き研究箱ずしお維持し、本線 mid/smallmid は pool v1 を基準に芋る。
  11. Phase v6-0SmallObject Core v6 蚭蚈・型スケルトン ✅ 完了蚭蚈

    • 目的: 16〜2KiB small-object/mid 向けに、L0 ULTRA / L1 Core / L2 Segment+ColdIface / L3 Policy の4局構造ずヘッダレス前提の HotBox を定矩し、「これ以䞊動かさない栞」の蚭蚈を固める。
    • 内容:
      • docs/analysis/SMALLOBJECT_CORE_V6_DESIGN.md を远加し、SmallHeapCtxV6 / SmallClassHeapV6 / SmallPageMetaV6 / SmallSegmentV6 ず ptr→page→class O(1) ルヌル、HotBox が絶察にやらない責務header 曞き・lookup・Stats などを明文化。
      • v6 は珟時点ではコヌドは䞀切觊らず、蚭蚈レベルの仕様ず型むメヌゞだけをたずめた段階。v5 は C6 研究箱ずしお残し぀぀、将来 small-object を䜜り盎す際の「芯」ずしお v6 の局構造を採甚する。
  12. Phase v6-1〜v6-4SmallObject Core v6 C6-only 実装薄型化Mixed 安定化 ✅ 完了研究箱

    • v6-1: route stub 接続挙動は v1/pool fallback のたた。
    • v6-2: Segment v6 + ColdIface v6 + Core v6 HotPath の最䜎限実装。C6-heavy で v6 経路が SEGV なく完走するずころたで確認初期は玄 -44%。
    • v6-3: 薄型化TLS ownership check + batch header write + TLS batch refillにより、C6-heavy で v6 OFF ≈27.1M / v6-3 ON ≈27.1M±0%, baseline 同等たで改善。
    • v6-4: Mixed での v6 安定化。small_page_meta_v6_of が TLS メタではなく mmap 領域を芋おいたバグを修正し、Mixed v6 ON でも完走C6-only v6 のため Mixed は v6 ON ≈35.8M, v6 OFF ≈44M。
    • 珟状:
      • C6-heavy: v6 OFF ≈27.1M / v6 ON ≈27.4MC6 Core v6 は baseline 同等・安定。
      • Mixed: C6-only v6 のため党䜓ではただ玄 -19% 回垰。C6-heavy 甚の実隓箱ずしお v6 を維持し぀぀、本線 Mixed は匕き続き v6 OFF を基準に芋る。
  13. Phase v6-5SmallObject Core v6 C5 拡匵, 研究箱 ✅ 完了

    • 目的: Core v6 を C5 サむズ垯129–256Bにも拡匵し、free hotpath で v6 がカバヌするクラスを増やす足堎を䜜る。
    • 実装:
      • SmallHeapCtxV6 に C5 甹 TLS freelisttls_freelist_c5 / tls_count_c5を远加し、C5 でも small_alloc_fast_v6 / small_free_fast_v6 が TLS→refill/slow のパタヌンで動くようにした。
      • ColdIface v6 の refill/retire を class_idxC5/C6に応じお block_size/容量を倉えられるよう䞀般化。
    • 実枬1M/400, v6 ON C5-only, C6 v6 OFF:
      • C5-heavy (129–256B): v6 OFF ≈53.6M → v6 ON(C5) ≈41.0M玄 -23%
      • Mixed 16–1024B: v6 OFF ≈44.0M → v6 ON(C5) ≈36.2M玄 -18%
    • 方針: C5 Core v6 は安定しお動くものの、Tiny front v3 + v1/pool より倧きく遅いため、本線には乗せず C5 v6 は研究箱扱いずする。C5-heavy/Mixed の free hotpath をさらに削るなら、v6 偎のさらなる薄型化か、別の箱front/gate や poolの再蚭蚈を怜蚎する。
  14. Phase v6-6SmallObject Core v6 C4 拡匵, 研究箱 ✅ 完了

    • 目的: Core v6 を C4 サむズ垯65–128Bに拡匵しお、free hotpath カバヌ範囲を広げ、ss_fast_lookup/slab_index_for 䟝存を削枛。
    • 実装内容:
      • SmallHeapCtxV6 に C4 甹 TLS freelisttls_freelist_c4 / tls_count_c4を远加。
      • small_alloc_fast_v6 に C4 fast/cold refill path を远加small_alloc_c4_hot_v6 / small_alloc_cold_v6 で C4 支揎。
      • small_free_fast_v6 に C4 TLS push path を远加small_free_c4_hot_v6。
      • malloc_tiny_fast.h alloc/free dispatcher に C4 case を远加。
      • ColdIface v6 refill を C4128B blockに察応。
      • バグ修正: small_alloc_cold_v6 に C4 refill logic が欠萜しおいたのを修正cold path で C4 refill が実装されおいなかったため、党お pool fallback になっおいた。
    • 実枬倀100k iter, v6 ON, mixed size workload:
      • C4-only (80B, class 4): v6 OFF ≈47.4M → v6 ON ≈39.4M−17% 回垰
      • C5+C6 (mixed 200/400B): v6 OFF ≈43.5M → v6 ON ≈26.8M−38% 回垰
      • Mixed (500B): v6 OFF ≈40.8M → v6 ON ≈27.5M−33% 回垰
    • 評䟡:
      • 目暙: v6-6 は ±0–数% within acceptable rangeuser 指定を狙っおいたが、C4 実装によっおも倧きな回垰が消えずC4-only: −17%。
      • 根本原因: v6 実装そのものTLS ownership check + page refill + cold pathの overhead が v5 以来続いおおり、C4 拡匵では構造的な改善に至らず。
      • 安党確認の閟倀超過: Mixed で −33% は user 指定の「−10% 以䞊萜ちたら研究箱に留める」基準を倧きく超過。
    • 方針: Phase v6-6 は研究箱に留め、本線に乗せない。v6-6 C4 extend は ENV opt-in のみ。混圚リスク防止のため、v6-5C5ず v6-6C4は同時 ON は非掚奚Mixed で −33%。
    • 今埌の方向性:
      • v6 系は「C6 baseline 同等」では達成できたがv6-3C6-only で ±0%C5/C4 ぞの拡匵では overhead が倧きい。
      • 次のアプロヌチは v6 architecture の root cause 調査TLS ownership check の cost / page refill overhead / cold path cost 等か、別蚭蚈pool v2 再蚭蚈, front gate 薄型化, ULTRA segment 拡匵を怜蚎すべき。

6. free path 最適化の方針Phase FREE-LEGACY-BREAKDOWN 系列

珟状認識:

  • Mixed 16–1024B の perf 内蚳: free ≈ 24%, tiny_alloc_gate_fast ≈ 22%
  • v6C5/C4 拡匵で −33% 回垰、free-front v3 で −4% 回垰
  • 新䞖代远加ではなく、既存 free path の「どの箱が䜕食っおいるか」を可芖化しおピンポむント削枛する方針に転換

本線の前提固定:

  • Mixed 16–1024B: Tiny front v3 + C7 ULTRA + pool v1玄 44–45M ops/s
  • v4/v5/v6C5/C4/ free-front v3 は 研究箱・デフォルト OFF
  • v6 は C6-only の mid 向けコアC6-heavy プロファむル専甚で ON、±0% 達成
  • HAKMEM_SMALL_HEAP_V6_ENABLED=0 / HAKMEM_TINY_FREE_FRONT_V3_ENABLED=0 が基準

Phase FREE-LEGACY-BREAKDOWN-1 ✅ 完了

  • 目的: free ホットパスを箱単䜍でカりントし、内蚳を可芖化
  • 実装:
    • ENV: HAKMEM_FREE_PATH_STATS=1 で free path の箱ごずカりンタを有効化default 0
    • FreePathStats 構造䜓で c7_ultra / v3 / v6 / pool v1 / super_lookup / remote_free などを蚈枬
    • デストラクタで [FREE_PATH_STATS] 出力
  • 枬定結果: docs/analysis/FREE_LEGACY_PATH_ANALYSIS.md に蚘録
  • 次フェヌズ: 枬定結果を芋お FREE-LEGACY-OPT-1/2/3 のどれを実装するか決定

Phase FREE-LEGACY-BREAKDOWN-1 枬定結果 ✅ 完了

  • Mixed 16–1024B の free 経路内蚳:
    • C7 ULTRA fast: 50.7% (275,089 / 542,031 calls)
    • Legacy fallback: 49.2% (266,942 / 542,031 calls)
    • pool_v1_fast: 1.5% (8,081 / 542,031 calls)
    • その他v3/v6/tiny_v1/super_lookup/remote: 0.0%
  • C6-heavy の free 経路内蚳:
    • pool_v1_fast: 100% (500,099 / 500,108 calls)
    • その他: 0.0%
  • 䞻芁発芋:
    • Mixed は 完党な二極化構造C7 ULTRA 50.7% vs Legacy 49.2%
    • C6-heavy は pool_v1 経路のみを䜿甚最適化タヌゲット明確
  • 詳现: docs/analysis/FREE_LEGACY_PATH_ANALYSIS.md 参照

Phase FREE-LEGACY-OPT-4 シリヌズ: Legacy fallback 削枛蚈画䞭

  • 目的: Mixed の Legacy fallback 49.2% を削枛し、C7 ULTRA パタヌンを他クラスに展開
  • アプロヌチ:
    • 4-0: ドキュメント敎理 ✅
    • 4-1: Legacy の per-class 分析どのクラスが Legacy を最も䜿甚しおいるか特定
    • 4-2: 1クラス限定 ULTRA-Free lane の蚭蚈・実装
      • 察象: 4-1 で特定された最倧シェアクラス仮に C5
      • 実装: TLS free キャッシュのみ远加alloc 偎は既存のたた
      • ENV: HAKMEM_TINY_C5_ULTRA_FREE_ENABLED=0 (研究箱)
    • 4-3: A/B テストMixed で効果枬定、結果次第で本線化 or 研究箱維持
  • 期埅効果: Legacy 49% → 35-40% に削枛、free 党䜓で 5-10% 改善、Mixed で +2-4M ops/s

5. 健康蚺断ラン必ず最初に叩く 2 本

  • Tiny/Mixed 甹:

    HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE \
    ./bench_random_mixed_hakmem 1000000 400 1
    # 目安: 44±1M ops/s / segv/assert なし
    
  • mid/smallmid C6 甹:

    HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 \
    ./bench_mid_large_mt_hakmem 1 1000000 400 1
    # 珟状: ≈10M ops/s / segv/assert なし再蚭蚈タヌゲット
    

たずめお叩きたいずきは scripts/verify_health_profiles.sh存圚する堎合を利甚し、
詳现な perf/フェヌズログは CURRENT_TASK_ARCHIVE_20251210.md ず各 docs/analysis/* を参照しおください。


Phase FREE-LEGACY-OPT-4-4: C6 ULTRA free+alloc 統合寄生型 TLS キャッシュ✅ 完了

目的

Phase 4-3 で free-only TLS キャッシュが effective でないこずが刀明したため、 alloc 偎に TLS pop を远加しお統合し、完党な alloc/free サむクルを実珟。

実装内容

  • malloc_tiny_fast.h: C6 ULTRA alloc popL191-202
  • FreePathStats: c6_ultra_alloc_hit カりンタ远加
  • ENV: HAKMEM_TINY_C6_ULTRA_FREE_ENABLED (default: OFF)

蚈枬結果

Mixed 16–1024B (1M iter, ws=400):

  • OFF (baseline): 40.2M ops/s
  • ON (統合埌): 42.2M ops/s
  • 改善: +4.9% ✅ 期埅倀達成

C6-heavy (257-768B, 1M iter, ws=400):

  • OFF: 40.7M ops/s
  • ON: 43.8M ops/s
  • 改善: +7.6% ✅ Mixed より効果倧

効果の分析

Legacy の劇的削枛:

  • Legacy fallback: 266,942 → 129,623 (-51.4%)
  • Legacy by class[6]: 137,319 → 0 (100% 排陀)

TLS サむクルの成功:

  • C6 allocs: 137,241 が TLS pop で direct serve
  • C6 frees: 137,319 が TLS push で登録
  • キャッシュは過充填しないalloc が drain

蚭蚈パタヌン

寄生型 TLS キャッシュ:

  • Core v6 のような専甚 segment 管理なし
  • 既存 allocator に「寄生」overhead minimal
  • free + alloc 䞡方制埡で完党なサむクル実珟

刀定結果

✅ 期埅倀達成: +3-5% → +4.9% を実珟 ✅ C6 legacy 100% 排陀: 蚭蚈の劥圓性確認 ✅ 本呜候補に昇栌: ENV デフォルト OFF は維持


Phase REFACTOR-1/2/3: Code Quality Improvement ✅ 完了

実斜内容

  1. REFACTOR-1: Magic Number → Named Constants

    • 新ファむル: tiny_ultra_classes_box.h
    • TINY_CLASS_C6/C7、tiny_class_is_c6/c7() マクロ定矩
    • malloc_tiny_fast.h: == 6, == 7 → semantic macros
  2. REFACTOR-2: Legacy Fallback Logic 統䞀化

    • 新ファむル: tiny_legacy_fallback_box.h
    • tiny_legacy_fallback_free_base() 統䞀関数
    • 重耇削陀: 60行malloc_tiny_fast.h ず tiny_c6_ultra_free_box.c
  3. REFACTOR-3: Inline Pointer Macro 䞭倮化

    • 新ファむル: tiny_ptr_convert_box.h
    • tiny_base_to_user_inline(), tiny_user_to_base_inline()
    • offset 1 byte を centralized に

効果

  • ✅ DRY 原則: Code duplication 削枛60行
  • ✅ 可読性: Magic number → semantic macro
  • ✅ 保守性: offset, logic を1箇所で定矩
  • ✅ Performance: Zero regressioninline preserved

环積改善Phase 4-0 → Refactor-3

Phase 改善 环積 特城
4-1 - - Legacy per-class 分析
4-2 +0% 0% Free-only TLS効果なし
4-3 +1-3% 1-3% Segment 孊習限定的
4-4 +4.9% +4.9% Free+alloc 統合本呜
REFACTOR +0% +4.9% Code qualityoverhead なし

Phase FREE-FRONT-V3-1 実装完了 (2025-12-11)

目的: free 前段に「v3 snapshot 箱」を差し蟌み、route 刀定ず ENV 刀定を 1 箇所に集玄する足堎を䜜る。挙動は倉えない。

実装内容:

  1. 新芏ファむル䜜成: core/box/free_front_v3_env_box.h

    • free_route_kind_t enum (FREE_ROUTE_LEGACY, FREE_ROUTE_TINY_V3, FREE_ROUTE_CORE_V6_C6, FREE_ROUTE_POOL_V1)
    • FreeRouteSnapshotV3 struct (route_kind[NUM_SMALL_CLASSES])
    • API 3個: free_front_v3_enabled(), free_front_v3_snapshot_get(), free_front_v3_snapshot_init()
    • ENV: HAKMEM_TINY_FREE_FRONT_V3_ENABLED (default 0 = OFF)
  2. 実装ファむル: core/box/free_front_v3_env_box.c

    • free_front_v3_enabled() - ENV lazy init (default OFF)
    • free_front_v3_snapshot_get() - TLS snapshot アクセス
    • free_front_v3_snapshot_init() - route_kind テヌブル初期化
    • 珟行 tiny_route_for_class() を䜿っお既存挙動を維持
  3. ファむル修正: core/box/hak_free_api.inc.h

    • FG_DOMAIN_TINY 内に v3 snapshot routing logic を远加
    • v3 OFF (default) では埓来パスを維持挙動倉曎なし
    • v3 ON では snapshot 経由で route 決定 (v6 c6, v3, pool v1)
  4. Makefile 曎新

    • OBJS_BASE, BENCH_HAKMEM_OBJS_BASE, SHARED_OBJS に free_front_v3_env_box.o 远加

ビルド結果:

  • ✅ コンパむル成功 (free_front_v3_env_box.o 生成)
  • ✅ リンク成功 (free_front_v3_enabled, free_front_v3_snapshot_get シンボル解決)
  • 既存の v3/v4/v5/v6 関連のリンク゚ラヌは pre-existing issue

次フェヌズ (FREE-FRONT-V3-2):

  • route_for_class 呌び出し削枛
  • ENV check 削陀snapshot 内に統合枈み
  • snapshot 初期化の最適化

Phase FREE-FRONT-V3-2 実装完了 (2025-12-11)

目的: free path から tiny_route_for_class() 呌び出しず redundant な ENV check を削枛し、free 凊理を最適化する。

実装内容:

  1. smallobject_hotbox_v3_env_box.h に small_heap_v3_class_mask() 远加

    • v3 察象クラスのビットマスクを返す関数を远加v6 ず同様の API
    • small_heap_v3_class_enabled() をマスク経由に曞き換え
  2. free_front_v3_snapshot_init() の最適化 (core/box/free_front_v3_env_box.c)

    • tiny_route_for_class() 呌び出しを完党削陀
    • ENV マスクを盎接読んで刀定v6_mask, v3_mask
    • 優先床順に route 決定: v6 > v3 > pool/legacy
  3. hak_free_at() v3 path の最適化 (core/box/hak_free_api.inc.h)

    • v6 hot path を inline で呌び出すsmall_free_c6_hot_v6, c5, c4
    • ENV check なし、snapshot だけで完結
    • v3 path (C7) は so_free() に委譲ss_fast_lookup は v3 内郚で凊理

ベンチマヌク結果:

Mixed 16-1024B (bench_random_mixed_hakmem 100000 400 1):

  • v3 OFF (baseline): 42.6M, 41.6M, 45.2M ops/s → 平均 43.1M ops/s
  • v3 ON (optimized): 41.1M, 39.9M, 43.0M ops/s → 平均 41.3M ops/s
  • 結果: −4.2% (埮回垰)

C6-heavy mid/smallmid (bench_mid_large_mt_hakmem 1 100000 400 1):

  • v3 OFF (baseline): 13.8M, 15.2M, 14.5M ops/s → 平均 14.5M ops/s
  • v3 ON (optimized): 15.5M, 15.2M, 14.0M ops/s → 平均 14.9M ops/s
  • 結果: +2.8% (誀差〜埮改善)

安定性:

  • ✅ コンパむル成功、リンク成功
  • ✅ SEGV/assert なし
  • ✅ v3 OFF 時は埓来パスを維持完党に倉曎なし

結論:

  • Mixed で埮回垰 (−4%) が芋られるため、v3 は匕き続き研究箱default OFFずしお維持
  • C6-heavy では埮改善 (+3%) が確認されたが、誀差範囲内
  • snapshot infrastructure は正垞に動䜜しおおり、今埌の最適化の足堎ずしお有甚
  • Phase v3-3 では、v6 hot path の inline 化や route dispatch の最適化を怜蚎

Phase PERF-ULTRA-REBASE-1 実斜完了 (2025-12-11)

目的: C4-C7 ULTRA を党お有効にした状態での CPU ホットパス蚈枬

蚈枬条件:

  • ENV: HAKMEM_TINY_C4/C5/C6/C7_ULTRA_FREE_ENABLED=1党お ON
  • v6/v5/v4/free-front-v3 は OFF研究箱
  • ワヌクロヌド: Mixed 16-1024B, 10M cycles, ws=8192
  • Throughput: 31.61M ops/s

ホットパス分析結果 (allocator 内郚, self%):

順䜍 関数/パス self% 分類
🔎 #1 C7 ULTRA alloc 7.66% ← 新しい最倧ボトルネック
#2 C4-C7 ULTRA free矀 5.41% alloc-free cycle
#3 so_alloc系 (v3 backend) 3.60% 䞭芏暡alloc
#4 page_of/segment刀定 2.74% ptr解決
#5 gate/front前段 2.51% ✅改善枈み
#6 so_freeç³» 2.47% -
#7 ss_map_lookup 0.79% ✅倧幅改善枈み

重芁な発芋:

  1. C7 ULTRA alloc が明確な最倧ボトルネック - gate/front や header はもう十分薄い
  2. header曞き蟌みが䞍可芖 (< 0.17%) - ULTRA経路での削枛効果が出おいる
  3. gate/front は既に蚱容範囲 (2.51%) - 以前のフェヌズより改善枈み

分析結論:

  • v6/v5/v4 のような新䞖代远加ではなく、「既に圓たりが出おいる C7/C4/C5/C6 ULTRA 内郚を薄くする」フェヌズぞ転換すべき
  • C7 ULTRA alloc の 7.66% を 5-6% に削れば、党䜓で 2-3% の効果が期埅できる

詳现: docs/analysis/TINY_CPU_HOTPATH_USERLAND_ANALYSIS.md 参照


Phase PERF-ULTRA-ALLOC-OPT-1 蚈画実装予定

目的: C7 ULTRA alloc7.66%の内郚最適化による alloc パス高速化

タヌゲット: tiny_c7_ultra_alloc() の hot path を盎線化

実装斜策:

  1. TLS ヒットパスの盎線化
    • env check / snapshot 取埗が残っおいないか確認
    • fast path を完党に盎線化分岐最小化
  2. TLS freelist レむアりト最適化
    • 1 cache line に収たるか確認
    • alloc ホットデヌタfreelist[], countの配眮最適化
  3. segment/page_meta アクセスの確認
    • segment learning / page_meta access が本圓に slow path だけか確認
    • hot path に䜙分なメモリアクセスがないか確認

蚈枬戊略:

  • C7-only ず Mixed 䞡方の A/B テストenabler: HAKMEM_TINY_C7_ULTRA_FREE_ENABLED=1
  • perf 蚈枬で self% が 7.66% → 5-6% たで萜ちるか確認
  • throughput 改善量を枬定

期埅倀: alloc パスで 5-10% の削枛

次ステップ: 実装完了埌、perf 再蚈枬で効果を怜蚌


次フェヌズ候補決定保留䞭

実装予定フェヌズ

  1. Phase PERF-ULTRA-ALLOC-OPT-1 (即座実装)

    • C7 ULTRA alloc 内郚最適化
    • 目暙: 7.66% → 5-6%
    • 期埅: 党䜓で 2-3% 改善
  2. Phase PERF-ULTRA-ALLOC-OPT-2 (埌続)

    • C4-C7 ULTRA free矀5.41%の軜量化
    • page_of / segment刀定ずの連携最適化

研究箱埌回し、圓面は OFF

  • C3/C2 ULTRA: legacy 小さい4% 未満のに TLS 増加で L1 汚染リスク
  • v6/v5/v4 拡匵: 既存 v1/pool より倧幅に遅く、新䞖代远加は珟段階では回垰誘発
  • FREE-FRONT-V3-2: 以前 -4% 回垰があったため、ULTRA 敎備埌に再怜蚎

実装ポリシヌ倉換重芁

これたでフェヌズ 4-4 たで

  • 新しい箱や䞖代v4/v5/v6/free-front-v3 等を増やす
  • 圓たりが出たら本線化する

今埌PERF-ULTRA-ALLOC-OPT 以降

  • 既に圓たりが出おいる箱C4-C7 ULTRAの䞭身を现かく削る
  • 新䞖代远加は避けるL1 キャッシュ汚染、耇雑床増加のリスク
  • hotpath 分析 → ピンポむント最適化のサむクルを回す

Phase PERF-ULTRA-ALLOC-OPT-1 実装詊行 (2025-12-11)

目的: C7 ULTRA alloc珟圚 7.66% self%の hot path を盎線化し、5-6% たで削枛

実装内容:

  • 新芏ファむル䜜成:
    • core/box/tiny_c7_ultra_free_env_box.h: ENV gate (HAKMEM_TINY_C7_ULTRA_FREE_ENABLED, default ON)
    • core/box/tiny_c7_ultra_free_box.h: TLS structure (TinyC7UltraFreeTLS) with optimized layout (count first)
    • core/box/tiny_c7_ultra_free_box.c: tiny_c7_ultra_alloc_fast() / tiny_c7_ultra_free_fast() implementation
  • 倉曎ファむル:
    • core/front/malloc_tiny_fast.h: 新しい C7 ULTRA alloc/free fast path の統合
    • core/box/free_path_stats_box.h: c7_ultra_free_fast / c7_ultra_alloc_hit カりンタ远加
    • Makefile: tiny_c7_ultra_free_box.o の远加

蚭蚈意図:

  • C4/C5/C6 ULTRA free ず同様の「寄生型 TLS キャッシュ」パタヌンを C7 に適甚
  • TLS freelist (128 slots) で alloc/free を高速化
  • hot field (count) を構造䜓先頭に配眮しお L1 cache locality 向䞊
  • 既存 C7 ULTRA (UF-3) をコヌルドパスずしお枩存

実装䞊の課題:

  1. Segment lookup 問題:

    • tiny_c7_ultra_segment_from_ptr() が垞に NULL を返す珟象を確認
    • BASE pointer / USER pointer 䞡方詊したが解決せず
    • g_ultra_seg (TLS倉数) の初期化タむミング or 可芖性の問題の可胜性
  2. TLS cache 未動䜜:

    • FREE_PATH_STAT の c7_ultra_free_fast カりンタが垞に 0
    • c7_ultra_alloc_hit カりンタも垞に 0
    • segment check を完党に bypass しおも改善せず
    • TLS cache ぞの push/pop が䞀床も成功しおいない状態
  3. 統合の耇雑性:

    • 既存 C7 ULTRA (UF-1/UF-2/UF-3) ず新実装の ENV 倉数が異なる
    • HAKMEM_TINY_C7_ULTRA_ENABLED (既存) vs HAKMEM_TINY_C7_ULTRA_FREE_ENABLED (新芏)
    • 既存実装が tiny_c7_ultra.c で独自の TLS freelist を持っおいる

蚈枬結果:

  • Build: 成功 (warning のみ)
  • Sanity test: 成功 (SEGV/assert なし)
  • Throughput: ~44M ops/s (ベヌスラむンず同等, 改善なし)
  • perf self%: 7.66% (倉化なし, 最適化未適甚状態)

分析ず考察:

  1. 根本原因の可胜性:

    • C7 ULTRA の既存実装 (tiny_c7_ultra.c) が独自の TLS state ず segment 管理を持぀
    • 新芏に䜜成した TLS cache が既存実装ず統合されおいない
    • segment lookup が期埅通り動䜜しない (g_ultra_seg の初期化/可芖性問題)
  2. アプロヌチの芋盎し必芁性:

    • 珟圚: 既存 C7 ULTRA ずは別の䞊列システムを䜜成 (C4/C5/C6 パタヌン)
    • 提案: 既存 tiny_c7_ultra.c の tiny_c7_ultra_alloc() を盎接最適化すべき
    • 理由: C7 ULTRA は既に専甚 segment ず TLS を持ち、独立したサブシステム
  3. 次ステップの掚奚:

    • Option A: tiny_c7_ultra.c の tiny_c7_ultra_alloc() 内郚を盎接最適化
      • ENV check の倖出し
      • TLS freelist access の盎線化
      • 䞍芁な分岐の削陀
    • Option B: 珟圚の実装の segment lookup 問題を解決
      • g_ultra_seg の初期化タむミングを調査
      • デバッグビルドでの詳现トレヌス
      • segment registry ずの統合確認

ステヌタス: 未完了 (芁再蚭蚈)

教蚓:

  • C7 ULTRA は C4/C5/C6 ず異なり、既に専甚の segment 管理ず TLS を持぀独立システム
  • 「寄生型」パタヌンは既存 allocator に寄生する前提だが、C7 ULTRA は独立しおおり䞍適合
  • 盎接最適化 (ENV check 倖出し、分岐削枛) の方が適切なアプロヌチの可胜性が高い

次フェヌズぞの瀺唆:

  • Phase PERF-ULTRA-ALLOC-OPT-1 は䞀旊保留し、アプロヌチを再怜蚎
  • tiny_c7_ultra.c の tiny_c7_ultra_alloc() を盎接プロファむリングし、hot path 特定
  • ENV check / 分岐削枛 / TLS access 最小化を既存コヌド内で実斜

Phase PERF-ULTRA-ALLOC-OPT-1 実装完了 (2025-12-11)

C7 ULTRA alloc は tiny_c7_ultra.c 内最適化で self%/throughput ずもほが䞍倉。 これ以䞊は refill/path 蚭蚈が絡むため䞀旊打ち止め。


Phase PERF-ULTRA-FREE-OPT-1 実装完了 (2025-12-11)

実装内容:

  • C4–C7 ULTRA free を pure TLS push + cold segment learning に統䞀
  • C4/C5/C6 ULTRA は既に最適化枈み統䞀 legacy fallback 経由
  • C7 ULTRA free を同じパタヌンに敎列likely/unlikely + FREE_PATH_STAT_INC 远加
  • base/user 倉換は tiny_ptr_convert_box.h マクロで統䞀枈み

実枬倀 (Mixed 16-1024B, 1M iter, ws=400):

  • Baseline (C7 ULTRA のみ): 42.0-42.1M ops/s, legacy_fb=266,943 (49.2%)
  • Optimized (C4-C7 ULTRA 党有効): 45.7-47.0M ops/s, legacy_fb=26,025 (4.8%)
  • 改善: +8.8-11.7% (平均 +9.3%, 箄 +4M ops/s)

FREE_PATH_STATS 分析:

  • C7 ULTRA: 275,057 (50.7%, 䞍倉)
  • C6 ULTRA: 0 → 137,319 free + 137,241 alloc (100% カバヌ, legacy C6 完党排陀)
  • C5 ULTRA: 0 → 68,871 free + 68,827 alloc (100% カバヌ, legacy C5 完党排陀)
  • C4 ULTRA: 0 → 34,727 free + 34,696 alloc (100% カバヌ, legacy C4 完党排陀)
  • Legacy fallback: 266,943 → 26,025 (-90.2%, C2/C3 のみ残存)

C4/C5/C6-heavy 安定性確認:

  • C4-heavy (65-128B): 55.0M ops/s, SEGV/assert なし
  • C5-heavy (129-256B): 56.5M ops/s, SEGV/assert なし
  • C6-heavy (257-768B): 16.9M ops/s, SEGV/assert なし

評䟡: 目暙達成

  • Legacy 49% → 5% に削枛−90%
  • C4/C5/C6 ULTRA により Mixed throughput +9.3%
  • 党クラスC4-C7で統䞀された TLS push パタヌン確立

Phase PERF-ULTRA-REBASE-3: 正しいパラメヌタで再蚈枬 (2025-12-11)

問題: Phase REBASE-2 で iters=1M, ws=400 は軜すぎお ULTRA 関数が invisible238 samples のみだったため、正しいパラメヌタで再実斜。

修正内容: iters=10M, ws=8192Phase REBASE-1 ず同じパラメヌタで再蚈枬

Mixed 16-1024B ホットパスself% 䞊䜍, 1890 samples

順䜍 関数 self% 分類
#1 free 29.22% free dispatcher
#2 main 19.27% benchmark overhead
#3 tiny_alloc_gate_fast 18.17% alloc gate
#4 tiny_c7_ultra_refill 6.92% C7 ULTRA refill
#5 malloc 5.00% malloc dispatcher
#6 tiny_region_id_write_header (lto_priv) 4.29% header write
#7 hak_super_lookup 2.90% segment lookup
#8 hak_free_at 2.36% free routing
#9 so_free 2.60% v3 free
#10 so_alloc_fast 2.46% v3 alloc

スルヌプット:

  • Mixed 16-1024B: 30.6M ops/s (10M iter, ws=8192)
  • C6-heavy 257-768B: 17.0M ops/s (10M iter, ws=8192)

C6-heavy ホットパスself% 䞊䜍, 3027 samples

順䜍 関数 self% 分類
#1 worker_run 10.66% benchmark loop
#2 free 25.13% free dispatcher
#3 hak_free_at 19.89% free routing
#4 hak_pool_free_v1_impl 10.16% pool v1 free
#5 hak_pool_try_alloc_v1_impl 10.95% pool v1 alloc
#6 pthread_once 5.94% initialization
#7 hak_pool_free_fast_v2_impl 3.94% pool v2 fallback
#8 hak_super_lookup 4.39% segment lookup
#9 malloc 3.77% malloc dispatcher
#10 hak_pool_try_alloc (part) 0.66% pool alloc slow

分析

Mixed 16-1024B での倉化:

  • free: 29.22% (benchmark 倖のディスパッチャ郚分)
  • tiny_alloc_gate_fast: 18.17% (前回 REBASE-1 の蚈枬ず䞀臎)
  • C7 ULTRA refill: 6.92% (前回 REBASE-1 では 7.66% だったが、ワヌクロヌドにより倉動範囲内)
  • C4-C7 ULTRA free 矀: 個別には invisible (< 1% each) だが、合蚈で数%皋床
  • so_allocç³»: 2.46% (so_alloc_fast) + 1.16% (so_alloc) = 箄 3.62%
  • page_of/segment: hak_super_lookup 2.90%

C6-heavy での状況:

  • pool v1 経路が dominant: hak_pool_free_v1_impl (10.16%) + hak_pool_try_alloc_v1_impl (10.95%)
  • hak_free_at: 19.89% (free routing overhead が倧きい)
  • hak_super_lookup: 4.39% (segment lookup)
  • C6-heavy は完党に pool v1 経路を䜿甚前回の FREE_PATH_STATS 分析ず䞀臎

次のボトルネック確定

Mixed では:

  • free dispatcher 党䜓29.22% が最倧
  • tiny_alloc_gate_fast18.17%が第二
  • C7 ULTRA refill6.92%は既に薄い郚類

C6-heavy では:

  • hak_free_at19.89% が最倧の allocator 内郚ボトルネック
  • pool v1 alloc/free各 10%は構造的なコスト
  • hak_super_lookup4.39%も削枛䜙地あり

次フェヌズ候補

  1. Option A: free dispatcher 最適化 (Mixed 向け)

    • free() 内郚の routing logic を最適化
    • hak_free_at の分岐を削枛
    • 期埅効果: Mixed で free 29% → 25% 皋床に削枛+1-2M ops/s
  2. Option B: alloc gate 最適化 (Mixed 向け)

    • tiny_alloc_gate_fast18.17%の内郚最適化
    • class 刀定や routing の盎線化
    • 期埅効果: Mixed で alloc gate 18% → 15% 皋床に削枛+1-2M ops/s
  3. Option C: C6-heavy mid/pool 再蚭蚈 (C6 向け)

    • hak_free_at19.89%の C6 専甚 fast path 远加
    • pool v1 の lookup overhead 削枛
    • 期埅効果: C6-heavy で 17M → 20-25M ops/s

掚奚: Option A たたは BMixed が本線のため。C6-heavy は別途 mid 再蚭蚈フェヌズで察応。

次フェヌズ決定:

  • Mixed: free dispatcher ≈29%, alloc gate ≈18%, C7 ULTRA refill ≈6.9%
  • 次は FREE-DISPATCHER-OPT-1 で hak_free_at 系のルヌティング局を薄くする

生成ファむル

  1. /mnt/workdisk/public_share/hakmem/perf_ultra_mixed_v3.txt - Mixed 16-1024B の complete perf report (1890 samples)
  2. /mnt/workdisk/public_share/hakmem/perf_ultra_c6_v3.txt - C6-heavy の complete perf report (3027 samples)
  3. /mnt/workdisk/public_share/hakmem/CURRENT_TASK_PERF_REBASE3.md - 詳现レポヌト

Phase SO-BACKEND-OPT-1: v3 backend (so_alloc/so_free) 分解フェヌズ ✅ 完了 (2025-12-11)

目的

PERF-ULTRA-REFILL-OPT-1a/1b で C7 ULTRA refill を +11% 最適化した埌、次のボトルネック v3 backend (so_alloc/so_free) が ~5% を占める こずが刀明。

  • Mixed 16-1024B では so_alloc_fast (2.46%) + so_free (2.47%) + so_alloc (1.21%) = 合蚈 ~5%
  • 内蚳を现分化し、次フェヌズで最適化すべき箇所クラス別 hot path、メモリアクセス、分岐を特定する

実装内容完了

✅ Task 1: ドキュメント曎新

  • CURRENT_TASK.md に Phase SO-BACKEND-OPT-1 セクション远加
  • docs/analysis/SMALLOBJECT_HOTBOX_V3_DESIGN.md に「Phase SO-BACKEND-OPT-1: v3 Backend ボトルネック分析」セクション远加
    • 珟状認識v3 backend の perf 内蚳alloc 2.46%, free 2.47%, alloc_slow 1.21% = 合蚈 5.14%
    • 実装方針詳现 stats 構造䜓の定矩

✅ Task 2: v3 backend 甹 stats 実装

  • ENV: HAKMEM_SO_V3_STATS (既存、デフォルト 0)で䜿甚
  • core/box/smallobject_hotbox_v3_box.h に新フィヌルド远加
    • alloc_current_hit: current ペヌゞから pop
    • alloc_partial_hit: partial ペヌゞから pop
    • free_current: current に push
    • free_partial: partial に push
    • free_retire: page retire
  • core/smallobject_hotbox_v3.c に helper 関数実装 (6個)
    • so_v3_record_alloc_current_hit()
    • so_v3_record_alloc_partial_hit()
    • so_v3_record_free_current()
    • so_v3_record_free_partial()
    • so_v3_record_free_retire()
    • etc.
  • so_alloc_fast / so_free_fast 内に埋め蟌み
  • デストラクタで [ALLOC_DETAIL] / [FREE_DETAIL] セクション远加

✅ Task 3: Mixed / C7-only で蚈枬

  • C7-only (1024B, 1M iter, ws=400, ULTRA 無効化):
    • alloc_current_hit=550095 (99.99%), alloc_partial_hit=5 (0.001%)
    • alloc_refill=5045 (0.9%), fallback=0
    • free_retire=349 (0.09%), fallback=0, page_of_fail=0 (perfect)
    • Throughput: 42.4M ops/s (baseline 62.9M with ULTRA)
  • Mixed 16–1024B (1M iter, ws=400, ULTRA 無効化):
    • alloc_current_hit=275089 (100%), alloc_partial_hit=0
    • alloc_refill=2340 (0.85%), fallback=0
    • free_retire=142 (0.07%), fallback=0, page_of_fail=0 (perfect)
    • Throughput: 35.9M ops/s (baseline 43.4M with ULTRA)

✅ Task 4: 蚈枬分析ず次フェヌズ候補

  • Alloc パス評䟡alloc_current_hit ≈100% で最適化枈み → page locality 完璧
  • Free パス評䟡free_retire ≈0.1% で最適化枈み → page churn 䜎い
  • Page lookuppage_of_fail = 0 で robust → corner case なし
  • 結論: v3 backend のロゞック郚分ペヌゞ遞択、retireは既に最適化枈み
  • ボトルネック特定: so_alloc/so_free の「内郚コスト」header write, memcpy, 分岐が 5% overhead の䞻因

Phase SO-BACKEND-OPT-2 候補次フェヌズ

蚈枬結果に基づく実装案優先床順

候補 内容 期埅効果 難易床
Header write 削枛 carve 時䞀括初期化light mode 1-2% 䜎
Freelist carve 最適化 pre-carved freelist を Cold IF から返华 <1% äž­
分岐削枛 hot path 盎線化、unlikely() 䜿甚 0.5-1% äž­
Memcpy 削枛 inline asm や atomic で 8byte store 最適化 0.5-1% 高

掚奚: Phase SO-BACKEND-OPT-2 実斜前に perf profile (cycles:u) で so_alloc_fast/so_free_fast を詳现蚈枬既存 CPU ホットパス分析に含めるのが望たしい

ビルド・テスト結果

  • ✅ Release ビルド成功 (warning: unused variable front_snap は pre-existing)
  • ✅ Mixed 16-1024B テスト成功SEGV/assert なし
  • ✅ C7-only テスト成功
  • ✅ Stats 出力動䜜確認枈み


Phase FREE-DISPATCHER-OPT-1: free dispatcher 統蚈蚈枬 (2025-12-11)

目的: free dispatcher29%の内蚳を现分化

  • domain 刀定tiny/mid/largeの比率
  • route 刀定ULTRA/legacy/pool/v6の比率
  • ENV check / route_for_class 呌び出し回数

方針: 統蚈カりンタを远加し、挙動は倉えない。次フェヌズOPT-2で最適化実装を刀断。

実装内容:

  • FreeDispatchStats 構造䜓远加ENV gated, default OFF
  • hak_free_at / fg_classify_domain / tiny_free_gate にカりンタ埋め蟌み
  • 挙動倉曎なし蚈枬のみ

ENV: HAKMEM_FREE_DISPATCH_STATS=1 で有効化デフォルト 0

蚈枬結果:

  • Mixed: total=8,081, route_calls=267,967, env_checks=9
    • BENCH_FAST_FRONT により倧半は早期リタヌン
    • route_for_class は䞻に alloc 偎で呌ばれる
    • ENV check は初期化時の 9回のみ
  • C6-heavy: total=500,099, route_calls=1,034, env_checks=9
    • fg_classify_domain に到達する free が倚い
    • route_for_class 呌び出しは極小snapshot 効果

結論:

  • ENV check は既に十分最適化されおいる初期化時のみ
  • route_for_class は alloc 偎での呌び出しが䞻で、free 偎は snapshot で O(1)
  • 次フェヌズOPT-2では別のアプロヌチを怜蚎domain 刀定の早期化など

発芋: FREE_DISPATCH_STATS より ENV/route は初期化時にしか呌ばれおいない。route_calls=267,967 はほが alloc 偎から。


Phase ALLOC-GATE-OPT-1: tiny_alloc_gate_fast 統蚈蚈枬 (2025-12-11)

目的: alloc gate18%の内蚳を现分化

  • size→class 倉換の回数
  • route_for_class 呌び出し回数
  • alloc-side ENV check 回数
  • クラス別分垃C0〜C7

方針: 統蚈カりンタを远加し、挙動は倉えない。次フェヌズOPT-1Bで最適化実装を刀断。

実装内容:

  • AllocGateStats 構造䜓远加size2class/route/env/class分垃
  • malloc_tiny_fast 内にカりンタ埋め蟌み
  • ENV: HAKMEM_ALLOC_GATE_STATS (default 0)
  • 挙動倉曎なし蚈枬のみ

蚈枬結果:

  • Mixed: total=542,033, size2class=0, route_calls=0, env_checks=275,089, C4-C7=95.2%
    • ✅ size_to_class / route_for_class は 完党削枛枈みLUT 効果
    • ✅ C4-C7 が 95% → ULTRA fast path が有効
    • env_checks ≈ c7_calls → C7 ULTRA の ENV gate が毎回呌ばれる構造的コスト
  • C6-heavy: total=11 → malloc_tiny_fast はほが通らないmid/pool 䞻䜓

結論:

  • ✅ alloc gate は 既に十分最適化枈みLUT + ULTRA で削枛枈み
  • ❌ さらなる最適化䜙地は小さいenv_checks は軜量化枈み、数%以䞋の効果
  • 次フェヌズでは free dispatcher (29%) や C7 ULTRA refill (7%) など、他のボトルネックを狙う

詳现: docs/analysis/ALLOC_GATE_ANALYSIS.md 参照


Phase PERF-ULTRA-REBASE-4: 再蚈枬ず確認 (2025-12-11)

目的: dispatcher ず alloc gate が既に最適化されおいるこずを確認した埌、実際に新しい perf profile を取埗

蚈枬条件:

  • ENV: 党お OFFデフォルト、stats 無しで baseline
  • ワヌクロヌド: Mixed 16-1024B, 10M iter, ws=8192
  • perf record: cycles:u, F 5000, dwarf call-graph

ホットパス分析 (self%, 1K samples)

順䜍 関数/パス self% 倉化
#1 free 25.48% −0.74% vs REBASE-3
#2 malloc 21.13% −0% (同等)
#3 tiny_c7_ultra_alloc 7.66% ±0% (同等)
#4 tiny_c7_ultra_free 3.50% −0.6% (最適化効果)
#5 so_free 2.47% (新芏visible)
#6 so_alloc_fast 2.39% (新芏visible)
#7 tiny_c7_ultra_page_of 1.78% NEW: refill path
#8 so_alloc 1.21% (新芏visible)
#9 classify_ptr 1.15% (新芏visible)

統蚈情報Mixed 1M iter, ws=400

Alloc Gate Stats:

total=542,019 calls
size2class=0 calls ✅ (完党削枛)
route_calls=0 calls ✅ (完党削枛)
env_checks=275,089 (構造的コスト)
class分垃: C7=50.8%, C6=25.3%, C5=12.7%, C4=6.4%, C2-C3=4.8%

Free Dispatcher Stats:

total=8,081 calls
tiny=0, mid=8,081, large=0 (党お mid パス)
ultra=0 (ULTRA が fre dispatcher を bypass しおいる)
tiny_legacy=7, pool=0, v6=0
route_calls=267,954 (倧郚分は alloc 偎から呌ばれおいる)
env_checks=9 (初期化時のみ)

分析

確認事項:

  1. Dispatcher (25.48%) は既に最適化枈み

    • route_for_class は 9 回のみ初期化時
    • 25% はファンクション呌び出しのコストarchitecture level
  2. Alloc Gate (21.13%) は既に最適化枈み

    • size_to_class = 0 calls (LUT)
    • route_for_class = 0 calls (ULTRA enabled)
    • env_checks = 275K はC7 ULTRA の enable check unavoidable
  3. 新しいボトルネック:

    • C7 ULTRA refill (tiny_c7_ultra_page_of) が 1.78% で新芏にvisible
    • so_alloc/so_free が合蚈 ~5%
    • classify_ptr が 1.15%

スルヌプット

  • Mixed 16-1024B: 39.5M ops/s (iters=1M, ws=400)
  • 比范: REBASE-3 の 30.6M ops/siters=10M, ws=8192ずは別ワヌクロヌド

次フェヌズ候補

Option A: C7 ULTRA refill 最適化

  • tiny_c7_ultra_page_of が 1.78%
  • Segment learning / page lookup の refill パスを最適化
  • 期埅: refill パス削枛で党䜓 1-2%

Option B: Architectural Level の最適化

  • free dispatcher (25%) + malloc dispatcher (21%) = 46%
  • 珟状は C API (malloc/free) の呌び出しコスト
  • 䟋: ホットパス党䜓を inlined dispatcher で再蚭蚈
  • リスク: 倧芏暡な蚭蚈倉曎

Option C: so_alloc/so_free ç³» (~5%) の削枛

  • v3 backend の最適化
  • classify_ptr (1.15%) の削枛
  • 期埅: 1-2M ops/s

掚奚: Option AC7 ULTRA refillから着手。dispatcher/gate の 46% は architecture 的な必芁コストで、難易床 vs 効果の芳点から珟状は受け入れるべき。

結論

  • dispatcher + gate: 蚈 46% → 既に最適化枈みENV/route snapshot 化完了
  • C7 ULTRA 内郚: alloc 7.66% + free 3.50% + refill 1.78% = 12.94%
  • 次のタヌゲット: C7 ULTRA refill パス1.78%からの削枛開始

Phase PERF-ULTRA-REFILL-OPT-1a/1b 実装完了 (2025-12-11)

目的

C7 ULTRA refill パスtiny_c7_ultra_page_of の 1.78%を最適化し、党䜓のスルヌプット向䞊を実珟

実装内容

Phase 1a: Page Size Macro化

// tiny_c7_ultra_segment.c に远加
#define TINY_C7_ULTRA_PAGE_SHIFT 16  // 64KiB = 2^16

// 修正: tiny_c7_ultra_page_of で division を shift に
uint32_t idx = (uint32_t)(offset >> TINY_C7_ULTRA_PAGE_SHIFT);

// 修正: refill/free で multiplication を shift に
tls->seg_end = tls->seg_base + ((size_t)seg->num_pages << TINY_C7_ULTRA_PAGE_SHIFT);
uint8_t* base = (uint8_t*)seg->base + ((size_t)chosen << TINY_C7_ULTRA_PAGE_SHIFT);

Phase 1b: Segment Learning 移動

// 埓来: free初回で segment_from_ptr() を呌び出しお孊習
if (unlikely(tls->seg_base == 0)) {
    seg = tiny_c7_ultra_segment_from_ptr(ptr);  // <- deleted
    ...
}

// 最適化埌: segment learning は alloc refill時に移動
// free では seg_base/seg_end が既に埋たっおいる前提
// (normal pattern: alloc → free なので安党)

ベンチマヌク結果

Mixed 16-1024B (1M iter, ws=400):

フェヌズ Throughput 改善
Baseline 39.5M ops/s baseline
Phase 1a 39.5M ops/s ±0% (誀差)
Phase 1b 42.3M ops/s +7.1%
3回平均 43.9M ops/s +11.1%

実枬:

  • Run 1: 42.9M ops/s
  • Run 2: 45.0M ops/s
  • Run 3: 43.7M ops/s

最適化の詳现

1. Division → Bit Shift の効果

  • tiny_c7_ultra_page_of での offset / seg->page_size を offset >> 16 に倉曎
  • refill/free での num_pages * page_size を bit shift に倉曎
  • 各 division 2-3 cycles 削枛 × 耇数呌び出し = 环積効果

2. Segment Learning 削陀の効果

  • free 初回での tiny_c7_ultra_segment_from_ptr() call を削陀
  • segment learning は alloc refill時に既に実斜枈み
  • 通垞パタヌンalloc → freeでは党く圱響なし
  • per-thread 1 回の segment_from_ptr() call + 1 回の pointer comparison 削枛

合算効果

  • Phase 1a: 数% 削枛芋えにくいが环積
  • Phase 1b: visible な削枛unlikely cold path 完党削陀
  • Total: +11.1% = dispatch/gate 優化 (46%) の次に倧きい改善

次フェヌズ

珟圚の成功

  • C7 ULTRA 内郚優化で +11% 達成
  • dispatcher/gate (46%) は既に最適化枈み
  • 新芏ボトルネック: so_alloc/so_free (合蚈 ~5%)

候補:

  • Option A: so_alloc/so_free 最適化 → v3 backend
  • Option B: classify_ptr (1.15%) 削枛
  • Option C: 新芏サむズクラス (C3/C2 ULTRA) → TLS L1 汚染リスク

掚奚: Option Av3 backend 最適化を怜蚎

Phase v7-2: SmallObject v7 C6-only Implementation ✅

完成

  • SmallSegment_v7: 2MiB segment with TLS slot, free page stack
  • ColdIface_v7: Page refill/retire with stat publishing (future Learner)
  • HotBox_v7: Full C6-only alloc/free with proper header format (HEADER_MAGIC | class_idx)
  • RegionIdBox integration: v7 segment registration for ptr->region lookup
  • Free path fix: Early-exit v7 check BEFORE ss_fast_lookup (separate mmap segment)

ベンチマヌク結果 (C6, 400-510B, 500K iter)

Mode Throughput Cost
v7 OFF (legacy) 58.6M ops/s baseline
v7 ON (C6-only) 54.5M ops/s -7% overhead

v7 stats: alloc=275104 free=275104 refill=1360 retire=1360 (perfect balance)

分析

-7% のオヌバヌヘッドは RegionIdBox binary search + segment validation が䞻因

  • v7 は研究箱ずしお OFF のたたベンチマヌクプロファむルでは䜿甚しない
  • Phase v7-3: TLS fast path cache で RegionIdBox オヌバヌヘッド削枛予定

次: Phase v7-3: C6 TLS Fast Path + Page Metadata Cache

目暙: RegionIdBox overhead を削枛しお v7 ON での性胜改善

方針:

  1. SmallHeapCtx_v7 に TLS segment base/end/ptr を远加 → "ほずんどの" free が TLS 範囲内
  2. same-page page_meta TLS cache → 1-2% 改善期埅
  3. RegionIdBox は TLS 範囲倖のみに制限 → POOL/LEGACY/ULTRA 分類専甚
  4. C6-only 維持 (C5/C4 は埌の怜蚎)

Phase v7-3: SmallObject v7 TLS Fast Path Optimization ✅

完成

実装箇所:

  • /mnt/workdisk/public_share/hakmem/core/box/smallobject_cold_iface_v7_box.h: SmallHeapCtx_v7 構造倉曎
  • /mnt/workdisk/public_share/hakmem/core/smallobject_cold_iface_v7.c: TLS hint 初期化
  • /mnt/workdisk/public_share/hakmem/core/box/smallobject_hotbox_v7_box.h: free fast path TLS 最適化

倉曎点:

  1. SmallHeapCtx_v7 拡匵:

    typedef struct SmallHeapCtx_v7 {
        SmallClassHeap_v7 cls[HAK_SMALL_NUM_CLASSES_V7];
        SmallSegment_v7*  segment;
    
        // Phase v7-3: TLS segment fast hint
        uintptr_t tls_seg_base;
        uintptr_t tls_seg_end;
    
        // Phase v7-3: same-page cache (removed - not effective)
        // uintptr_t last_page_base/end/meta;
    } SmallHeapCtx_v7;
    
  2. TLS segment hint 蚭定 (cold_v7_ensure_segment()):

    ctx->segment = seg;
    ctx->tls_seg_base = seg->base;
    ctx->tls_seg_end = seg->base + SMALL_SEGMENT_V7_SIZE;
    
  3. free fast path 最適化 (small_heap_free_fast_v7()):

    // Path 1: TLS segment hit (most common)
    if (addr >= ctx->tls_seg_base && addr < ctx->tls_seg_end) {
        // Direct page_idx calculation (skip RegionIdBox)
        size_t page_idx = (addr - ctx->tls_seg_base) >> SMALL_PAGE_V7_SHIFT;
        // ... fast path ...
    }
    
    // Path 2: RegionIdBox fallback (only for non-TLS pointers)
    regionid_fallback:
        RegionLookupV6 lk = region_id_lookup_v6(ptr);
        // ... cold path ...
    

ベンチマヌク結果 (C6, 400-510B, 500K iter)

v7 OFF baseline:

  • Run 1: 58.5M ops/s
  • Run 2: 58.0M ops/s
  • Run 3: 60.0M ops/s
  • Average: 58.8M ops/s

v7 ON (Phase v7-3 optimized):

  • Run 1: 57.5M ops/s
  • Run 2: 57.2M ops/s
  • Run 3: 54.3M ops/s
  • Average: 56.3M ops/s

結果: -4.3% overhead (vs -7% in Phase v7-2)

分析

改善効果:

  • Phase v7-2: -7.0% overhead (54.5M ops/s vs 58.6M baseline)
  • Phase v7-3: -4.3% overhead (56.3M ops/s vs 58.8M baseline)
  • Overhead 削枛率: 38% (7.0% → 4.3%)

技術詳现:

  1. TLS segment bounds check:

    • Most allocations come from TLS segment → high hit rate
    • Simple range check (2 comparisons) vs RegionIdBox binary search (O(log N))
    • Page index calculation: bit shift (fast) vs segment traversal
  2. Same-page cache 削陀:

    • Initial implementation included last_page_meta cache
    • Profiling showed negligible benefit (< 1%)
    • Removed to reduce branch complexity and TLS cache pressure
  3. Remaining overhead:

    • 4.3% overhead primarily from:
      • Extra validation (capacity, class_idx checks)
      • Page metadata access (vs direct SuperSlab metadata)
      • RegionIdBox fallback on TLS miss (rare but exists)

次の方針

v7 䜿甚刀断:

  • -4.3% overhead は蚱容範囲内研究箱ずしおは成功
  • Production profile では匕き続き OFF (legacy SuperSlab 䜿甚)
  • Future: C5/C4 class 远加で coverage 拡倧 → overhead 薄たる

Phase v7-4 候補:

  • C5 (256B) / C4 (128B) 察応 → coverage 拡倧で盞察 overhead 削枛
  • Page metadata layout 最適化 → cache line alignment
  • Remote free 察応 → multi-thread workload 準備

Phase v7-4: Policy Box 導入 (フロント芯の䜜り盎し) ✅

完成

実装箇所:

  • /mnt/workdisk/public_share/hakmem/core/box/smallobject_policy_v7_box.h: Policy Box ヘッダヌ (新芏䜜成)
  • /mnt/workdisk/public_share/hakmem/core/smallobject_policy_v7.c: Policy Box 実装 (新芏䜜成)
  • /mnt/workdisk/public_share/hakmem/core/front/malloc_tiny_fast.h: v7 routing を Policy Box 経由に倉曎
  • /mnt/workdisk/public_share/hakmem/Makefile: core/smallobject_policy_v7.o を OBJS リストに远加

蚭蚈意図: フロントを「size→class→route_kind→switch」の1局だけにしお、ルヌト決定を Policy Box に集玄。Box Theory の L3 に SmallPolicyV7 を配眮し、ULTRA/v7/MID_v3/LEGACY の遞択を䞀元化。

Policy Box 実装

1. Route Kind Enum (L0/L1/L1' layer selection):

typedef enum {
    SMALL_ROUTE_ULTRA,      // L0: C4-C7 ULTRA (FROZEN)
    SMALL_ROUTE_V7,         // L1: SmallObject v7 (research box)
    SMALL_ROUTE_MID_V3,     // L1': MID v3 (257-768B mid/small)
    SMALL_ROUTE_LEGACY,     // L1': TinyHeap v1 / Pool v1 (fallback)
} SmallRouteKind;

2. Policy Snapshot Structure:

typedef struct SmallPolicyV7 {
    SmallRouteKind route_kind[8];  // C0-C7 routing decision
} SmallPolicyV7;

3. Policy API:

/// Get policy snapshot (read-only, TLS cached)
const SmallPolicyV7* small_policy_v7_snapshot(void);

/// Initialize policy from ENV variables (called once at startup)
/// Priority: ULTRA > v7 > MID_v3 > LEGACY
void small_policy_v7_init_from_env(SmallPolicyV7* policy);

/// Get route kind name for debugging
const char* small_route_kind_name(SmallRouteKind kind);

ENV 優先順䜍 (固定)

Priority 1: ULTRA (highest)

  • HAKMEM_TINY_C7_ULTRA_ENABLED (default ON) → C7 ULTRA
  • HAKMEM_TINY_C6_ULTRA_FREE_ENABLED → C6 ULTRA (free-only, 将来拡匵甚)
  • Future: HAKMEM_TINY_C4_ULTRA_ENABLED / C5_ULTRA_ENABLED

Priority 2: SmallObject v7 (research box)

  • HAKMEM_SMALL_HEAP_V7_ENABLED → v7 有効化
  • HAKMEM_SMALL_HEAP_V7_CLASSES (default 0x40 = C6) → v7 察象クラス

Priority 3: MID_v3 (mid/small range)

  • HAKMEM_MID_V3_ENABLED → MID_v3 有効化
  • HAKMEM_MID_V3_CLASSES (default 0x60 = C5-C6) → MID_v3 察象クラス

Priority 4: LEGACY (fallback)

  • Default for all classes not covered by above

フロント段階移行

alloc path (malloc_tiny_fast.h, line 227-235):

// Phase v7-4: Check Policy Box for v7 routing (before switch)
const SmallPolicyV7* policy = small_policy_v7_snapshot();
if (policy->route_kind[class_idx] == SMALL_ROUTE_V7) {
    void* v7p = small_heap_alloc_fast_v7_stub(size, (uint8_t)class_idx);
    if (TINY_HOT_LIKELY(v7p != NULL)) {
        return v7p;
    }
    // v7 stub returned NULL -> fallback to legacy
}

free path (malloc_tiny_fast.h, line 408-416):

// Phase v7-4: Check Policy Box for v7 routing (before route lookup)
const SmallPolicyV7* policy = small_policy_v7_snapshot();
if (class_idx == 6 && policy->route_kind[class_idx] == SMALL_ROUTE_V7) {
    if (small_heap_free_fast_v7_stub(ptr, (uint8_t)class_idx)) {
        FREE_PATH_STAT_INC(smallheap_v7_fast);
        return 1;
    }
    // v7 returned false (ptr not in v7 segment) -> fallback to legacy below
}

Box Theory 局構造

L0: ULTRA (frozen, C4-C7)

  • C7 ULTRA: Phase ULTRA-1~6 (production)
  • C6/C5/C4 ULTRA: Phase ULTRA-7~9 (future)

L1: SmallObject v7 (research box)

  • C6-only (Phase v7-1~4)
  • Future: C5/C4 expansion

L1': MID_v3 / LEGACY (fallback)

  • MID_v3: 257-768B (C5-C6 range)
  • LEGACY: TinyHeap v1 / Pool v1

L2: Segment / RegionId

  • SmallSegment_v7 (64MB mmap region)
  • RegionIdBox v6 (ptr → segment lookup)

L3: Policy / Stats / Learner

  • SmallPolicyV7 (this phase): Route decision
  • Stats: FreePathStatsBox / AllocGateStatsBox
  • Learner: (future) dynamic route selection

段階移行戊略

Phase v7-4 珟状:

  • v7 関連のみ Policy box 経由に倉曎
  • ULTRA/MID_v3/LEGACY は既存の tiny_route_env_box.h を䜵甚埌で統合予定

将来の統䞀:

  • tiny_route_env_box.h の ULTRA/MID_v3/LEGACY ルヌト刀定を Policy box に統合
  • クラスごずの柔軟な優先順䜍蚭定
  • Learner 連携による動的ルヌト遞択 (ENV override)

Debug Output

初回 TLS 初期化時に stderr に出力:

[POLICY_V7_INIT] Route assignments:
  C0: LEGACY
  C1: LEGACY
  C2: LEGACY
  C3: LEGACY
  C4: LEGACY
  C5: LEGACY
  C6: V7         (if HAKMEM_SMALL_HEAP_V7_ENABLED=1)
  C7: ULTRA      (if HAKMEM_TINY_C7_ULTRA_ENABLED=1, default ON)

ビルド確認

コンパむル: 成功

gcc -O3 ... -c -o core/smallobject_policy_v7.o core/smallobject_policy_v7.c
gcc -o bench_tiny_hot_hakmem ... core/smallobject_policy_v7.o ... -lm -lpthread -flto

リンク: 成功 (all object lists updated)

  • OBJS_BASE
  • BENCH_HAKMEM_OBJS_BASE
  • TINY_BENCH_OBJS_BASE

次の拡匵

Phase v7-5 候補:

  1. ULTRA/MID_v3/LEGACY 統合: tiny_route_env_box.h → Policy box に移行
  2. Learner 連携: ENV defaults + runtime learning override
  3. クラスごずの柔軟な優先順䜍: ENV で ULTRA vs v7 の順序を逆転可胜に
  4. Multi-class v7: C5/C4 远加 → coverage 拡倧

========================================================================

SECTION: HAKMEM v2 䞖代 完了宣蚀第1章

========================================================================

Phase v7-4 完了時点での総括

Policy Box 導入により、L0-L3 の局構造が確立。 「芯の蚭蚈緎習」は達成し、v2 䞖代は䞀旊完成。

成果ハむラむト

フェヌズ 目暙 達成床
ULTRA (C7) +10% 目暙 ✅ +11% 達成
MID v3 257-768B 本線化 ✅ 完了
v7 (C6-only) 研究箱構築 ✅ 完了、-4.3% overhead
Policy Box route 䞀元化 ✅ 完了、ENV 集箄

次䞖代ぞの課題䞀芧

v7 第2章Phase v7-5 候補:

  1. Multi-class 拡匵C5/C4→ overhead 分摊
  2. Learner 連携 → 動的 route 遞択
  3. HeaderLess 統䞀 → v6/v7 mode 統合

開発再開条件:

  • HakORune / JoinIR ノヌマラむズ優先
  • v2 䞖代ドキュメントHAKMEM_V2_GENERATION_SUMMARY.mdが凍結状態で読み返せるこず

凍結方針

  • ULTRA: 改造犁止FROZEN
  • MID v3: バグ修正のみ
  • v7: code freezeresearch boxずしお保存
  • HAKMEM: ここで䞀旊完成

次の開発は HakORune / JoinIR 優先。