2025-12-09 21:50:15 +09:00
|
|
|
|
// smallobject_hotbox_v3_box.h - SmallObject HotHeap v3 (C7-first skeleton)
|
|
|
|
|
|
//
|
|
|
|
|
|
// Phase A/B: 型と TLS / stats を用意し、front が呼べる枠を置く。
|
|
|
|
|
|
// まだ中身は v1 fallback(so_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;
|
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
|
|
|
|
_Atomic uint64_t alloc_current_hit; // fast path: current から pop
|
|
|
|
|
|
_Atomic uint64_t alloc_partial_hit; // fast path: partial から pop
|
2025-12-09 21:50:15 +09:00
|
|
|
|
_Atomic uint64_t free_calls;
|
|
|
|
|
|
_Atomic uint64_t free_fallback_v1;
|
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
|
|
|
|
_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
|
2025-12-10 09:08:18 +09:00
|
|
|
|
_Atomic uint64_t page_of_fail;
|
2025-12-09 21:50:15 +09:00
|
|
|
|
} 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);
|
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
|
|
|
|
void so_v3_record_alloc_current_hit(uint8_t ci);
|
|
|
|
|
|
void so_v3_record_alloc_partial_hit(uint8_t ci);
|
2025-12-09 21:50:15 +09:00
|
|
|
|
void so_v3_record_free_call(uint8_t ci);
|
|
|
|
|
|
void so_v3_record_free_fallback(uint8_t ci);
|
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
|
|
|
|
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);
|
2025-12-10 09:08:18 +09:00
|
|
|
|
void so_v3_record_page_of_fail(uint8_t ci);
|
2025-12-09 21:50:15 +09:00
|
|
|
|
|
|
|
|
|
|
// 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);
|
2025-12-10 09:08:18 +09:00
|
|
|
|
|
|
|
|
|
|
// C7-only pointer membership check (read-only, no state change)
|
|
|
|
|
|
int smallobject_hotbox_v3_can_own_c7(void* ptr);
|