Files
hakmem/docs/design/BOX_THEORY_ARCHITECTURE_REPORT.md

458 lines
15 KiB
Markdown
Raw Normal View History

Wrap debug fprintf in !HAKMEM_BUILD_RELEASE guards (Release build optimization) ## Changes ### 1. core/page_arena.c - Removed init failure message (lines 25-27) - error is handled by returning early - All other fprintf statements already wrapped in existing #if !HAKMEM_BUILD_RELEASE blocks ### 2. core/hakmem.c - Wrapped SIGSEGV handler init message (line 72) - CRITICAL: Kept SIGSEGV/SIGBUS/SIGABRT error messages (lines 62-64) - production needs crash logs ### 3. core/hakmem_shared_pool.c - Wrapped all debug fprintf statements in #if !HAKMEM_BUILD_RELEASE: - Node pool exhaustion warning (line 252) - SP_META_CAPACITY_ERROR warning (line 421) - SP_FIX_GEOMETRY debug logging (line 745) - SP_ACQUIRE_STAGE0.5_EMPTY debug logging (line 865) - SP_ACQUIRE_STAGE0_L0 debug logging (line 803) - SP_ACQUIRE_STAGE1_LOCKFREE debug logging (line 922) - SP_ACQUIRE_STAGE2_LOCKFREE debug logging (line 996) - SP_ACQUIRE_STAGE3 debug logging (line 1116) - SP_SLOT_RELEASE debug logging (line 1245) - SP_SLOT_FREELIST_LOCKFREE debug logging (line 1305) - SP_SLOT_COMPLETELY_EMPTY debug logging (line 1316) - Fixed lock_stats_init() for release builds (lines 60-65) - ensure g_lock_stats_enabled is initialized ## Performance Validation Before: 51M ops/s (with debug fprintf overhead) After: 49.1M ops/s (consistent performance, fprintf removed from hot paths) ## Build & Test ```bash ./build.sh larson_hakmem ./out/release/larson_hakmem 1 5 1 1000 100 10000 42 # Result: 49.1M ops/s ``` Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 13:14:18 +09:00
# 箱理論アーキテクチャ検証レポート
**日付**: 2025-11-12
**検証対象**: Phase E1-CORRECT 統一箱構造
**ステータス**: ✅ 統一完了、⚠️ レガシー特殊ケース残存
---
## エグゼクティブサマリー
Phase E1-CORRECTで**すべてのクラスC0-C7に1バイトヘッダーを統一**しました。これにより:
**達成**:
- Header層: C7特殊ケース完全排除0件
- Allocation層: 統一API`tiny_region_id_write_header`
- Free層: 統一Fast Path`tiny_region_id_read_header`
⚠️ **残存課題**:
- **Box層**: C7特殊ケース13箇所残存`tls_sll_box.h`, `ptr_conversion_box.h`
- **Backend層**: C7デバッグロギング5箇所`tiny_superslab_*.inc.h`
- **設計矛盾**: Phase E1でC7にheader追加したのに、Box層でheaderless扱い
---
## 1. 箱構造の検証結果
### 1.1 Header層の統一✅ 完全達成)
**検証コマンド**:
```bash
grep -n "if.*class.*7" core/tiny_region_id.h
# 結果: 0件C7特殊ケースなし
```
**Phase E1-CORRECT設計**`core/tiny_region_id.h:49-56`:
```c
// Phase E1-CORRECT: ALL classes (C0-C7) have 1-byte header (no exceptions)
// Rationale: Unified box structure enables:
// - O(1) class identification (no registry lookup)
// - All classes use same fast path
// - Zero special cases across all layers
// Cost: 0.1% memory overhead for C7 (1024B → 1023B usable)
// Benefit: 100% safety, architectural simplicity, maximum performance
// Write header at block start (ALL classes including C7)
uint8_t* header_ptr = (uint8_t*)base;
*header_ptr = HEADER_MAGIC | (class_idx & HEADER_CLASS_MASK);
```
**結論**: Header層は**完全統一**。C7特殊ケースは存在しない。
---
### 1.2 Box層の特殊ケース 13箇所残存
**C7特殊ケース出現頻度**:
```
core/tiny_free_magazine.inc.h: 24件
core/box/tls_sll_box.h: 11件 ← Box層
core/tiny_alloc_fast.inc.h: 8件
core/box/ptr_conversion_box.h: 7件 ← Box層
core/tiny_refill_opt.h: 5件
```
#### 1.2.1 TLS-SLL Box`tls_sll_box.h`
**C7特殊ケースの理由**:
```c
// Line 84-88: C7 rejection
// CRITICAL: C7 (1KB) is headerless - MUST NOT use TLS SLL
// Reason: SLL stores next pointer in first 8 bytes (user data for C7)
if (__builtin_expect(class_idx == 7, 0)) {
return false; // C7 rejected
}
```
**問題点**:
- **Phase E1の設計矛盾**: C7にheader追加したのに、Box層で"headerless"扱い
- **実装矛盾**: C7もheader持つなら、TLS SLL使えるはず
- **パフォーマンス損失**: C7だけSlow Path強制不要な制約
#### 1.2.2 Pointer Conversion Box`ptr_conversion_box.h`
**C7特殊ケースの理由**:
```c
// Line 43-48: BASE→USER conversion
/* Class 7 (2KB) is headerless - no offset */
if (class_idx == 7) {
return base_ptr; // No +1 offset
}
// Classes 0-6 have 1-byte header - skip it
void* user_ptr = (void*)((uint8_t*)base_ptr + 1);
```
**問題点**:
- **Phase E1の設計矛盾**: C7もheaderあるなら+1必要
- **メモリ破壊リスク**: C7でbase==userだと、next pointer書き込みでheader破壊
---
### 1.3 Backend層の特殊ケース5箇所、デバッグのみ
**C7デバッグロギング**`tiny_superslab_alloc.inc.h`, `tiny_superslab_free.inc.h`:
```c
// 性能影響なし(デバッグビルドのみ)
if (ss->size_class == 7) {
static _Atomic int c7_alloc_count = 0;
fprintf(stderr, "[C7_FIRST_ALLOC] ptr=%p next=%p\n", block, next);
}
```
**結論**: Backend層の特殊ケースは**非致命的**(デバッグ専用、性能影響なし)。
---
## 2. 層構造の分析
### 2.1 現在の層とファイルマッピング
```
Layer 1: Header Operations (完全統一 ✅)
└─ core/tiny_region_id.h (222行)
- tiny_region_id_write_header() - ALL classes (C0-C7)
- tiny_region_id_read_header() - ALL classes (C0-C7)
- C7特殊ケース: 0件
Layer 2: Allocation Fast Path (統一 ✅、C7はSlow Path強制)
└─ core/tiny_alloc_fast.inc.h (707行)
- hak_tiny_malloc() - TLS SLL pop
- C7特殊ケース: 8件Slow Path強制のみ
Layer 3: Free Fast Path (統一 ✅)
└─ core/tiny_free_fast_v2.inc.h (315行)
- hak_tiny_free_fast_v2() - Header-based O(1) class lookup
- C7特殊ケース: 0件Phase E3-1でregistry lookup削除
Layer 4: Box Abstraction (設計矛盾 ⚠️)
├─ core/box/tls_sll_box.h (560行)
│ - tls_sll_push/pop/splice API
│ - C7特殊ケース: 11件"headerless"扱い)
└─ core/box/ptr_conversion_box.h (90行)
- ptr_base_to_user/ptr_user_to_base
- C7特殊ケース: 7件offset=0扱い
Layer 5: Backend Storage (デバッグのみ)
├─ core/tiny_superslab_alloc.inc.h (801行)
│ - C7特殊ケース: 3件デバッグログ
└─ core/tiny_superslab_free.inc.h (368行)
- C7特殊ケース: 2件デバッグ検証
Layer 6: Classification (ドキュメントのみ)
└─ core/box/front_gate_classifier.h (79行)
- C7特殊ケース: 3件コメント内"headerless"言及)
```
### 2.2 層間依存関係
```
┌─────────────────────────────────────────────────┐
│ Layer 1: Header Operations (tiny_region_id.h) │ ← 完全統一
└─────────────────┬───────────────────────────────┘
│ depends on
┌─────────────────────────────────────────────────┐
│ Layer 2/3: Fast Path (alloc/free) │ ← 統一
│ - tiny_alloc_fast.inc.h │
│ - tiny_free_fast_v2.inc.h │
└─────────────────┬───────────────────────────────┘
│ depends on
┌─────────────────────────────────────────────────┐
│ Layer 4: Box Abstraction (box/*.h) │ ← 設計矛盾
│ - tls_sll_box.h (C7 rejection) │
│ - ptr_conversion_box.h (C7 offset=0) │
└─────────────────┬───────────────────────────────┘
│ depends on
┌─────────────────────────────────────────────────┐
│ Layer 5: Backend Storage (superslab_*.inc.h) │ ← 非致命的
└─────────────────────────────────────────────────┘
```
**問題点**:
- **Layer 1Header**: C7にheader追加済み
- **Layer 4Box**: C7を"headerless"扱い(設計矛盾)
- **影響**: C7だけTLS SLL使えない → Slow Path強制 → 性能損失
---
## 3. モジュール化提案
### 3.1 現状の問題
**ファイルサイズ分析**:
```
core/tiny_superslab_alloc.inc.h: 801行 ← 巨大
core/tiny_alloc_fast.inc.h: 707行 ← 巨大
core/box/tls_sll_box.h: 560行 ← 巨大
core/tiny_superslab_free.inc.h: 368行
core/box/hak_core_init.inc.h: 373行
```
**問題**:
1. **単一責任原則違反**: `tls_sll_box.h`が560行push/pop/splice/debug全部入り
2. **C7特殊ケース散在**: 11ファイルに70+箇所
3. **Box境界不明確**: `tiny_alloc_fast.inc.h`がBox API直接呼び出し
### 3.2 リファクタリング提案
#### Option A: 箱理論レイヤー分離(推奨)
```
core/box/
allocation/
- header_box.h (50行, Header write/read統一API)
- fast_alloc_box.h (200行, TLS SLL pop統一)
free/
- fast_free_box.h (150行, Header-based free統一)
- remote_free_box.h (100行, Cross-thread free)
storage/
- tls_sll_core.h (100行, Push/Pop/Splice core)
- tls_sll_debug.h (50行, Debug validation)
- ptr_conversion.h (50行, BASE↔USER統一)
classification/
- front_gate_box.h (80行, 現状維持)
```
**利点**:
- 単一責任原則遵守各ファイル50-200行
- C7特殊ケースを1箇所に集約可能
- Box境界明確化
**コスト**:
- ファイル数増加4 → 10ファイル
- include階層深化1-2レベル増
---
#### Option B: C7特殊ケース統一最小変更
**Phase E1の設計意図を完遂**:
1. **C7にheader追加済み** → Box層も統一扱いに変更
2. **TLS SLL Box修正**:
```c
// Before (矛盾)
if (class_idx == 7) return false; // C7 rejected
// After (統一)
// ALL classes (C0-C7) use same TLS SLL (header protects next pointer)
```
3. **Pointer Conversion Box修正**:
```c
// Before (矛盾)
if (class_idx == 7) return base_ptr; // No offset
// After (統一)
void* user_ptr = (uint8_t*)base_ptr + 1; // ALL classes +1
```
**利点**:
- 最小変更2ファイル、30行程度
- C7特殊ケース70+箇所 → 0箇所
- C7もFast Path使用可能性能向上
**リスク**:
- C7のuser size変更1024B → 1023B
- 既存アロケーションとの互換性(要テスト)
---
#### Option C: ハイブリッド(段階的移行)
**Phase 1**: C7特殊ケース統一Option B
- 目標: C7もFast Path使用可能に
- 期間: 1-2日
- リスク: 低(テスト充実)
**Phase 2**: レイヤー分離Option A
- 目標: 箱理論完全実装
- 期間: 1週間
- リスク: 中(大規模リファクタ)
---
## 4. 最終評価
### 4.1 箱理論統一の達成度
| 層 | 統一度 | C7特殊ケース | 評価 |
|---|---|---|---|
| **Layer 1: Header** | 100% | 0件 | ✅ 完璧 |
| **Layer 2/3: Fast Path** | 95% | 8件Slow Path強制 | ✅ 良好 |
| **Layer 4: Box** | 60% | 18件設計矛盾 | ⚠️ 改善必要 |
| **Layer 5: Backend** | 95% | 5件デバッグのみ | ✅ 良好 |
| **Layer 6: Classification** | 100% | 0件コメントのみ | ✅ 完璧 |
**総合評価**: **B+85/100点**
**強み**:
- Header層の完全統一Phase E1の成功
- Fast Path層の高度な抽象化
- Classification層の明確な責務分離
**弱み**:
- Box層の設計矛盾Phase E1の意図が反映されていない
- C7特殊ケースの散在70+箇所)
- ファイルサイズの肥大化560-801行
---
### 4.2 モジュール化の必要性
**優先度**: **中~高**
**理由**:
1. **設計矛盾の解消**: Phase E1の意図C7 header統一がBox層で実現されていない
2. **性能向上**: C7がFast Path使えれば5-10%向上見込み
3. **保守性**: 560-801行の巨大ファイルは変更リスク大
**推奨アプローチ**: **Option Cハイブリッド**
- **短期**: C7特殊ケース統一Option B、1-2日
- **中期**: レイヤー分離Option A、1週間
---
### 4.3 次のアクション
#### 即座に実施(優先度: 高)
1. **C7特殊ケース統一の検証**
```bash
# C7にheaderある前提でTLS SLL使用可能か検証
./build.sh debug bench_random_mixed_hakmem
# Expected: C7もFast Path使用 → 5-10%性能向上
```
2. **Box層の設計矛盾修正**
- `tls_sll_box.h:84-88` - C7 rejection削除
- `ptr_conversion_box.h:44-48` - C7 offset=0削除
- テスト: `bench_fixed_size_hakmem 200000 1024 128`
#### 後で実施(優先度: 中)
3. **レイヤー分離リファクタリング**Option A
- `core/box/allocation/` ディレクトリ作成
- `tls_sll_box.h`を3ファイルに分割
- 期間: 1週間
4. **ドキュメント更新**
- `CLAUDE.md`: Phase E1の意図を明記
- `BOX_THEORY.md`: 層構造図追加
---
## 5. 結論
Phase E1-CORRECTは**Header層の完全統一**に成功しました。しかし、**Box層に設計矛盾**が残存しています。
**現状**:
- ✅ Header層: C7特殊ケース0件完璧
- ⚠️ Box層: C7特殊ケース18件設計矛盾
- ✅ Backend層: C7特殊ケース5件非致命的
**推奨事項**:
1. **即座に実施**: C7特殊ケース統一Box層修正、1-2日
2. **後で実施**: レイヤー分離リファクタリング1週間
**期待効果**:
- C7性能向上: Slow Path → Fast Path5-10%
- コード削減: C7特殊ケース70+箇所 → 0箇所
- 保守性向上: 巨大ファイル560-801行→ 小ファイル50-200行
---
## 付録A: C7特殊ケース完全リスト
### Box層18件、設計矛盾
**tls_sll_box.h11件**:
- Line 7: コメント "C7 (1KB headerless)"
- Line 72: コメント "C7 (headerless): ptr == base"
- Line 75: コメント "C7 always rejected"
- Line 84-88: C7 rejection in `tls_sll_push`
- Line 251: `next_offset = (class_idx == 7) ? 0 : 1`
- Line 389: コメント "C7 (headerless): next at base"
- Line 397-398: C7 next pointer clear
- Line 455-456: C7 rejection in `tls_sll_splice`
- Line 554: エラーメッセージ "C7 is headerless!"
**ptr_conversion_box.h7件**:
- Line 10: コメント "Class 7 (2KB) is headerless"
- Line 43-48: C7 BASE→USER no offset
- Line 69-74: C7 USER→BASE no offset
### Fast Path層8件、Slow Path強制
**tiny_alloc_fast.inc.h8件**:
- Line 205-207: コメント "C7 (1KB) is headerless"
- Line 209: C7 Slow Path強制
- Line 355: `sfc_next_off = (class_idx == 7) ? 0 : 1`
- Line 387-389: コメント "C7's headerless design"
### Backend層5件、デバッグのみ
**tiny_superslab_alloc.inc.h3件**:
- Line 629: デバッグログfailfast level 3
- Line 648: デバッグログfailfast level 3
- Line 775-786: C7 first alloc デバッグログ
**tiny_superslab_free.inc.h2件**:
- Line 31-39: C7 first free デバッグログ
- Line 94-99: C7 lightweight guard
### Classification層3件、コメントのみ
**front_gate_classifier.h3件**:
- Line 9: コメント "C7 (headerless)"
- Line 63: コメント "headerless"
- Line 71: 変数名 `g_classify_headerless_hit`
---
## 付録B: ファイルサイズ統計
```
core/box/*.h (32ファイル):
560行: tls_sll_box.h ← 最大
373行: hak_core_init.inc.h
327行: pool_core_api.inc.h
324行: pool_api.inc.h
313行: hak_wrappers.inc.h
285行: pool_mf2_core.inc.h
269行: hak_free_api.inc.h
266行: pool_mf2_types.inc.h
244行: integrity_box.h
90行: ptr_conversion_box.h ← 最小Box層
79行: front_gate_classifier.h
core/tiny_*.inc.h (主要ファイル):
801行: tiny_superslab_alloc.inc.h ← 最大
707行: tiny_alloc_fast.inc.h
471行: tiny_free_magazine.inc.h
368行: tiny_superslab_free.inc.h
315行: tiny_free_fast_v2.inc.h
222行: tiny_region_id.h
```
**総計**: 約15,000行`core/box/*.h` + `core/tiny_*.h` + `core/tiny_*.inc.h`
---
**レポート作成者**: Claude Code
**検証日**: 2025-11-12
**HAKMEMバージョン**: Phase E1-CORRECT