224 lines
5.0 KiB
Markdown
224 lines
5.0 KiB
Markdown
|
|
# 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倍) → 無駄ゼロ ✅
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**実装**:
|
|||
|
|
```c
|
|||
|
|
// 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での変更**:
|
|||
|
|
```c
|
|||
|
|
// hakmem_policy.c:77
|
|||
|
|
pol->w_max_large = 1.60f; // Phase 2: 緩和
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Phase 6.21での変更**:
|
|||
|
|
```c
|
|||
|
|
pol->w_max_large = 1.30f; // 戻す(でもBridge classesでカバー)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**効果**:
|
|||
|
|
- W_MAX厳しくなる → メモリ無駄減る
|
|||
|
|
- でもBridge classesあるから速度低下しない
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. CAP 削減(4倍 → 1倍)
|
|||
|
|
|
|||
|
|
**目的**: メモリフットプリント削減
|
|||
|
|
|
|||
|
|
**Phase 2での変更**:
|
|||
|
|
```c
|
|||
|
|
// 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での変更**:
|
|||
|
|
```c
|
|||
|
|
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`
|
|||
|
|
|
|||
|
|
1. `POOL_NUM_CLASSES` 5→7に変更
|
|||
|
|
2. `g_mid_sizes[]` 配列に40KB, 52KB追加
|
|||
|
|
3. 配列サイズ依存箇所を確認・修正
|
|||
|
|
|
|||
|
|
### Step 2: W_MAX戻し(1分)
|
|||
|
|
|
|||
|
|
**ファイル**: `hakmem_policy.c:77`
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
pol->w_max_large = 1.30f; // 1.60から戻す
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Step 3: CAP戻し(1分)
|
|||
|
|
|
|||
|
|
**ファイル**: `hakmem_policy.c:46-47`
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
// 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分)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
make clean
|
|||
|
|
make
|
|||
|
|
./test_hakmem # 基本動作確認
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Step 5: ベンチマーク(5分)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
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 実装開始
|
|||
|
|
**期待**: メモリ効率大幅改善、速度維持
|