Files
hakmem/core/box/smallobject_hotbox_v3_box.h
Moe Charm (CI) 2d684ffd25 Phase SO-BACKEND-OPT-1: v3 backend 分解&Tiny/ULTRA 完成世代宣言
=== 実装内容 ===

1. v3 backend 詳細計測
   - ENV: HAKMEM_SO_V3_STATS で alloc/free パス内訳計測
   - 追加 stats: alloc_current_hit, alloc_partial_hit, free_current, free_partial, free_retire
   - so_alloc_fast / so_free_fast に埋め込み
   - デストラクタで [ALLOC_DETAIL] / [FREE_DETAIL] 出力

2. v3 backend ボトルネック分析完了
   - C7-only: alloc_current_hit=99.99%, alloc_refill=0.9%, free_retire=0.1%, page_of_fail=0
   - Mixed: alloc_current_hit=100%, alloc_refill=0.85%, free_retire=0.07%, page_of_fail=0
   - 結論: v3 ロジック部分(ページ選択・retire)は完全最適化済み
   - 残り 5% overhead は内部コスト(header write, memcpy, 分岐)

3. Tiny/ULTRA 層「完成世代」宣言
   - 総括ドキュメント作成: docs/analysis/PERF_EXEC_SUMMARY_ULTRA_PHASE_20251211.md
   - CURRENT_TASK.md に Phase ULTRA 総括セクション追加
   - AGENTS.md に Tiny/ULTRA 完成世代宣言追加
   - 最終成果: Mixed 16–1024B = 43.9M ops/s (baseline 30.6M → +43.5%)

=== ボトルネック地図 ===

| 層 | 関数 | overhead |
|-----|------|----------|
| Front | malloc/free dispatcher | ~40–45% |
| ULTRA | C4–C7 alloc/free/refill | ~12% |
| v3 backend | so_alloc/so_free | ~5% |
| mid/pool | hak_super_lookup | 3–5% |

=== フェーズ履歴(Phase ULTRA cycle) ===

- Phase PERF-ULTRA-FREE-OPT-1: C4–C7 ULTRA統合 → +9.3%
- Phase REFACTOR: Code quality (60行削減)
- Phase PERF-ULTRA-REFILL-OPT-1a/1b: C7 ULTRA refill最適化 → +11.1%
- Phase SO-BACKEND-OPT-1: v3 backend分解 → 設計限界確認

=== 次フェーズ(独立ライン) ===

1. Phase SO-BACKEND-OPT-2: v3 header write削減 (1-2%)
2. Headerless/v6系: out-of-band header (1-2%)
3. mid/pool v3新設計: C6-heavy 10M → 20–25M

本フェーズでTiny/ULTRA層は「完成世代」として基盤固定。
今後の大きい変更はHeaderless/mid系の独立ラインで検討。

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-11 22:45:14 +09:00

90 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// smallobject_hotbox_v3_box.h - SmallObject HotHeap v3 (C7-first skeleton)
//
// Phase A/B: 型と TLS / stats を用意し、front が呼べる枠を置く。
// まだ中身は v1 fallbackso_alloc は NULL を返す)。
#pragma once
#include <stdint.h>
#include <stddef.h>
#include <stdatomic.h>
#include "tiny_geometry_box.h"
#include "smallobject_hotbox_v3_env_box.h"
#include "tiny_region_id.h"
#ifndef SMALLOBJECT_NUM_CLASSES
#define SMALLOBJECT_NUM_CLASSES TINY_NUM_CLASSES
#endif
struct tiny_heap_page_t;
struct TinySlabMeta;
struct SuperSlab;
typedef struct so_page_v3 {
void* freelist;
uint32_t used;
uint32_t capacity;
uint32_t block_size;
uint32_t class_idx;
uint32_t flags;
void* base; // carve 後のユーザ領域先頭
void* slab_base; // 64KiB slab 基底page_of 用ヘッダを書き込む)
struct TinySlabMeta* meta;
struct SuperSlab* ss;
uint16_t slab_idx;
struct tiny_heap_page_t* lease_page;
void* slab_ref; // kept as a generic token; currently same as lease_page for v1
struct so_page_v3* next;
} so_page_v3;
typedef struct so_class_v3 {
so_page_v3* current;
so_page_v3* partial;
uint16_t max_partial_pages;
uint16_t partial_count;
uint32_t block_size;
} so_class_v3;
typedef struct so_ctx_v3 {
so_class_v3 cls[SMALLOBJECT_NUM_CLASSES];
} so_ctx_v3;
typedef struct so_stats_class_v3 {
_Atomic uint64_t route_hits;
_Atomic uint64_t alloc_calls;
_Atomic uint64_t alloc_refill;
_Atomic uint64_t alloc_fallback_v1;
_Atomic uint64_t alloc_current_hit; // fast path: current から pop
_Atomic uint64_t alloc_partial_hit; // fast path: partial から pop
_Atomic uint64_t free_calls;
_Atomic uint64_t free_fallback_v1;
_Atomic uint64_t free_current; // fast path: current に push
_Atomic uint64_t free_partial; // fast path: partial に push
_Atomic uint64_t free_retire; // slow path: retire
_Atomic uint64_t page_of_fail;
} so_stats_class_v3;
// Stats helpers (defined in core/smallobject_hotbox_v3.c)
int so_v3_stats_enabled(void);
void so_v3_record_route_hit(uint8_t ci);
void so_v3_record_alloc_call(uint8_t ci);
void so_v3_record_alloc_refill(uint8_t ci);
void so_v3_record_alloc_fallback(uint8_t ci);
void so_v3_record_alloc_current_hit(uint8_t ci);
void so_v3_record_alloc_partial_hit(uint8_t ci);
void so_v3_record_free_call(uint8_t ci);
void so_v3_record_free_fallback(uint8_t ci);
void so_v3_record_free_current(uint8_t ci);
void so_v3_record_free_partial(uint8_t ci);
void so_v3_record_free_retire(uint8_t ci);
void so_v3_record_page_of_fail(uint8_t ci);
// TLS accessor (core/smallobject_hotbox_v3.c)
so_ctx_v3* so_tls_get(void);
// Hot path API (Phase B: stub → always fallback to v1)
void* so_alloc(uint32_t class_idx);
void so_free(uint32_t class_idx, void* ptr);
// C7-only pointer membership check (read-only, no state change)
int smallobject_hotbox_v3_can_own_c7(void* ptr);