Major Features: - Debug counter infrastructure for Refill Stage tracking - Free Pipeline counters (ss_local, ss_remote, tls_sll) - Diagnostic counters for early return analysis - Unified larson.sh benchmark runner with profiles - Phase 6-3 regression analysis documentation Bug Fixes: - Fix SuperSlab disabled by default (HAKMEM_TINY_USE_SUPERSLAB) - Fix profile variable naming consistency - Add .gitignore patterns for large files Performance: - Phase 6-3: 4.79 M ops/s (has OOM risk) - With SuperSlab: 3.13 M ops/s (+19% improvement) This is a clean repository without large log files. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
5.0 KiB
5.0 KiB
Phase 6.21: ChatGPT Pro 省メモリ案実装
日付: 2025-10-24 目標: メモリ効率最適化(速度維持) 実装時間: 20分(予定)
🎯 実装方針
ChatGPT Pro提案の採用理由
Phase 6.20の結果分析:
- CAP 4倍化: メモリ78MB使用、でも速度改善なし
- Mid 1T: 29% vs mimalloc(変わらず)
- Mid 4T: 64% vs mimalloc(変わらず)
結論: CAP大きくしても速度に影響しない → ならメモリ節約しよう!
📋 実装内容
1. Bridge Classes追加(40KB, 52KB)⭐ Key!
目的: 32-64KB ギャップ解消
現状の問題:
Size classes: 32KB → 64KB (2倍のギャップ)
要求 40KB:
- W_MAX=1.30 → 64KB使用不可(1.6倍>1.30) → malloc fallback
- W_MAX=1.60 → 64KB使用(1.6倍≤1.60) → 24KB無駄(60%)
解決策:
Size classes: 32KB → 40KB → 52KB → 64KB
要求 40KB:
- 40KB class使用(1.0倍) → 無駄ゼロ ✅
実装:
// hakmem_pool.c
// BEFORE: 5 classes
static const size_t g_mid_sizes[5] = {
2048, 4096, 8192, 16384, 32768
};
// AFTER: 7 classes (40KB, 52KB追加)
static const size_t g_mid_sizes[7] = {
2048, // 2KB
4096, // 4KB
8192, // 8KB
16384, // 16KB
32768, // 32KB
40960, // 40KB ← NEW!
53248, // 52KB ← NEW!
};
2. W_MAX_LARGE 緊縮(1.60 → 1.30)
目的: メモリ無駄削減
Phase 2での変更:
// hakmem_policy.c:77
pol->w_max_large = 1.60f; // Phase 2: 緩和
Phase 6.21での変更:
pol->w_max_large = 1.30f; // 戻す(でもBridge classesでカバー)
効果:
- W_MAX厳しくなる → メモリ無駄減る
- でもBridge classesあるから速度低下しない
3. CAP 削減(4倍 → 1倍)
目的: メモリフットプリント削減
Phase 2での変更:
// hakmem_policy.c:46-47
uint16_t mid_defaults[5] = { 256, 256, 256, 128, 64 }; // 60MB
uint16_t large_defaults[5] = { 32, 32, 16, 8, 4 }; // 18MB
// 合計: 78MB
Phase 6.21での変更:
uint16_t mid_defaults[7] = { 64, 64, 64, 32, 16, 32, 32 }; // 17.25MB
uint16_t large_defaults[5] = { 8, 8, 4, 2, 1 }; // 4.5MB
// 合計: 21.75MB (Bridge 2個分追加で少し増えるが、元より大幅減)
効果: 78MB → 22MB(約1/3.5削減)
📊 期待される効果
| 指標 | Phase 6.20 (現状) | Phase 6.21 (予測) | 変化 |
|---|---|---|---|
| メモリ使用量 | 78 MB | 22 MB | ✅ 1/3.5削減 |
| Mid Pool無駄 | ~60% | <10% | ✅ 大幅改善 |
| 速度 (Mid 1T) | 4.3M (29%) | ~4.3M (29%) | ➡️ 変わらず |
| 速度 (Mid 4T) | 9.6M (64%) | ~9.6M (64%) | ➡️ 変わらず |
| Tiny 4T | 51.3M (120%) | 51.3M (120%) | ➡️ 維持 |
根拠: Phase 6.20でCAP↑でも速度変わらず証明済み
🔧 実装手順
Step 1: Bridge Classes追加(10分)
ファイル: hakmem_pool.c
POOL_NUM_CLASSES5→7に変更g_mid_sizes[]配列に40KB, 52KB追加- 配列サイズ依存箇所を確認・修正
Step 2: W_MAX戻し(1分)
ファイル: hakmem_policy.c:77
pol->w_max_large = 1.30f; // 1.60から戻す
Step 3: CAP戻し(1分)
ファイル: hakmem_policy.c:46-47
// Mid: 7クラス分(Bridge含む)
uint16_t mid_defaults[7] = { 64, 64, 64, 32, 16, 32, 32 };
// Large: 元に戻す
uint16_t large_defaults[5] = { 8, 8, 4, 2, 1 };
Step 4: ビルド&テスト(5分)
make clean
make
./test_hakmem # 基本動作確認
Step 5: ベンチマーク(5分)
cd mimalloc-bench/bench/larson
./bench.sh # Mid Pool重点測定
✅ 成功基準
Must Have:
- ✅ ビルド成功
- ✅ test_hakmem通過
- ✅ メモリ使用量削減確認(78MB→22MB)
Should Have:
- ✅ Mid Pool速度維持(29-64%維持)
- ✅ Tiny Pool速度維持(120%維持)
Nice to Have:
- 🎯 Mid Pool速度改善(29%→35%+)
- Bridge classesのメモリ効率が速度にプラス影響する可能性
📁 変更ファイル
hakmem/
├── hakmem_pool.c # Bridge classes追加
├── hakmem_pool.h # POOL_NUM_CLASSES変更
├── hakmem_policy.c # W_MAX/CAP戻し
└── docs/status/
├── PHASE_6.21_PLAN_2025_10_24.md ← このファイル
└── PHASE_6.21_RESULTS_2025_10_24.md ← 後で作成
🎓 設計思想
Phase 2 vs Phase 6.21
Phase 2 (失敗):
- アプローチ: CAP↑で速度改善狙い
- 結果: メモリ↑、速度変わらず
- 学び: CAPは速度に影響しない
Phase 6.21 (賢い):
- アプローチ: メモリ↓、速度維持
- 根拠: Phase 2の学び活用
- 戦略: Bridge classesで機能カバー
計画作成: 2025-10-24 19:50 JST 実装開始: Phase 6.21 実装開始 期待: メモリ効率大幅改善、速度維持