Files
hakmem/docs/analysis/ENV_PROFILE_PRESETS.md
Moe Charm (CI) 2a13478dc7 Optimize C6 heavy and C7 ultra performance analysis with refined design refinements
- Update environment profile presets and visibility analysis
- Enhance small object and tiny segment v4 box implementations
- Refine C7 ultra and C6 heavy allocation strategies
- Add comprehensive performance metrics and design documentation

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-10 22:57:26 +09:00

6.3 KiB
Raw Blame History

ENV Profile Presets (HAKMEM)

よく使う構成を 3 つのプリセットにまとめました。まずここからコピペし、必要な ENV だけを追加してください。v2 系や LEGACY 専用オプションは明示 opt-in で扱います。 ベンチバイナリでは HAKMEM_PROFILE=<名前> をセットすると、ここで定義した ENV を自動で注入します(既に設定済みの ENV は上書きしません)。


Profile 1: MIXED_TINYV3_C7_SAFE標準 Mixed 161024B

目的

  • Mixed 161024B の標準ベンチ用。
  • C7-only SmallObject v3 + Tiny front v3 + LUT + fast classify ON。
  • v4 系C6/C7 v4、fast classify v4、small segment v4はすべて OFF。
  • Tiny/Pool v2 もすべて OFF。
  • C6 は凍結中Tiny/SmallObject の特別扱いなし。mid/pool の通常経路に任せる。

ENV 最小セットRelease

# プリセットでまとめて指定
HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE

# Mixed 161024B 前提のサイズ範囲(必要に応じて明示)
HAKMEM_BENCH_MIN_SIZE=16
HAKMEM_BENCH_MAX_SIZE=1024

プリセットで自動設定される主な ENV:

  • HAKMEM_TINY_HEAP_PROFILE=C7_SAFE
  • HAKMEM_TINY_C7_HOT=1
  • HAKMEM_TINY_HOTHEAP_V2=0
  • HAKMEM_SMALL_HEAP_V3_ENABLED=1
  • HAKMEM_SMALL_HEAP_V3_CLASSES=0x80C7-only v3
  • HAKMEM_SMALL_HEAP_V4_ENABLED=0 / HAKMEM_SMALL_HEAP_V4_CLASSES=0x0
  • HAKMEM_TINY_PTR_FAST_CLASSIFY_ENABLED=1
  • HAKMEM_TINY_PTR_FAST_CLASSIFY_V4_ENABLED=0
  • HAKMEM_SMALL_SEGMENT_V4_ENABLED=0
  • HAKMEM_POOL_V2_ENABLED=0
  • HAKMEM_TINY_FRONT_V3_ENABLED=1
  • HAKMEM_TINY_FRONT_V3_LUT_ENABLED=1

任意オプション

  • stats を見たいとき:
HAKMEM_TINY_HEAP_STATS=1
HAKMEM_TINY_HEAP_STATS_DUMP=1
HAKMEM_SMALL_HEAP_V3_STATS=1
  • v2 系は触らないC7_SAFE では Pool v2 / Tiny v2 は常時 OFF
  • FREE_POLICY/THP を触る実験例(現在の HEAD では必須ではなく、組み合わせによっては微マイナスになる場合もある):
HAKMEM_FREE_POLICY=keep
HAKMEM_DISABLE_BATCH=1
HAKMEM_SS_MADVISE_STRICT=0
# or
HAKMEM_FREE_POLICY=batch
HAKMEM_THP=auto
  • 参考v4 研究箱の現状):
    • C7/C6 v4 + fast classify v4 ONv3 OFF, segment OFF: ≈32.032.5M ops/sMIXED 1M/ws=400, Release
    • C7-only v4C6 v1、v3 OFF: ≈33.0M ops/s
    • 現状は v3 構成が最速のため、標準プロファイルでは v4 系をすべて OFF に固定。

Profile 2: C6_HEAVY_LEGACY_POOLV1mid/smallmid C6-heavy ベンチ)

目的

  • C6-heavy mid/smallmid のベンチ用。
  • C6 は v1 固定C6 v3/v4/ULTRA は研究箱のみ。Pool v2 OFF。Pool v1 flatten は bench 用に opt-in。

ENVv1 基準線)

HAKMEM_BENCH_MIN_SIZE=257
HAKMEM_BENCH_MAX_SIZE=768
HAKMEM_TINY_HEAP_PROFILE=C7_SAFE
HAKMEM_TINY_C6_HOT=0
HAKMEM_TINY_HOTHEAP_V2=0
HAKMEM_SMALL_HEAP_V3_ENABLED=1
HAKMEM_SMALL_HEAP_V3_CLASSES=0x80   # C7-only v3, C6 v3 は OFF
HAKMEM_POOL_V2_ENABLED=0
HAKMEM_POOL_V1_FLATTEN_ENABLED=0    # flatten は初回 OFF
  • mid_desc_lookup TLS キャッシュを試すときだけ: HAKMEM_MID_DESC_CACHE_ENABLED=1 を上乗せ(デフォルトは OFF

Pool v1 flatten A/B 用LEGACY 専用)

# LEGACY + flatten ON (研究/bench専用)
HAKMEM_TINY_HEAP_PROFILE=LEGACY
HAKMEM_POOL_V2_ENABLED=0
HAKMEM_POOL_V1_FLATTEN_ENABLED=1
HAKMEM_POOL_V1_FLATTEN_STATS=1

Profile 2b: C6_HEAVY_LEGACY_POOLV1_FLATTENmid/smallmid LEGACY flatten ベンチ専用)

目的

  • LEGACY プロファイルで mid/smallmid の flatten + header-only zero をまとめて opt-in するベンチ専用セット。
  • C7_SAFE では使わないこと(安定性優先のため C7_SAFE は flatten 常時 OFF

ENVベンチ専用

HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1    # base を流用
HAKMEM_POOL_V1_FLATTEN_ENABLED=1
HAKMEM_POOL_ZERO_MODE=header
HAKMEM_POOL_V1_FLATTEN_STATS=1

※ LEGACY 専用。C7_SAFE / C7_ULTRA_BENCH ではこのプリセットを使用しないこと。

  • flatten は LEGACY 専用。C7_SAFE / C7_ULTRA_BENCH ではコード側で強制 OFF になる前提。

C6 研究用プリセット(標準ラインには影響させない)

  • C6 v3 研究Tiny/SmallObject に C6 を載せるときだけ)
HAKMEM_PROFILE=C6_SMALL_HEAP_V3_EXPERIMENT
HAKMEM_BENCH_MIN_SIZE=257
HAKMEM_BENCH_MAX_SIZE=768
# bench_profile が以下を自動注入(既存 ENV を上書きしません):
# HAKMEM_TINY_C6_HOT=1
# HAKMEM_SMALL_HEAP_V3_ENABLED=1
# HAKMEM_SMALL_HEAP_V3_CLASSES=0x40   # C6 only v3
  • C6 v4 研究C6 を v4 に載せるときだけ)
HAKMEM_PROFILE=C6_SMALL_HEAP_V4_EXPERIMENT
HAKMEM_BENCH_MIN_SIZE=257
HAKMEM_BENCH_MAX_SIZE=768
# bench_profile が以下を自動注入(既存 ENV を上書きしません):
# HAKMEM_TINY_C6_HOT=1
# HAKMEM_SMALL_HEAP_V3_ENABLED=0
# HAKMEM_SMALL_HEAP_V4_ENABLED=1
# HAKMEM_SMALL_HEAP_V4_CLASSES=0x40   # C6 only v4

※ いずれも「研究箱」です。Mixed/C6-heavy の標準評価では使わず、回帰やセグフォを許容できるときだけ明示的に opt-in してください。


Profile 3: DEBUG_TINY_FRONT_PERFperf 用 DEBUG プロファイル)

目的

  • Tiny front v3C7 v3 含む)の perf record 用。
  • -O0 / -g / LTO OFF でシンボル付き計測。

ビルド例

make clean
CFLAGS='-O0 -g' USE_LTO=0 OPT_LEVEL=0 NATIVE=0 \
  make bench_random_mixed_hakmem -j4

ENV

HAKMEM_BENCH_MIN_SIZE=16
HAKMEM_BENCH_MAX_SIZE=1024
HAKMEM_TINY_HEAP_PROFILE=C7_SAFE
HAKMEM_TINY_C7_HOT=1
HAKMEM_TINY_HOTHEAP_V2=0
HAKMEM_SMALL_HEAP_V3_ENABLED=1
HAKMEM_SMALL_HEAP_V3_CLASSES=0x80
HAKMEM_POOL_V2_ENABLED=0
HAKMEM_TINY_FRONT_V3_ENABLED=1
HAKMEM_TINY_FRONT_V3_LUT_ENABLED=1
HAKMEM_TINY_PTR_FAST_CLASSIFY_ENABLED=1

perf 例

perf record -F 5000 --call-graph dwarf -e cycles:u \
  -o perf.data.tiny_front_tf3 \
  ./bench_random_mixed_hakmem 1000000 400 1
  • perf 計測時はログを極力 OFF、ENV は MIXED_TINYV3_C7_SAFE をベースにする。

共通注意

  • プリセットから外れて単発の ENV を積み足すと再現が難しくなるので、まずは上記いずれかからスタートし、変更点を必ずメモしてください。
  • v2 系Pool v2 / Tiny v2はベンチごとに opt-in。不要なら常に 0。