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>
7.0 KiB
ChatGPT Pro UltraThink Response (2025-11-01)
質問: QUESTION_FOR_CHATGPT_PRO.md - hakmem アロケータの根本的なアーキテクチャレビュー
回答者: ChatGPT Pro (UltraThink mode)
日時: 2025-11-01
要約
了解だよ、にゃーん。 方針は"シンプルで綺麗"に:ホットパスは最短・最少命令、学習は裏方で数ノブだけ回す。 勝てる土俵で確実に勝ち(Tiny/混在)、苦手帯は最短ルートで埋める(Mid/Large/MT)。
質問票の現状傾向:Tiny‑Hot では勝ちやすい一方、Random Mixed は拮抗〜微負け、Mid/Large MT は大きく負け。設計を"少層+局所性重視"へ寄せるのが近道です。
A. "勝てる"ための黄金ルール(小さく・綺麗に)
-
2レジスタ経路を死守:
bcur/bend(TLSバンプシャドウ)だけで alloc を完結。- オブジェクト未タッチ、ヘッダ非更新、統計は1/16K サンプルのみ。
-
層は最大3つに制限(Tiny)
TLS‑BUMP → (TLS小マガジン 128) → Slab/Slow- それ以外(大マガ/mini‑mag/bitmap/registry)はSlow専用。
-
前段と後段を分離
- Tiny と L2 の TLS 構造体は別キャッシュラインに分離、L2のリングはcoldへ。
-
学習は裏方に限定
- 触るのは
BATCH / HOT_THRESHOLD / drain_mask / slab_lg(1MB/2MB)の4つだけ。 - 150ms間隔のFSM+ヒステリシス、探索は ε-greedy。ホットパスは一切書かない。
- 触るのは
-
空になった資源はすぐ返す
unpublish → munmap、部分はMADV_DONTNEEDを"稀に・塊で"。
B. mimallocに勝つ帯を伸ばす(Tiny/混在)
1) hot‑class の"分岐ゼロ"化(即値化)
- 上位**3クラス(8/16/32 or 16/32/64)**は 専用関数に差替(関数ポインタ)。
- 中は
bcur+=objsz; if (bcur<=bend) return old;のみ。 - x86なら cmov 版をオプトイン(分岐ミスが多いCPUで+α)。
ねらい:命令数/alloc をさらに削る(+8〜15%狙い)。
2) 小マガジン 128 を前段へ(8/16/32B)
- push/pop はindexだけ、枯渇/溢れはまとめて大マガへ。
- L1常駐の作業集を数KBに抑えて Random Mixed の p95 を上げる。
ねらい:L1ミスと insns/op を同時に下げる(+5〜10%)。
3) ACEは4態だけ(STEADY/BURST/REMOTE_HEAVY/MEM_TIGHT)
- BURST:
BATCH↑ THRESH↑ drain 1/2、slab_lg=2MB - REMOTE_HEAVY:
drain 毎回、detach上限=128 - MEM_TIGHT:
slab_lg=1MB固定、BATCH縮小、返却積極化 - STEADY:
BATCH=64, THRESH=80, drain 1/4
ねらい:状況にだけ合わせ、ホットパスに影響を入れない。
C. 弱点を最短で埋める(Mid/Large / MT)
4) **Thread‑Local Segment(ページ局所バンプ)**を導入(8–32KB)
- per‑thread page/segmentで バンプ→ページ内free‑list の2段のみ。
- 連結生成や大域bitmap走査はページ境界に限定。
- ≥64KB は直mapのLRU 64本で再利用(
mmap頻度削減)。
ねらい:単スレ Mid/Large を 2–3倍に(層と命令を大幅削減)。
5) per‑core arena + SPSC remote queue(MTの本命)
- スレッドは起動時に所属coreを記録。
- cross‑thread free は 宛先coreのSPSCリングへ push。
- 所有側は alloc のついでにdrain(256個上限)。
- 中央レジストリは core数×シャードに分割(登録/解除だけmutex)。
ねらい:偽共有・グローバルロック競合を消し、MTでの 3× 差を詰める。
いずれも"構造のシンプル化"がカギ。L2リングを闇雲に大きくすると Tiny までL1圧迫→逆効果です(実測の -5% はその典型)。
D. 学習層は過剰にしない(それでも"効く"構成)
- ノブは4つだけ:
BATCH/HOT_THRESHOLD/drain_mask/slab_lg - 更新はBG:150ms tick、ε-greedy(探索 <5%)。
- RSS予算を受け取って
MEM_TIGHTへ自動遷移(上限順守)。 - 観測はサンプリング:TLSで貯めて低頻度flush(ホットストアなし)。
ねらい:mimallocの"静的最適"に、低コストの適応で上乗せ。
E. フロント/バック干渉の最小化(設計原則)
- データ配置:Tiny 用 TLS と L2 用 TLS は別構造体・別CL・
alignas(64)。 - テキスト配置:ホット関数は
.text.hak_hotセクションへ集約(I‑cache/BTB を安定)。 - 初期化分岐は入口で1回:
*_init_if_needed()はTLSフラグに畳み、ホットパスに置かない。 - Slowは全部 noinline/cold:refill/registry/drain は別TUや
.text.hak_cold。
F. すぐできる"勝ち筋チェックリスト"
- hot3 特化(8/16/32 or 16/32/64)+PGO再生成
- 小マガジン128(8/16/32B)を前段に、L1常駐化
- per‑thread page/segment の骨格(Mid/Large)
- per‑core arena + SPSC remote の骨格(MT)
drain_maskとBATCH/THRESHを ACE FSM で切替- CIベンチで median/p95 をCSV保存(±3%で警告)
perf stat(insns/op・L1/LLC/DTLB・branch‑miss)で命令数削減を確認
まとめ(短期の実装順位)
- Tiny 強化:hot3 + 小マガジン + PGO(素早く +10〜15%)
- MTの土台:per‑core arena + SPSC remote(フェアネスとp95)
- Mid/Large:page‑local segment(2–3×を狙う最短の構造変更)
- ACE:FSMの4態+4ノブに限定(学習は"静かに効く"だけ)
"シンプルで綺麗"を貫けば、勝てる帯は確実に増える。 必要なら、上の hot3差し替え と 小マガジン128 をそのまま入れられる最小パッチ形式で出すよ。
hakmem チームの評価
✅ 的確な指摘
- L2 Ring 拡大による Tiny への干渉 (-5%) は「典型的な L1 圧迫」と指摘
- 6-7層は多すぎ → 3層に制限すべき
- 学習層は過剰設計 → 4ノブ4態に簡素化
🎯 実装優先順位
Phase 1 (短期 1-2日): Tiny 強化
- hot3 特化関数 (+8-15%)
- 小マガジン128 (+5-10%)
- PGO 再生成
Phase 2 (中期 1週間): MT改善
- per-core arena + SPSC remote
Phase 3 (中期 1-2週間): Mid/Large改善
- Thread-Local Segment (2-3倍狙い)
Phase 4 (長期): 学習層簡素化
- ACE: 4態4ノブに削減
📊 期待効果
| ベンチマーク | 現在 | Phase 1後 (予想) | 目標 |
|---|---|---|---|
| Tiny Hot | 215 M | 240-250 M (+15%) | 250 M |
| Random Mixed | 21.5 M | 23-24 M (+10%) | 25 M |
| Mid/Large MT | 38 M | 40 M (Phase 2後) | 80-100 M (Phase 3後) |
次のアクション: 実装ロードマップ作成 → Phase 1 実装開始