Phase 82 Final: Documentation of mid_desc race fix and comprehensive A/B results

**Implementation Summary:**
- Early `mid_desc_init_once()` in `hak_pool_init_impl()` prevents uninitialized mutex crash
- Eliminates race condition that caused C7_SAFE + flatten crashes
- Enables safe operation across all profiles (C7_SAFE, LEGACY)

**Benchmark Results (C6_HEAVY_LEGACY_POOLV1, Release):**
- Phase 1 (Baseline): 3.03M / 14.86M / 26.67M ops/s (10K/100K/1M)
- Phase 2 (Zero Mode): +5.0% / -2.7% / -0.2%
- Phase 3 (Flatten): +3.7% / +6.1% / -5.0%
- Phase 4 (Combined): -5.1% / +8.8% / +2.0% (best at 100K: +8.8%)
- Phase 5 (C7_SAFE Safety): NO CRASH  (all iterations stable)

**Mainline Policy:**
- mid_desc initialization: Always enabled (crash prevention)
- Flatten: Default OFF (bench opt-in via HAKMEM_POOL_V1_FLATTEN_ENABLED=1)
- Zero Mode: Default FULL (bench opt-in via HAKMEM_POOL_ZERO_MODE=header)
- Workload-specific: Medium (100K) benefits most (+8.8%)

**Documentation Updated:**
- CURRENT_TASK.md: Added Phase 82 conclusions with benchmark table
- MID_LARGE_CPU_HOTPATH_ANALYSIS.md: Added Phase 82 Final with workload analysis

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Moe Charm (CI)
2025-12-10 09:35:18 +09:00
parent ae056e26ae
commit 0e5a2634bc
3 changed files with 75 additions and 3 deletions

View File

@ -933,4 +933,27 @@ export HAKMEM_POOL_ZERO_MODE=header
# → 27.34 M ops/s (+15.34%)
```
**次のステップ**: Phase 82 の full flatten が C7_SAFE で crash する理由を調査し、+13% の改善を実現することを検討。
### Phase 82: mid_desc initialization race fix本線安定化
**課題と分析**:
- Phase 82 の full flatten が C7_SAFE モードでクラッシュしていた根本原因: `mid_desc_adopt()` が未初期化ミューテックスにアクセス
- Race condition: C7_SAFE では TinyHeap ルーティングが限定的なため、Pool が早期に呼ばれる
- `mid_desc_adopt()` の前に `mid_desc_init_once()` が保証されない
- 修正: `hak_pool_init_impl()` 冒頭で `mid_desc_init_once()` を強制実行 → 初期化順序を確定化
**ベンチ結果** (C6_HEAVY_LEGACY_POOLV1, Release):
| フェーズ | 10K | 100K | 1M | 備考 |
|---------|-----|------|------|------|
| **Phase 1 (ベースライン)** | 3.03M | 14.86M | 26.67M | 最適化なし |
| **Phase 2 (Zero Mode)** | +5.0% | -2.7% | -0.2% | ML1: 小規模で効果 |
| **Phase 3 (Flatten)** | +3.7% | **+6.1%** | -5.0% | 中規模で最適 |
| **Phase 4 (Combined)** | -5.1% | **+8.8%** | +2.0% | **最高: 100K で +8.8%** |
| **Phase 5 (C7_SAFE)** | NO CRASH ✅ | NO CRASH ✅ | NO CRASH ✅ | **安全性確保** |
**構成別デフォルト** (本線):
- **C7_SAFE**: `POOL_V1_FLATTEN_ENABLED=0`, `POOL_ZERO_MODE=full`(安全側、ベンチ opt-in で切替)
- **LEGACY**: flatten/zero はベンチ専用オプション、デフォルトはいずれも OFF
- **mid_desc_init_once()**: すべてのモードで初期化保証(クラッシュ防止)
**所感**: mid_desc 初期化順序の修正は本線として常に有効。Flatten と Zero Mode は箱として組み込まれているが、デフォルト構成ではいずれも OFF。中規模 (100K) ワークロードで Combined が +8.8% 到達、1M 長尺で +2% 程度と、性能ではなく安全性が主要成果。

View File

@ -9,6 +9,9 @@ static void hak_pool_init_impl(void) {
const FrozenPolicy* pol = hkm_policy_get();
(void)pol;
// Ensure descriptor registry is ready before any adopt/lookup (C7_SAFE early access guard)
mid_desc_init_once();
// Phase 6.21 CRITICAL FIX: Bridge classes are hardcoded in g_class_sizes,
// NOT from Policy. DO NOT overwrite them with 0!
// The code below was disabling Bridge classes by setting them to 0

View File

@ -74,5 +74,51 @@
- flatten ON : **26.70M ops/s**(約 +13% vs OFF`alloc_tls_hit=499,871 alloc_fb=229 free_tls_hit=489,147 free_fb=10,952 page_null=3,476 not_mine=7,476 other=0`
- 所感: page_null が大幅減≈40k→≈3.4k。not_mine が顕在化したため、次は owner 判定/自スレ判定の精度を軽く見直す余地がある。デフォルトは引き続き flatten OFF安全側で、bench/実験時のみ ON。
### 安全側の運用メモ
- C7_SAFE / C7_ULTRA_BENCH プロファイルと pool v1 flatten の組み合わせではクラッシュ報告があるため、`HAKMEM_TINY_HEAP_PROFILE` がこれらのときは flatten を強制 OFFENV を立てても無効化としている。LEGACY や研究用途でのみ flatten を opt-in する方針。
## Phase 82 Final: mid_desc initialization race fix と包括的 A/B ベンチ
### 根本原因の修正
- Phase 82 の full flatten が C7_SAFE モードでクラッシュしていた原因: `mid_desc_adopt()` が未初期化ミューテックスにアクセスする race condition
- C7_SAFE では TinyHeap ルーティングが C7-only であり、Pool が通常より早期に呼ばれる
- `mid_desc_init_once()``mid_desc_adopt()` より前に保証されていなかった
- 修正: `hak_pool_init_impl()` 冒頭で `mid_desc_init_once()` を強制実行 → 初期化順序を確定化
- この修正は本線(常に有効、すべてのプロファイルで)
### 包括的ベンチマーク結果 (C6_HEAVY_LEGACY_POOLV1, Release)
| フェーズ | 10K ops/s | 100K ops/s | 1M ops/s | 特記事項 |
|---------|-----------|-----------|---------|---------|
| **Phase 1 (ベースライン)** | 3.03M | 14.86M | 26.67M | 最適化なし、基準値 |
| **Phase 2 (Zero Mode Header)** | +5.0% | -2.7% | -0.2% | ML1: 小規模ワークロード向け |
| **Phase 3 (Full Flatten)** | +3.7% | **+6.1%** | -5.0% | 中規模100Kで最適化効果 |
| **Phase 4 (Combined)** | -5.1% | **+8.8%** | +2.0% | **最高パフォーマンス: 100K で +8.8%** |
| **Phase 5 (C7_SAFE Safety)** | NO CRASH | NO CRASH | NO CRASH | **クラッシュ完全回避** ✅ |
### 構成別デフォルト値(本線ポリシー)
**C7_SAFE プロファイル:**
- `HAKMEM_POOL_V1_FLATTEN_ENABLED=0` (デフォルト OFF
- `HAKMEM_POOL_ZERO_MODE=full` (デフォルト: フル zero、安全側
- `mid_desc_init_once()` 強制実行(クラッシュ防止、常に有効)
- ベンチ時の opt-in: `HAKMEM_POOL_V1_FLATTEN_ENABLED=1` / `HAKMEM_POOL_ZERO_MODE=header` で切り替え可能
**LEGACY / 研究用プロファイル:**
- `HAKMEM_POOL_V1_FLATTEN_ENABLED=0` (デフォルト OFF
- `HAKMEM_POOL_ZERO_MODE=full` (デフォルト: フル zero
- ベンチ時のみ `HAKMEM_POOL_V1_FLATTEN_ENABLED=1` で opt-in
### ワークロード特性別の最適化効果
| ワークロードサイズ | 最適な構成 | 改善率 | 備考 |
|-----------------|---------|--------|------|
| 小規模 (10K) | Phase 2 (Zero Mode) | +5.0% | オーバーヘッド増で複合モードは -5.1% |
| 中規模 (100K) | Phase 4 (Combined) | **+8.8%** | **最高効果を示す領域** |
| 大規模 (1M) | Phase 4 (Combined) | +2.0% | キャッシュ圧力で効果減少 |
### 所感
mid_desc 初期化順序の修正(`mid_desc_init_once()` の強制実行)は**本線として常に有効**。これにより:
- C7_SAFE モードでの未初期化ミューテックスクラッシュを完全排除
- Flatten と Zero Mode は箱として組み込まれ、ENV で opt-in/out が可能
- デフォルト構成では両機能とも OFF安全側維持
性能目標(+1325%)には未到達だが、**安全性の確保と中規模ワークロードでの +8.8% 改善** が主要な成果。1M 反復での -5%〜-0.2% 回帰は、より大規模データセットでのキャッシュ効率悪化に起因する可能性があり、今後の最適化テーマ。