Files
hakmem/docs/archive/ACE_AND_SUPERSLAB.md
Moe Charm (CI) 0546454168 WIP: Add TLS SLL validation and SuperSlab registry fallback
ChatGPT's diagnostic changes to address TLS_SLL_HDR_RESET issue.
Current status: Partial mitigation, but root cause remains.

Changes Applied:
1. SuperSlab Registry Fallback (hakmem_super_registry.h)
   - Added legacy table probe when hash map lookup misses
   - Prevents NULL returns for valid SuperSlabs during initialization
   - Status:  Works but may hide underlying registration issues

2. TLS SLL Push Validation (tls_sll_box.h)
   - Reject push if SuperSlab lookup returns NULL
   - Reject push if class_idx mismatch detected
   - Added [TLS_SLL_PUSH_NO_SS] diagnostic message
   - Status:  Prevents list corruption (defensive)

3. SuperSlab Allocation Class Fix (superslab_allocate.c)
   - Pass actual class_idx to sp_internal_allocate_superslab
   - Prevents dummy class=8 causing OOB access
   - Status:  Root cause fix for allocation path

4. Debug Output Additions
   - First 256 push/pop operations traced
   - First 4 mismatches logged with details
   - SuperSlab registration state logged
   - Status:  Diagnostic tool (not a fix)

5. TLS Hint Box Removed
   - Deleted ss_tls_hint_box.{c,h} (Phase 1 optimization)
   - Simplified to focus on stability first
   - Status:  Can be re-added after root cause fixed

Current Problem (REMAINS UNSOLVED):
- [TLS_SLL_HDR_RESET] still occurs after ~60 seconds of sh8bench
- Pointer is 16 bytes offset from expected (class 1 → class 2 boundary)
- hak_super_lookup returns NULL for that pointer
- Suggests: Use-After-Free, Double-Free, or pointer arithmetic error

Root Cause Analysis:
- Pattern: Pointer offset by +16 (one class 1 stride)
- Timing: Cumulative problem (appears after 60s, not immediately)
- Location: Header corruption detected during TLS SLL pop

Remaining Issues:
⚠️ Registry fallback is defensive (may hide registration bugs)
⚠️ Push validation prevents symptoms but not root cause
⚠️ 16-byte pointer offset source unidentified

Next Steps for Investigation:
1. Full pointer arithmetic audit (Magazine ⇔ TLS SLL paths)
2. Enhanced logging at HDR_RESET point:
   - Expected vs actual pointer value
   - Pointer provenance (where it came from)
   - Allocation trace for that block
3. Verify Headerless flag is OFF throughout build
4. Check for double-offset application in conversions

Technical Assessment:
- 60% root cause fixes (allocation class, validation)
- 40% defensive mitigation (registry fallback, push rejection)

Performance Impact:
- Registry fallback: +10-30 cycles on cold path (negligible)
- Push validation: +5-10 cycles per push (acceptable)
- Overall: < 2% performance impact estimated

Related Issues:
- Phase 1 TLS Hint Box removed temporarily
- Phase 2 Headerless blocked until stability achieved

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 20:42:28 +09:00

11 KiB
Raw Blame History

ACEとSuperSlabの関係性 - 徹底分析

日付: 2025-10-26 分析: ultrathink モード 🧠


🎯 現状:完全に独立

ACEAgentic Context Engineering / Adaptive Cache Engineの範囲

対象: Mid Pool & Large Pool

// hakmem_policy.c:14-21
pol->tiny_cap[0] = 2048;   // ← Tiny Pool固定CAP
pol->tiny_cap[1] = 1024;
// ... (ACE管理外)

// hakmem_policy.c:43-50
uint16_t mid_defaults[7]   = { 64, 64, 64, 32, 16, 32, 32 };  // ← ACE管理
uint16_t large_defaults[5] = { 8, 8, 4, 2, 1 };               // ← ACE管理

サイズ範囲:

  • Tiny Pool: 8-64BACE対象外
  • Mid Pool: 2KB-64KBACEが最適化
  • Large Pool: 128KB-1MBACEが最適化

SuperSlabの範囲

対象: Tiny Pool のみ

// hakmem_tiny.c
// SuperSlabはTiny Pool8-64B専用
static inline void* hak_tiny_alloc_superslab(int class_idx) {
    // class_idx: 0-78B, 16B, 24B, 32B, 40B, 48B, 56B, 64B
}

結論: ACEとSuperSlabは完全に独立


🧠 ACEの4学習軸復習

1. 器の数(サイズクラス数)

Mid Pool例

// 固定5クラス
2KB, 4KB, 8KB, 16KB, 32KB

// + DYN1動的1枠 ← Phase 6.21で無効化
// 理由「動的1個だけ = 固定と同じ」(あなたの指摘通り!)

// + Bridgeクラス固定追加
40KB, 52KB  // 32KB-64KBのギャップ埋め

学習メカニズム:

  • ヒストグラムからピーク検出
  • 最適な境界を自動設定
  • でも現在は固定7クラスに変更Phase 6.21

2. 器の形サイズ境界・W_MAX丸め

W_MAX = 許容度:

// 例: W_MAX = 1.4
24KB要求  32KBクラスを許可24  1.4 × 32 = 44.8

学習: UCB1バンディットで最適W_MAX探索

3. 器の量CAP/在庫量)

目標ヒット率ベースの調整:

Mid Pool:  目標65%ヒット率
   不足なら CAP += 4ページ
   過剰なら CAP -= 2ページ

Large Pool: 目標55%ヒット率
   同様に調整

これが最も重要な学習!

4. 器の配置(しきい値)

THPしきい値

デフォルト: 2MB
学習で最適化: 512KB-4MB

Canary方式

  • 5%でトライアル
  • 改善確認後に本採用

なぜACEをTiny Poolに適用しないのか

理由1: サイズ範囲が小さすぎる

Tiny Pool: 8B, 16B, 24B, 32B, 40B, 48B, 56B, 64B

  • 8段階のみ
  • 各サイズが8Bずつ密集
  • 動的化の余地がほぼない

Mid Pool: 2KB-64KB

  • 範囲が広い32倍
  • 動的最適化の価値あり

理由2: TLS Magazineで十分

Tiny Poolの最適化戦略

// Magazine CAP固定
pol->tiny_cap[0] = 2048;  // 8B:  2048個
pol->tiny_cap[1] = 1024;  // 16B: 1024個
// ...

// 小さいサイズ = 多くキャッシュ
// 大きいサイズ = 少なくキャッシュ

この固定CAPでヒット率90%以上達成済み!

理由3: SuperSlabで十分高速

SuperSlabの強み

  • O(1) pointer-to-slab lookup
  • TLS-local allocationロック不要
  • Bitmapによる高速ブロック検索

ACE追加の価値

  • CAP調整→ Magazine CAPで十分
  • サイズクラス最適化?→ 8B刻みで最適
  • しきい値調整?→ 適用対象なし

結論: ACE不要


🔮 将来的な統合の可能性

可能性1: Tiny Magazine CAPの動的化

現状: 固定CAP

pol->tiny_cap[0] = 2048;  // 固定
pol->tiny_cap[1] = 1024;

ACE適用

// ヒット率ベースのCAP調整
if (tiny_hit_rate[0] < 0.90) {
    pol->tiny_cap[0] += 256;  // CAP増加
}
if (tiny_hit_rate[0] > 0.95 && tiny_cap[0] > 1024) {
    pol->tiny_cap[0] -= 128;  // CAP削減メモリ節約
}

価値:

  • ☆☆☆(低)
  • 理由:現状のヒット率がすでに高い

可能性2: SuperSlabサイズの最適化

現状: 固定2MB

#define SUPERSLAB_SIZE (2 * 1024 * 1024)  // 固定

ACE適用

// ワークロード適応型サイズ
if (small_workload) {
    superslab_size = 512KB;  // 小規模WL
} else {
    superslab_size = 4MB;    // 大規模WL
}

UCB1学習

// 各サイズでトライアル
512KB, 1MB, 2MB, 4MB, 8MB

// 報酬 = (ヒット率 × 性能) - (メモリコスト)
reward = hit_rate * throughput - (memory_mb / 100);

// 最適サイズを選択
best_size = argmax(ucb1_score);

価値:

  • ☆(中~高)
  • 理由:メモリ効率とキャッシュ効率のトレードオフ
  • でもPhase 7.6で動的割当実装後なら、固定サイズでも問題少ない

可能性3: Tiny Poolサイズクラスの動的化

現状: 固定8クラス

static size_t g_tiny_class_sizes[8] = {
    8, 16, 24, 32, 40, 48, 56, 64
};

ACE適用

// ヒストグラムベースの最適化
// 例: 12Bが多い → 8,12,16,24,32... に変更
if (histogram[12] > threshold) {
    add_dynamic_class(12);
}

問題点:

  • Mid Poolと同じ「動的1個問題」
  • 8B刻みですでに密集
  • 追加の価値が薄い

価値:

  • ☆☆☆☆(極めて低)
  • 理由固定8クラスで十分カバー

🎓 ACEの本質なぜMid/Largeで有効か

Mid/Large Poolの特徴

サイズ範囲が広い:

Mid:   2KB - 64KB  (32倍の範囲)
Large: 128KB - 1MB (8倍の範囲)

ワークロード依存性が高い:

  • あるアプリ4KBが多い
  • 別のアプリ16KBが多い
  • ワークロードで最適CAP/境界が変わる

ACEの価値

  • ワークロード適応
  • 自動チューニング
  • 性能とメモリのバランス

Tiny Poolの特徴

サイズ範囲が狭い:

Tiny: 8B - 64B (8倍の範囲、しかも8B刻み)

普遍的なパターン:

  • 16Bが多いポインタ + メタデータ)
  • 32Bが多い小構造体
  • ワークロードで大差なし

固定最適化で十分:

  • Magazine CAPは固定
  • SuperSlabで高速
  • ACE不要

📊 数値的根拠

bench_comprehensive_hakmem の結果

Tiny Pool16B

Throughput: 163 M ops/sec
Hit Rate:   95%+(推定)
Memory:     minimalSuperSlabで効率化済み

→ ACE追加の余地なし

Mid Pool4KB

Throughput: varies by workload
Hit Rate:   65-75%ACEで改善中
Memory:     ACEで最適化

→ ACE有効

test_scaling の結果

Tiny Pool16B

現状:      40.8 MB RSS (168% overhead)
Phase 7.6: 17-20 MB RSS (30-50% overhead)

→ SuperSlab動的化で解決
→ ACE不要

🔄 Phase 7.6とACEの関係

Phase 7.6: SuperSlab完全動的化

範囲: Tiny Pool 手法: Bitmap-based lazy allocation + eager deallocation ACE使用 なし

理由:

  • SuperSlabサイズは固定2MB十分
  • Magazine CAPは固定十分
  • サイズクラスは固定8個十分

ACE: Mid/Large Pool最適化

範囲: Mid/Large Pool 手法: UCB1 + ヒストグラム学習 SuperSlab使用 なし

理由:

  • Mid/LargeはBuddy allocator
  • SuperSlabはTiny専用
  • 完全に独立

🎯 結論:独立性のメリット

設計の美しさ

各層が最適化手法を持つ:

Tiny Pool (8-64B):
  └─ SuperSlab2MB aligned, bitmap, O(1) lookup
  └─ TLS Magazine固定CAP
  └─ Phase 7.6: 完全動的化

Mid Pool (2KB-64KB):
  └─ Buddy allocator
  └─ ACEUCB1学習
  └─ Bridge classes固定最適化

Large Pool (128KB-1MB):
  └─ Buddy allocator
  └─ ACEヒット率ベース
  └─ THP support

独立性の利点:

  • 各層が独立して最適化できる
  • 相互干渉なし
  • メンテナンス容易
  • 段階的改善可能

Phase 7.6の位置づけ

ACEとは別の最適化

  • ACE = Mid/Large の学習ベース最適化
  • Phase 7.6 = Tiny の設計ベース最適化

補完関係:

  • どちらも「動的最適化」
  • でも手法が異なる
  • お互いに干渉しない

論文的価値:

  • ACE: "Learning-based adaptive caching"
  • Phase 7.6: "Bitmap-based dynamic allocation"
  • 両方を持つことで包括的な最適化を実証!

🚀 Phase 8以降の可能性

統一学習フレームワーク?

仮想的な設計:

// Phase 8: Unified Learning Framework?

struct HakmemLearner {
    // Tiny Pool学習
    TinyLearner tiny;   // Magazine CAP, SuperSlab size?

    // Mid Pool学習既存ACE
    ACELearner mid;

    // Large Pool学習既存ACE
    ACELearner large;

    // グローバル最適化
    GlobalOptimizer global;  // メモリ全体のバランス
};

でも今は不要:

  • Tiny Poolは固定で十分高性能
  • Mid/LargeはACEで最適化済み
  • 統一の価値が薄い

より現実的な拡張

Phase 7.6完成後の次ステップ:

  1. Magazine flushの最適化

    // Magazine満杯時のspill戦略を学習
    // でも現状で十分...
    
  2. SuperSlab初期化の遅延度調整

    // プリフェッチ vs 完全遅延
    // UCB1で最適戦略選択
    
  3. Cross-pool最適化

    // Tiny/Mid境界の動的調整
    // 64B vs 2KBのしきい値学習
    

優先度: 低(現状で十分)


📚 まとめ

現状

Pool サイズ 最適化手法 学習 状態
Tiny 8-64B SuperSlab + Magazine Phase 7.6で完全動的化中
Mid 2KB-64KB Buddy + Bridge ACE 完成
Large 128KB-1MB Buddy + THP ACE 完成

Phase 7.6の立ち位置

ACEとは独立

  • 対象が異なるTiny vs Mid/Large
  • 手法が異なる(設計最適化 vs 学習最適化)
  • お互いに干渉しない

補完関係:

  • ACE: ワークロード適応型学習
  • Phase 7.6: Bitmap柔軟性活用
  • 両方で包括的最適化!

あなたの質問への回答

Q: Magazineが先A: YES! Step 1Magazine統合が最優先

Q: 学習方法は今何ACEA: Phase 7.6はACE不使用

  • ACEはMid/Large専用
  • Tiny Poolは固定最適化で十分
  • SuperSlabの動的化は設計ベース学習不要

Q: ACE ultrathinkA: 完全に独立、でも補完関係!

  • 各Poolが最適な手法で最適化
  • 統一の必要なし
  • むしろ独立性が美しい

次: Step 1Magazine統合の実装を始めましょう🔥🐱