diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index e7ac82c8..60f2846f 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -127,6 +127,19 @@ - **テスト**: Mixed 16–1024B で 43.0–43.8M ops/s(変化なし)、SEGV/assert なし - **目標**: v5-1 で C6-only stub → v5-2 で本実装 → v5-3 で Mixed に段階昇格 +5. **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 で本実装を追加。 + --- ### 5. 健康診断ラン(必ず最初に叩く 2 本) diff --git a/Makefile b/Makefile index 47b50ee6..40e0b837 100644 --- a/Makefile +++ b/Makefile @@ -427,7 +427,7 @@ test-box-refactor: box-refactor ./larson_hakmem 10 8 128 1024 1 12345 4 # Phase 4: Tiny Pool benchmarks (properly linked with hakmem) -TINY_BENCH_OBJS_BASE = hakmem.o hakmem_config.o hakmem_tiny_config.o hakmem_ucb1.o hakmem_bigcache.o hakmem_pool.o hakmem_l25_pool.o hakmem_site_rules.o hakmem_tiny.o core/box/ss_allocation_box.o superslab_stats.o superslab_cache.o superslab_ace.o superslab_slab.o superslab_backend.o core/superslab_head_stub.o hakmem_smallmid.o core/box/superslab_expansion_box.o core/box/integrity_box.o core/box/mailbox_box.o core/box/front_gate_box.o core/box/front_gate_classifier.o core/box/free_publish_box.o core/box/capacity_box.o core/box/carve_push_box.o core/box/prewarm_box.o core/box/ss_hot_prewarm_box.o core/box/front_metrics_box.o core/box/bench_fast_box.o core/box/ss_addr_map_box.o core/box/slab_recycling_box.o core/box/pagefault_telemetry_box.o core/box/tiny_sizeclass_hist_box.o core/box/tiny_env_box.o core/box/tiny_route_box.o core/box/tiny_page_box.o core/box/tiny_class_policy_box.o core/box/tiny_class_stats_box.o core/box/tiny_policy_learner_box.o core/box/ss_budget_box.o core/box/tiny_mem_stats_box.o core/box/c7_meta_used_counter_box.o core/box/wrapper_env_box.o core/box/madvise_guard_box.o core/box/libm_reloc_guard_box.o core/box/ptr_trace_box.o core/box/link_missing_stubs.o core/box/super_reg_box.o core/box/shared_pool_box.o core/box/remote_side_box.o core/page_arena.o core/front/tiny_unified_cache.o tiny_sticky.o tiny_remote.o tiny_publish.o tiny_debug_ring.o hakmem_tiny_magazine.o hakmem_tiny_stats.o hakmem_tiny_sfc.o hakmem_tiny_query.o hakmem_tiny_rss.o hakmem_tiny_registry.o hakmem_tiny_remote_target.o hakmem_tiny_bg_spill.o tiny_adaptive_sizing.o hakmem_super_registry.o hakmem_shared_pool.o hakmem_shared_pool_acquire.o hakmem_shared_pool_release.o hakmem_elo.o hakmem_batch.o hakmem_p2.o hakmem_sizeclass_dist.o hakmem_evo.o hakmem_debug.o hakmem_sys.o hakmem_whale.o hakmem_policy.o hakmem_ace.o hakmem_ace_stats.o hakmem_prof.o hakmem_learner.o hakmem_size_hist.o hakmem_learn_log.o hakmem_syscall.o hakmem_ace_metrics.o hakmem_ace_ucb1.o hakmem_ace_controller.o tiny_fastcache.o core/tiny_alloc_fast_push.o core/tiny_c7_ultra_segment.o core/tiny_c7_ultra.o core/link_stubs.o core/tiny_failfast.o core/tiny_destructors.o core/smallobject_hotbox_v3.o core/smallobject_hotbox_v4.o +TINY_BENCH_OBJS_BASE = hakmem.o hakmem_config.o hakmem_tiny_config.o hakmem_ucb1.o hakmem_bigcache.o hakmem_pool.o hakmem_l25_pool.o hakmem_site_rules.o hakmem_tiny.o core/box/ss_allocation_box.o superslab_stats.o superslab_cache.o superslab_ace.o superslab_slab.o superslab_backend.o core/superslab_head_stub.o hakmem_smallmid.o core/box/superslab_expansion_box.o core/box/integrity_box.o core/box/mailbox_box.o core/box/front_gate_box.o core/box/front_gate_classifier.o core/box/free_publish_box.o core/box/capacity_box.o core/box/carve_push_box.o core/box/prewarm_box.o core/box/ss_hot_prewarm_box.o core/box/front_metrics_box.o core/box/bench_fast_box.o core/box/ss_addr_map_box.o core/box/slab_recycling_box.o core/box/pagefault_telemetry_box.o core/box/tiny_sizeclass_hist_box.o core/box/tiny_env_box.o core/box/tiny_route_box.o core/box/tiny_page_box.o core/box/tiny_class_policy_box.o core/box/tiny_class_stats_box.o core/box/tiny_policy_learner_box.o core/box/ss_budget_box.o core/box/tiny_mem_stats_box.o core/box/c7_meta_used_counter_box.o core/box/wrapper_env_box.o core/box/madvise_guard_box.o core/box/libm_reloc_guard_box.o core/box/ptr_trace_box.o core/box/link_missing_stubs.o core/box/super_reg_box.o core/box/shared_pool_box.o core/box/remote_side_box.o core/page_arena.o core/front/tiny_unified_cache.o tiny_sticky.o tiny_remote.o tiny_publish.o tiny_debug_ring.o hakmem_tiny_magazine.o hakmem_tiny_stats.o hakmem_tiny_sfc.o hakmem_tiny_query.o hakmem_tiny_rss.o hakmem_tiny_registry.o hakmem_tiny_remote_target.o hakmem_tiny_bg_spill.o tiny_adaptive_sizing.o hakmem_super_registry.o hakmem_shared_pool.o hakmem_shared_pool_acquire.o hakmem_shared_pool_release.o hakmem_elo.o hakmem_batch.o hakmem_p2.o hakmem_sizeclass_dist.o hakmem_evo.o hakmem_debug.o hakmem_sys.o hakmem_whale.o hakmem_policy.o hakmem_ace.o hakmem_ace_stats.o hakmem_prof.o hakmem_learner.o hakmem_size_hist.o hakmem_learn_log.o hakmem_syscall.o hakmem_ace_metrics.o hakmem_ace_ucb1.o hakmem_ace_controller.o tiny_fastcache.o core/tiny_alloc_fast_push.o core/tiny_c7_ultra_segment.o core/tiny_c7_ultra.o core/link_stubs.o core/tiny_failfast.o core/tiny_destructors.o core/smallobject_hotbox_v3.o core/smallobject_hotbox_v4.o core/smallobject_hotbox_v5.o TINY_BENCH_OBJS = $(TINY_BENCH_OBJS_BASE) ifeq ($(POOL_TLS_PHASE1),1) TINY_BENCH_OBJS += pool_tls.o pool_refill.o core/pool_tls_arena.o pool_tls_registry.o pool_tls_remote.o diff --git a/core/box/smallobject_hotbox_v5_box.h b/core/box/smallobject_hotbox_v5_box.h index 9f513c1f..e684461d 100644 --- a/core/box/smallobject_hotbox_v5_box.h +++ b/core/box/smallobject_hotbox_v5_box.h @@ -40,8 +40,8 @@ typedef struct SmallHeapCtxV5 { // API SmallHeapCtxV5* small_heap_ctx_v5(void); -// Fast path(将来実装) -void* small_alloc_fast_v5(size_t size, uint32_t class_idx); -void small_free_fast_v5(void* ptr, uint32_t class_idx); +// Fast path(Phase v5-1: C6-only route stub, v1/pool fallback) +void* small_alloc_fast_v5(size_t size, uint32_t class_idx, SmallHeapCtxV5* ctx); +void small_free_fast_v5(void* ptr, uint32_t class_idx, SmallHeapCtxV5* ctx); #endif // HAKMEM_SMALLOBJECT_HOTBOX_V5_BOX_H diff --git a/core/box/tiny_route_env_box.h b/core/box/tiny_route_env_box.h index a0f5f27a..c1cd9b8d 100644 --- a/core/box/tiny_route_env_box.h +++ b/core/box/tiny_route_env_box.h @@ -11,6 +11,7 @@ #include "smallobject_hotbox_v3_env_box.h" #include "smallobject_hotbox_v4_env_box.h" +#include "smallobject_v5_env_box.h" typedef enum { TINY_ROUTE_LEGACY = 0, @@ -18,6 +19,7 @@ typedef enum { TINY_ROUTE_HOTHEAP_V2 = 2, // TinyHotHeap v2 TINY_ROUTE_SMALL_HEAP_V3 = 3, // SmallObject HotHeap v3 (C7-first,研究箱) TINY_ROUTE_SMALL_HEAP_V4 = 4, // SmallObject HotHeap v4 (stub, route未使用) + TINY_ROUTE_SMALL_HEAP_V5 = 5, // SmallObject HotHeap v5 (C6-only route stub, Phase v5-1) } tiny_route_kind_t; extern tiny_route_kind_t g_tiny_route_class[TINY_NUM_CLASSES]; @@ -25,7 +27,10 @@ extern int g_tiny_route_snapshot_done; static inline void tiny_route_snapshot_init(void) { for (int i = 0; i < TINY_NUM_CLASSES; i++) { - if (small_heap_v4_class_enabled((uint8_t)i)) { + // Phase v5-1: C6-only v5 route stub (before v4 check) + if (i == 6 && small_heap_v5_class_enabled(6)) { + g_tiny_route_class[i] = TINY_ROUTE_SMALL_HEAP_V5; + } else if (small_heap_v4_class_enabled((uint8_t)i)) { g_tiny_route_class[i] = TINY_ROUTE_SMALL_HEAP_V4; } else if (small_heap_v3_class_enabled((uint8_t)i)) { g_tiny_route_class[i] = TINY_ROUTE_SMALL_HEAP_V3; @@ -54,7 +59,8 @@ static inline int tiny_route_is_heap_kind(tiny_route_kind_t route) { return route == TINY_ROUTE_HEAP || route == TINY_ROUTE_HOTHEAP_V2 || route == TINY_ROUTE_SMALL_HEAP_V3 || - route == TINY_ROUTE_SMALL_HEAP_V4; + route == TINY_ROUTE_SMALL_HEAP_V4 || + route == TINY_ROUTE_SMALL_HEAP_V5; } // C7 front が TinyHeap を使うか(Route snapshot 経由で判定) diff --git a/core/front/malloc_tiny_fast.h b/core/front/malloc_tiny_fast.h index 510c437d..93894f66 100644 --- a/core/front/malloc_tiny_fast.h +++ b/core/front/malloc_tiny_fast.h @@ -42,6 +42,7 @@ #include "../box/tiny_hotheap_v2_box.h" // TinyHotHeap v2 (Phase31 A/B) #include "../box/smallobject_hotbox_v3_box.h" // SmallObject HotHeap v3 skeleton #include "../box/smallobject_hotbox_v4_box.h" // SmallObject HotHeap v4 (C7 stub) +#include "../box/smallobject_hotbox_v5_box.h" // SmallObject HotHeap v5 (C6-only route stub, Phase v5-1) #include "../box/tiny_c7_ultra_box.h" // C7 ULTRA stub (UF-1, delegates to v3) #include "../box/tiny_front_v3_env_box.h" // Tiny front v3 snapshot gate #include "../box/tiny_heap_env_box.h" // ENV gate for TinyHeap front (A/B) @@ -169,6 +170,16 @@ static inline void* malloc_tiny_fast(size_t size) { return v4p; } so_v3_record_alloc_fallback((uint8_t)class_idx); + // fallthrough to v5/v2/v1 + __attribute__((fallthrough)); + } + case TINY_ROUTE_SMALL_HEAP_V5: { + // Phase v5-1: C6-only route stub (v1/pool fallback) + SmallHeapCtxV5* ctx = small_heap_ctx_v5(); + void* v5p = small_alloc_fast_v5(size, (uint32_t)class_idx, ctx); + if (TINY_HOT_LIKELY(v5p != NULL)) { + return v5p; + } // fallthrough to v2/v1 __attribute__((fallthrough)); } @@ -355,6 +366,12 @@ static inline int free_tiny_fast(void* ptr) { return 1; } __attribute__((fallthrough)); + case TINY_ROUTE_SMALL_HEAP_V5: { + // Phase v5-1: C6-only route stub (v1/pool fallback) + SmallHeapCtxV5* ctx = small_heap_ctx_v5(); + small_free_fast_v5(base, (uint32_t)class_idx, ctx); + return 1; + } case TINY_ROUTE_SMALL_HEAP_V3: so_free((uint32_t)class_idx, base); return 1; diff --git a/core/smallobject_hotbox_v5.c b/core/smallobject_hotbox_v5.c index e053987d..bf5c82d7 100644 --- a/core/smallobject_hotbox_v5.c +++ b/core/smallobject_hotbox_v5.c @@ -1,6 +1,7 @@ -// smallobject_hotbox_v5.c - SmallObject HotBox v5 実装 stub(Phase v5-0) +// smallobject_hotbox_v5.c - SmallObject HotBox v5 実装 stub(Phase v5-0/v5-1) // -// この段階では完全な fallback stub。v5 route は呼ばれない(ENV default OFF)。 +// v5-1: C6-only route stub(v1/pool fallback via malloc_tiny_fast.h fallthrough) +// 実装部分は v5-2 以降で追加される #include #include @@ -16,21 +17,25 @@ SmallHeapCtxV5* small_heap_ctx_v5(void) { return &g_small_heap_ctx_v5; } -// Phase v5-0: Fast alloc(stub) -void* small_alloc_fast_v5(size_t size, uint32_t class_idx) { +// Phase v5-1: Fast alloc(C6-only route stub, fallthrough to v1/pool) +// malloc_tiny_fast.h の route switch で NULL が返されると fallthrough する設計 +void* small_alloc_fast_v5(size_t size, uint32_t class_idx, SmallHeapCtxV5* ctx) { (void)size; + (void)ctx; (void)class_idx; - // v5-0: completely disabled, fallback to existing path - // actual implementation in v5-2 + // v5-1: C6-only route stub - return NULL to fallthrough to v1/pool + // actual hot-path implementation in v5-2 return NULL; } -// Phase v5-0: Fast free(stub) -void small_free_fast_v5(void* ptr, uint32_t class_idx) { +// Phase v5-1: Fast free(C6-only route stub, fallthrough to v1/pool) +// malloc_tiny_fast.h で route switch 内で呼ばれ、値を返さない +void small_free_fast_v5(void* ptr, uint32_t class_idx, SmallHeapCtxV5* ctx) { (void)ptr; + (void)ctx; (void)class_idx; - // v5-0: no-op - // actual implementation in v5-2 + // v5-1: C6-only route stub - no-op (fallthrough handled by caller) + // actual hot-path implementation in v5-2 } // Segment stub(v5-2 で実装) diff --git a/docs/analysis/ENV_PROFILE_PRESETS.md b/docs/analysis/ENV_PROFILE_PRESETS.md index 71b07e5f..15ec58bb 100644 --- a/docs/analysis/ENV_PROFILE_PRESETS.md +++ b/docs/analysis/ENV_PROFILE_PRESETS.md @@ -135,6 +135,49 @@ HAKMEM_BENCH_MAX_SIZE=768 --- +## Research Profile 0: C6_SMALL_HEAP_V5_STUB(SmallObject v5 C6-only route stub, Phase v5-1) + +### 目的 +- C6-only を SmallObject v5 route に載せるベンチ専用(v5-1 段階では挙動は v1/pool fallback)。 +- ENV gate(HAKMEM_SMALL_HEAP_V5_ENABLED=1, HAKMEM_SMALL_HEAP_V5_CLASSES=0x40)で route 制御。 +- front 経由で v5 通電確認&sanity テスト(実装は v5-2 以降)。 +- Mixed/C6-heavy で v1 baseline と同じ perf を期待。 + +### ENV(v5 C6-only opt-in) +```sh +HAKMEM_BENCH_MIN_SIZE=257 +HAKMEM_BENCH_MAX_SIZE=768 +HAKMEM_TINY_HEAP_PROFILE=C7_SAFE +HAKMEM_TINY_C6_HOT=0 +HAKMEM_TINY_HOTHEAP_V2=0 +HAKMEM_SMALL_HEAP_V3_ENABLED=1 +HAKMEM_SMALL_HEAP_V3_CLASSES=0x80 # C7-only v3(C6 は v3 OFF) +HAKMEM_SMALL_HEAP_V5_ENABLED=1 # ★ v5 ON +HAKMEM_SMALL_HEAP_V5_CLASSES=0x40 # ★ C6(bit6) だけ v5 route に +HAKMEM_POOL_V2_ENABLED=0 +HAKMEM_POOL_V1_FLATTEN_ENABLED=0 +``` + +### テストコマンド +```sh +export HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 +export HAKMEM_SMALL_HEAP_V5_ENABLED=1 +export HAKMEM_SMALL_HEAP_V5_CLASSES=0x40 +./bench_random_mixed_hakmem 256 512 100 # C6 size range +./bench_mid_large_mt_hakmem 1 1000000 400 1 # pool baseline comparison +``` + +### 期待値 +- Throughput ≈ v1 baseline(変化なし、v1 fallback の為) +- segv/assert なし +- route snapshot で C6 → TINY_ROUTE_SMALL_HEAP_V5 に分岐確認 + +### 注意 +- v5-1 では中身は v1/pool fallback のまま(実装は v5-2) +- 本線には載せない、研究箱扱い + +--- + ## Research Profile 1: C6_ONLY_SMALLOBJECT_V4(SmallObject v4 C6-only 試運転) ### 目的