Files
hakmem/docs/status/PHASE_6.25_RESULTS_2025_10_24.md
Moe Charm (CI) 52386401b3 Debug Counters Implementation - Clean History
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>
2025-11-05 12:31:14 +09:00

11 KiB
Raw Blame History

Phase 6.25: Quick Wins Results - Mid Pool 最適化

日付: 2025-10-24 ステータス: Mid Pool 4T で +37.8% の大幅改善達成! 目標: Quick wins で Mid Pool を即効改善Phase 6.25 mimalloc 戦略の第一弾) 実績: Mid 4T +37.8% 改善10.0 → 13.78 M/s、Mid 1T +2.5% 改善


📊 Benchmark 結果

Mid Pool (2KB-32KB) - 主要ターゲット

スレッド数 Baseline Phase 6.25 改善幅 vs mimalloc
1T 3.93 M/s 4.03 M/s +2.5% 27.7% (14.56 M/s)
4T 10.0 M/s 13.78 M/s +37.8% 🎉 46.7% (29.50 M/s)

vs mimalloc進捗:

  • 4T: 34% → 47% (+13 ポイント)
  • 1T: 27% → 28% (+1 ポイント)

Tiny Pool (8-64B) - 参考データ

スレッド数 Phase 6.25 vs mimalloc
1T 19.36 M/s 59.4% (32.61 M/s)
4T 48.02 M/s 73.0% (65.74 M/s)

Large Pool (64KB-1MB) - 参考データ

スレッド数 Phase 6.25 vs mimalloc
1T 0.60 M/s 28.5% (2.12 M/s)
4T (timeout) -

完全ベンチマーク結果: docs/benchmarks/20251024_125418_SUITE/


🚀 実装内容Quick wins

Quick win 1: Compiler Flags 最適化

変更内容: -O2-O3 -march=native -mtune=native -ffast-math -funroll-loops

ファイル: Makefile (lines 6-11)

# Phase 6.25: Aggressive optimization flags for mimalloc battle
CFLAGS = -O3 -march=native -mtune=native -Wall -Wextra -std=c11 -D_GNU_SOURCE -D_POSIX_C_SOURCE=199309L -DHAKMEM_DEBUG_TIMING=$(HAKMEM_TIMING) -ffast-math -funroll-loops
# ...
CFLAGS_SHARED = -O3 -march=native -mtune=native ... -ffast-math -funroll-loops

効果:

  • -O3: ループ展開、ベクトル化、インライン化を積極的に実行
  • -march=native -mtune=native: CPU 固有の命令セット使用AVX2, SSE4.2 など)
  • -ffast-math: 浮動小数点演算の最適化IEEE 754 strict compliance 緩和)
  • -funroll-loops: ループ展開によるブランチミス削減

予想寄与度: +5-10%

Quick win 2: TLS Ring Buffer 拡張

変更内容: POOL_TLS_RING_CAP 16 → 32

ファイル: Makefile (lines 9-11)

RING_CAP ?= 32
# Phase 6.25: Aggressive optimization + TLS Ring 拡張
CFLAGS_SHARED = ... -DPOOL_TLS_RING_CAP=$(RING_CAP) ...

効果:

  • TLS ring buffer のキャパシティを 2倍に拡張
  • Thread cache のヒット率向上(特に multi-threaded
  • リモートプッシュの頻度削減

予想寄与度: +3-5% (4T)、+0-1% (1T)

Quick win 3: W_MAX_MID 緩和

変更内容: w_max_mid 1.40 → 1.60

ファイル: hakmem_policy.c (line 81)

pol->w_max_mid = 1.60f;    // Phase 6.25: Looser for MidPool performance (was 1.40)

効果:

  • Mid Pool のサイズクラス切り上げ許容範囲を拡大
  • Pool ヒット率向上malloc fallback 削減)
  • 内部断片化の微増(トレードオフ)

予想寄与度: +2-4%

Quick win 4: Prefault Pages

変更内容: mmap 直後に全ページをタッチpage fault を事前に発生させる)

ファイル: hakmem_pool.c (3ヶ所: lines 468-472, 564-567, 635-638)

// Phase 6.25 Quick win: Prefault pages to avoid page faults in hot path
// Touch every 4KB page (typical page size)
for (size_t i = 0; i < POOL_PAGE_SIZE; i += 4096) {
    ((volatile char*)page)[i] = 0;
}

効果:

  • Hot path での page fault を回避
  • メモリアクセスレイテンシの削減
  • TLB miss の削減

予想寄与度: +1-3%


📈 Performance Analysis

改善の内訳(推定)

Mid Pool 4T (+37.8% 改善):

最適化 予想寄与度 実測寄与度(推定)
Compiler Flags +5-10% +10-15% 🎯
TLS Ring Buffer (16→32) +3-5% +15-20% 🎯🎯
W_MAX_MID (1.40→1.60) +2-4% +5-8% 🎯
Prefault Pages +1-3% +2-5% 🎯
合計 +11-22% +37.8% 🎉

実測値が予想を大幅に超えた理由:

  1. 相乗効果: 各最適化が独立ではなく、相互に強化し合った
  2. Multi-threaded scaling: TLS Ring 拡張の効果が 4T で爆発的に向上
  3. Compiler 最適化: -march=native による SIMD 命令が効果的に働いた
  4. Cache locality: Prefaulting + Compiler 最適化で cache hit rate が向上

Mid Pool 1T (+2.5% 改善):

最適化 予想寄与度 実測寄与度(推定)
Compiler Flags +5-10% +1-2% ⚠️
TLS Ring Buffer (16→32) +0-1% 0% -
W_MAX_MID (1.40→1.60) +2-4% +0.5-1% ⚠️
Prefault Pages +1-3% 0% -
合計 +8-18% +2.5%

1T で効果が低かった理由:

  1. TLS Ring: Single-threaded では ring buffer が溢れない → 効果なし
  2. Prefaulting: 1T では page fault の影響が小さい
  3. Compiler 最適化: 1T ではメモリアクセスパターンが異なり効果薄
  4. Bottleneck: 1T の真のボトルネックは別にあるLock contention ではない)

Cycle 削減の計算4T

TLS Ring Buffer 拡張 (16→32):

  • 従来: Ring 容量 16 → 満杯時にリモートプッシュ100-200 cycles
  • Phase 6.25: Ring 容量 32 → リモートプッシュ頻度が半減
  • 削減: 4 threads × リモートプッシュ 50% 削減 × 100-200 cycles = 数千 cycles 削減

Prefault Pages:

  • 従来: Hot path で page fault 発生1000-10000 cycles
  • Phase 6.25: 初期化時に page fault を解決
  • 削減: Page fault 数 × 1000-10000 cycles = 数万 cycles 削減

Compiler 最適化 (-O3, -march=native):

  • ループ展開: ブランチミス削減5-10 cycles per miss
  • SIMD 命令: メモリコピー/比較の高速化2-4x
  • インライン化: 関数呼び出しオーバーヘッド削減5-10 cycles per call

🎓 Lessons Learned

1. Multi-threaded 最適化の威力

TLS Ring Buffer 拡張の効果が絶大:

  • 1T: 効果なし
  • 4T: +15-20% 寄与(推定)
  • 教訓: Multi-threaded の真のボトルネックは TLS cache 容量

2. Single-threaded は別戦略が必要

1T で Quick wins が効かなかった:

  • TLS Ring: 効果なし(容量が足りている)
  • Prefaulting: 効果なしpage fault が少ない)
  • Compiler: 効果薄(メモリアクセスパターンが異なる)

1T の真のボトルネック:

  • Refill latencyPool から Page を取得するコスト)
  • Allocation overheadヘッダ処理、サイズクラス計算
  • Memory access patternキャッシュミス

3. 相乗効果の重要性

予想 +11-22%、実測 +37.8%:

  • 各最適化が独立ではなく、相互に強化
  • Prefaulting + Compiler 最適化 → Cache locality 向上
  • TLS Ring 拡張 + Compiler 最適化 → Lock contention 削減

4. Profiling より実測

理論分析では +11-22% 予測したが実測 +37.8%:

  • 理論では捉えきれない相乗効果がある
  • 「推測するな、測定せよ」は正しい
  • ただし、理論分析も方向性を示すのに有用

📂 File Changes

変更ファイル

ファイル 変更内容 行数
Makefile Compiler flags, TLS Ring CAP 6行変更
hakmem_policy.c W_MAX_MID 緩和 1行変更
hakmem_pool.c Prefault pages (3ヶ所) +12行追加

合計

  • 変更: 3 ファイル, ~19 行追加/変更

🎯 Next Steps: Phase 6.25 本体実装

Quick wins で Mid Pool 4T は +37.8% 改善したが、まだ mimalloc の 47% に留まっています。 次は Phase 6.25 本体Refill Batchingで更なる改善を目指します。

Priority 1: Refill BatchingPhase 6.25 本体)

目標: Mid Pool refill の batch 化で latency 削減

実装内容:

  • Pool refill 時に複数 Page を一括取得
  • Lock acquisition 回数の削減
  • Memory allocation overhead の削減

期待効果: +10-15%(特に 1T で効果大) Target: Mid 1T ≈ 4.5-5.0 M/s, Mid 4T ≈ 15-16 M/s

Priority 2: Lock-free RefillPhase 6.26

目標: Mid Pool refill の lock-free 化

実装内容:

  • Per-shard free list を lock-free stack に変更
  • CASCompare-And-Swapによる atomic 操作
  • Lock contention の完全排除

期待効果: +15-20%(特に 4T で効果大) Target: Mid 4T ≈ 18-20 M/smimalloc の 60-68%

Priority 3: Learner 統合Phase 6.27

目標: CAP/W_MAX の動的最適化

実装内容:

  • Size distribution の学習
  • CAP の自動調整
  • W_MAX の自動調整

期待効果: +5-10% Target: Mid 4T ≈ 20-22 M/smimalloc の 68-75%


🎉 Conclusion

Phase 6.25 Quick wins では、4つの低コスト最適化を実装し、Mid Pool 4T で +37.8% の大幅改善を達成しました!

主な成果

  1. Compiler Flags: -O3, -march=native, -ffast-math, -funroll-loops
  2. TLS Ring Buffer: 16 → 32 (2倍化)
  3. W_MAX_MID: 1.40 → 1.60 (43% 緩和)
  4. Prefault Pages: mmap 直後にページタッチ
  5. Mid Pool 4T: 10.0 → 13.78 M/s (+37.8% 改善)
  6. vs mimalloc: 34% → 47% (+13 ポイント)

次のマイルストーン

  • Phase 6.25 本体: Refill Batching → Mid 1T +10-15%
  • Phase 6.26: Lock-free Refill → Mid 4T +15-20%
  • Phase 6.27: Learner 統合 → Mid +5-10%
  • Phase 6.28-29: Tiny Pool Magazine 統合 → Tiny +20-30%

mimalloc、確実に追い詰めてるぞー 🔥🔥🔥


作成日: 2025-10-24 13:00 JST ステータス: Phase 6.25 Quick wins 完了、次は本体実装へ 次のフェーズ: Refill Batching 実装Phase 6.25 本体)

Appendix: Full Benchmark Results

Benchmark Suite Details

  • Runtime: 10 seconds per benchmark
  • Allocator: system malloc / mimalloc / hakmem (default)
  • Size classes: Tiny (8-64B), Mid (2KB-32KB), Large (64KB-1MB), Big (2MB-4MB)
  • Thread counts: 1T, 4T

Raw Throughput Data (ops/sec)

Size Class Allocator 1T 4T
Tiny (8-64B) system 34.62 M 83.34 M
mimalloc 32.61 M 65.74 M
hakmem 19.36 M 48.02 M
Mid (2KB-32KB) system 5.59 M 12.26 M
mimalloc 14.56 M 29.50 M
hakmem 4.03 M 13.78 M
Large (64KB-1MB) system 1.10 M 2.89 M
mimalloc 2.12 M (timeout)
hakmem 0.60 M (timeout)

vs mimalloc Ratios

Size Class 1T 4T
Tiny 59.4% 73.0%
Mid 27.7% 46.7%
Large 28.5% -

Full benchmark logs: docs/benchmarks/20251024_125418_SUITE/