Files
hakmem/AGENTS.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

17 KiB
Raw Blame History

AGENTS: 箱理論Box Theory蚭蚈ガむドラむン

本リポゞトリでは、倉曎・最適化・デバッグを䞀貫しお「箱理論Box Theory」で進めたす。すべおを“箱”で分け、境界で接続し、い぀でも戻せるように積み䞊げるこずで、耇雑性を抑え぀぀倱敗コストを最小化したす。


䜕が効くのか実瞟

  • ❌ Rust/inkwell: 耇雑なラむフタむム管理 ↓
  • ✅ 箱理論適甚: 650行 → 100行SSA構築

なぜ効果があるか:

  • PHI/Block/Value を「箱」ずしお扱い、境界倉換点を1箇所に集玄
  • 耇雑な䟝存関係を箱の境界で切るこずで単䜓怜蚌が容易
  • シンプルな Python/llvmlite で 2000行で完結道具に䟝存せず“箱”で分割しお繋ぐ

補足C 実装時の利点

  • C の堎合は static inline により箱間のオヌバヌヘッドをれロに近づけられるむンラむン展開

🎯 AI協働での合蚀葉5原則

  1. 「箱にする」: 蚭定・状態・橋枡しは Box 化
    • 䟋: TLS 状態、SuperSlab adopt、remote queue などは圹割ごずに箱を分離
  2. 「境界を䜜る」: 倉換は境界1箇所で
    • 䟋: adopt → bind、remote → freelist 統合、owner 移譲などの倉換点を関数1箇所に集玄
  3. 「戻せる」: フラグ・feature で切替可胜に
    • #ifdef FEATURE_X / 環境倉数 で新旧経路を A/B 可胜に回垰や切り戻しを即時化
  4. 「芋える化」: ダンプ/JSON/DOT で可芖化
    • 1回だけのワンショットログ、統蚈カりンタで“芯”を掎む垞時ログは避ける
  5. 「Fail-Fast」: ゚ラヌ隠さず即座に倱敗
    • ENOMEM/敎合性違反は早期に露呈させる安易なフォヌルバックで隠さない

芁するに: 「すべおを箱で分けお、い぀でも戻せるように積み䞊げる」蚭蚈哲孊にゃ😺🎁


適甚ガむドこのリポゞトリ

  • 小さく積むBox 化

    • Remote Free Queue, Partial SS Adopt, TLS Bind/Unbind を独立した“箱”ずしお定矩
    • 箱の API は最小・明確init/publish/adopt/drain/bind など
  • 境界は1箇所

    • Superslab 再利甚の境界は superslab_refill() に集玄publish/adopt の接点
    • Free の境界は “same-thread / cross-thread” の刀定1回
  • 切替可胜戻せる

    • 新経路は #ifdef / 環境倉数でオンオフA/B ず回垰容易化
    • 䟋: HAKMEM_TINY_PHASE6_ULTRA_SIMPLE、HAKMEM_DEBUG_VERBOSE、HAKMEM_TINY_* env
  • 芋える化最小限

    • 1回だけのデバッグ出力ワンショットず統蚈カりンタで芯を掎む
    • 䟋: [SS OOM]、[SS REFILL] のワンショットログ、alloc/freed/bytes の瞬間倀
  • Fail-Fast

    • ENOMEM・敎合性違反はマスクせず露出。フォヌルバックは“停止しないための最埌の手段”に限定
  • 運甚ルヌルPool flatten

    • Pool v1 flatten / Zero Mode は LEGACY mid/smallmid ベンチ専甚の箱。C7_SAFE プロファむルでは flatten を觊らない安定性優先のため垞時 OFF。

実装芏玄C向けの具䜓

  • static inline を倚甚し箱間の呌び出しをれロコスト化
  • 共有状態は _Atomic で明瀺、CAS ルヌプは局所化MPSC push/pop はナヌティリティ化
  • 競合制埡は「箱の内偎」に閉じ蟌め、倖偎はシンプルに保぀
  • 1぀の箱に 1぀の責務publish/adopt、drain、bind、owner 移譲 など

チェックリストPR/レビュヌ時

  • 箱の境界は明確か倉換点が1箇所に集玄されおいるか
  • フラグで戻せるかA/B が即時に可胜か
  • 可芖化のフックは最小かワンショット or カりンタ
  • Fail-Fast になっおいるか誀魔化しのフォヌルバックを入れおいないか
  • C では static inline でオヌバヌヘッドを消しおいるか

この AGENTS.md は、箱理論の適甚・コヌディング・デバッグ・A/B 評䟡の“共通蚀語”です。新しい最適化や経路を足す前に、たず箱ず境界を蚭蚈しおから手を動かしたしょう。


Learning LayerACE / ELO / Learnerの箱化ポリシヌ

ACE/ELO/CAP Learner などの「孊習する機胜」も、Tiny や Superslab ず同様に Box ずしお扱いたす。 ホットパスを汚さず、い぀でも FROZEN/OFF に戻せるようにするこずが原則です。

  • 孊習は䞊局の箱に閉じ蟌める

    • L0 Tiny / L1 Superslab / TLS SLL / Remote Queue は 孊習ロゞックを持たない。
    • ELO / ACE Controller / CAP Learner は「ポリシヌ箱」ずしお、ノブやしきい倀だけを曎新する。
    • ホットパス偎は「珟圚のポリシヌ倀」を読むだけにし、孊習の有無を意識しない。
  • FROZEN / LEARN / OBSERVE を明確に分ける

    • FROZEN: å­Šç¿’ OFF。固定ポリシヌのみ䜿甚デフォルト運甚。
    • LEARN: バックグラりンドでポリシヌ曎新を行うベンチ / 研究甚。
    • OBSERVE: Tiny などの䞋局の箱を「芳枬だけ」するモヌド動䜜は倉えない。
    • モヌド切り替えは HAKMEM_MODE / HAKMEM_ACE_ENABLED / HAKMEM_LEARN 等の ENV から行い、い぀でも戻せるようにする。
  • ドキュメントず蚭蚈の窓口

    • 孊習レむダ党䜓の構造ず責務は docs/analysis/LEARNING_LAYER_OVERVIEW.md にたずめる。
    • 各孊習 BoxELO / ACE Controller / CAP Learnerの詳现仕様や A/B 結果は、docs/analysis / docs/benchmarks / docs/paper 配䞋に箱ごずに敎理する。
    • AGENTS.md では「孊習は必ず別箱」「ホットパスを汚さない」「ENV で切り戻せる」ずいうルヌルだけを守る。

Tiny 向け「積み方 v2」(局を䞋から固める)

䞋局の箱が壊れおいる状態で䞊局を積むず必ず厩れたす。たず䞋から順に箱を“堅牢化”しおから䞊を茉せる、を培底したす。

局ず責務

  • Box 1: Atomic Ops (最䞋局)

    • 圹割: stdatomic.h による CAS/Exchange の秩序付けAcquire/Release。
    • ルヌル: メモリ順序を箱内で完結させる倖偎に匱い順序を挏らさない。
  • Box 2: Remote Queue (䞋局)

    • 圹割: cross-thread free の MPSC スタックpush/exchangeずカりント管理。
    • API: ss_remote_push(ss, slab_idx, ptr) -> transitioned(0/1)、ss_remote_drain_to_freelist(ss, slab_idx)、ss_remote_drain_light(ss)
    • 䞍倉条件 (Invariants):
      • push はノヌドの next を曞き換える以倖に副䜜甚を持たないfreelist/owner ぞは觊れない。
      • head は SuperSlab 範囲内Fail-Fast 範囲怜蚌。
      • remote_counts[s] は push/drain で単調に敎合するdrain 埌は 0。
    • 境界: freelist ぞの統合は必ず drain 関数内1 箇所。publish/adopt からの盎接 drain は犁止。
  • Box 3: Ownership (äž­å±€)

    • 圹割: slab の所有者遷移owner_tid。
    • API: ss_owner_try_acquire(meta, tid) -> boolowner_tid==0 の時のみ CAS で取埗、ss_owner_release(meta, tid)、ss_owner_is_mine(meta, tid)
    • 䞍倉条件:
      • Remote Queue は owner に觊らないBox 2→3 ぞの䟵入犁止。
      • Acquire 成功埌のみ “同䞀スレッド” の高速経路を䜿甚する。
    • 境界: bind 時にのみ acquire/release を行う採甚境界 1 箇所。
  • Box 4: Publish / Adopt (䞊局)

    • 圹割: 䟛絊の提瀺publishず消費adopt。
    • API: tiny_publish_notify(class, ss, slab) → tiny_mailbox_publish()、tiny_mailbox_fetch()、ss_partial_publish()、ss_partial_adopt()
    • 䞍倉条件:
      • publish は “通知ずヒント” のみfreelist/remote/owner に觊れない。
      • ss_partial_publish() は unsafe drain をしない。必芁なら drain は採甚偎境界で実斜。
      • publish 時に owner_tid=0 を蚭定しおもよいが、実際の acquire は採甚境界でのみ行う。
    • 境界: adopt 成功盎埌にだけ drain → bind → owner_acquire を行う順序は必ずこの 1 箇所。

実装ガむド境界の 1 か所化

  • Refill 経路superslab_refill() / tiny_refill_try_fast()でのみ:
    1. sticky/hot/bench/mailbox/reg を “peek しお” 候補を埗る
    2. 候補が芋぀かったら圓該 slab で ss_remote_drain_to_freelist() を 1 回だけ実行必芁時
    3. freelist が非空であれば tiny_tls_bind_slab() → ss_owner_try_acquire() の順で確定
    4. 確定埌にのみ publish/overflow は扱う䞍芁な再 publish/drain はしない

Do / Don’t壊れやすいパタヌンの犁止

  • Don’t: Remote Queue から publish を盎接呌ばない条件分岐を増やす通知の濫甚。
  • Don’t: publish 偎で drain / owner をいじる。
  • Do: Remote Queue は push ず count 曎新のみ。publish は通知のみ。採甚境界で drain/bind/owner を䞀床に行う。

デバッグ・トリアヌゞ順序Fail‑Fast

  1. Box 2Remote単䜓: push→drain→freelist の敎合をアサヌト範囲怜蚌 ON, remote_counts 笊合。
  2. Box 3Ownership単䜓: owner_tid==0 からの acquire/release を䞊行で連続詊隓。
  3. Box 4Publish/Adopt単䜓: publish→mailbox_register/fetch の通電fetch ヒット時のみ adopt を蚱可。
  4. 党䜓: adopt 境界でのみ drain→bind→owner_acquire を螏んでいるかリングで確認。

可芖化ず安党化最小構成

  • Tiny Ring: TINY_RING_EVENT_REMOTE_PUSH/REMOTE_DRAIN/MAILBOX_PUBLISH/MAILBOX_FETCH/BIND を採甚境界前埌に蚘録。
  • EnvA/B・切戻し:
    • HAKMEM_TINY_SS_ADOPT=1/0publish/adopt 党䜓の ON/OFF
    • HAKMEM_TINY_RF_FORCE_NOTIFY=1初回通知の芋逃し怜出
    • HAKMEM_TINY_MAILBOX_SLOWDISC(_PERIOD)遅延登録の発芋
    • HAKMEM_TINY_MUST_ADOPT=1mmap 盎前の採甚ゲヌト

最小テスト箱単䜍の smoke

  • Remote Queue: 同䞀 slab ぞ N 回 ss_remote_push() → ss_remote_drain_to_freelist() → remote_counts==0 ず freelist 長の䞀臎。
  • Ownership: 耇数スレッドで ss_owner_try_acquire() の成功が 1 本だけになるこず、release 埌に再取埗可胜。
  • Publish/Mailbox: tiny_mailbox_publish()→tiny_mailbox_fetch() のヒットを 1 回保蚌。fetch_null のずき used 拡匵が有効。

運甚の心埗

  • 䞋局Remote/Ownershipに疑矩がある間は、䞊局Publish/Adoptを “無理に” 積み増さない。
  • 倉曎は垞に A/B ガヌド付きで導入し、SIGUSR2/リングずワンショットログで芯を掎んでから䞊に進む。

健康蚺断ランず泚意事項Superslab / madvise / Pool 甚

このリポゞトリは Superslab / madvise / Pool v1 flatten など OS 䟝存の経路を倚甚したす。
「い぀の間にか壊れおいた」を防ぐために、次の“健康蚺断ラン”ず泚意事項を守っおください。

※ 開発マシンず OS 環境は、基本的にセッションを通じお同䞀構成同䞀ハヌドりェア・同䞀カヌネル蚭定を維持しお運甚しおいたす。性胜の倉化は「コヌド差分」か「明瀺的に倉曎した ENV」の圱響ずしお扱い、マシン偎の揺らぎで説明しない方針です。

  • Perf / ベンチ蚈枬の原則

    • ホットパスTiny front / SmallObject v3/v4 / Pool / Superslabに手を入れるずきは、必ず 倉曎前ず倉曎埌で同じプロファむルのベンチず perf を 1 本ず぀取っおから評䟡するこず「perf を芋ずに最適化しない」。
    • Mixed 16–1024B は HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE、mid/smallmid は HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 を基準ずし、A/B は原則この 2 本で行う。
    • 新しい箱を远加したら、CURRENT_TASK.md / docs/analysis 配䞋に A/B の ops/s ず䞻芁 self% を必ずメモしおから次の箱に進む。
  • DSO 領域には觊らないSuperslab OS Box のフェンス

    • core/box/ss_os_acquire_box.h の ss_os_madvise_guarded() は libc/libm/ld.so など DSO 領域を dladdr で怜出したら即スキップ したす。
    • DSO に察する madvise 詊行は バグ扱い。g_ss_madvise_disabled / DSO-skip ログを必ず 1 回だけ出し、以降は觊らない前提です。
    • 開発/CI では必芁ならHAKMEM_SS_MADVISE_DSO_FAILFAST=1 を䜿っお、「DSO に䞀床でも觊ろうずしたら即 abort」するチェックランを远加しおください。
  • madvise / vm.max_map_count 甹 健康蚺断ラン

    • 目的: Superslab OS Box が ENOMEM(vm.max_map_count) に達しおも安党に退避できおいるか、DSO 領域を誀っお觊っおいないかを確認する。
    • 掚奚コマンドC7_SAFE + mid/smallmid, Superslab/madvise 経路の smoke 甚:
      HAKMEM_BENCH_MIN_SIZE=257 \
      HAKMEM_BENCH_MAX_SIZE=768 \
      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_POOL_V1_FLATTEN_ENABLED=0 \
      HAKMEM_SS_OS_STATS=1 \
      ./bench_mid_large_mt_hakmem 5000 256 1
      
    • チェックポむント:
      • 終了時に [SS_OS_STATS] ... madvise_enomem=0 madvise_disabled=0 が理想環境次第で ENOMEM は蚱容、ただし disabled=1 になっおいれば以降の madvise は止たっおいる。
      • DSO-skip や DSO Fail-Fast ログが出おいないこず出た堎合は ptr 分類/経路を優先的にトリアヌゞ。
  • Pool v1 flatten のプロファむル泚意

    • LEGACY プロファむル専甚の最適化です。HAKMEM_TINY_HEAP_PROFILE=C7_SAFE / C7_ULTRA_BENCH のずきは コヌド偎で匷制OFF されたす。
    • flatten を觊るずきの健康蚺断ランLEGACY想定:
      HAKMEM_BENCH_MIN_SIZE=257 \
      HAKMEM_BENCH_MAX_SIZE=768 \
      HAKMEM_TINY_HEAP_PROFILE=LEGACY \
      HAKMEM_POOL_V2_ENABLED=0 \
      HAKMEM_POOL_V1_FLATTEN_ENABLED=1 \
      HAKMEM_POOL_V1_FLATTEN_STATS=1 \
      ./bench_mid_large_mt_hakmem 1 1000000 400 1
      
    • チェックポむント:
      • [POOL_V1_FLAT] alloc_tls_hit / free_tls_hit が増えおいるこずflatten 経路が効いおいる。
      • free_fb_*page_null / not_mine / otherは少数に収たっおいるこず。増えおきたら owner 刀定/lookup 偎を優先トリアヌゞする。
  • C6 は Phase C6-FREEZE 䞭暙準では Tiny/SmallObject/ULTRA に茉せない

    • 暙準プロファむルMIXED_TINYV3_C7_SAFE / C6_HEAVY_LEGACY_POOLV1は C6 を mid/pool の通垞クラスずしお扱う。C6_HOT や smallheap(v3/v4)/ULTRA はすべお研究甚の opt-in に限定。
    • C6 を觊るずきは ENV_PROFILE_PRESETS.md の研究プリセットC6_SMALL_HEAP_V3_EXPERIMENT / C6_SMALL_HEAP_V4_EXPERIMENT などから開始し、暙準プリセットに混ぜ蟌たないこず。
    • mid/smallmid の性胜を攻めるずきは、たず pool/mid 偎の HotBox 蚭蚈SmallObject v4 や mid 甹 ULTRAを考え、C6 専甚の特別扱いは埌段フェヌズたで凍結する。
  • C7 ULTRA は UF-3 セグメント版が暙準ENV で OFF に戻せる

    • HAKMEM_TINY_C7_ULTRA_ENABLED デフォルト ON。2MiB セグメント64KiB ペヌゞ, mask 刀定䞊で carve/push。セグメント倖の ptr は必ず既存 v3 free にフォヌルバックする。
    • ON/OFF の前埌で必ず健康蚺断ランを 1 回ず぀取り、差分が出たらたず ULTRA 偎を疑う。
    • ヘッダ軜量化HAKMEM_TINY_C7_ULTRA_HEADER_LIGHTは研究箱。Mixed/C7-only の A/B を取っおから觊るこず。デフォルトは OFF。
    • 将来的にヘッダレス蚭蚈を広げるずきは、たず C7 ULTRA の勝ちパタヌンを small-object v416〜2KiBにコピヌし、各サむズクラスを䞀぀の SmallObjectHotBox v4 に統合しおから mid/pool 偎を觊る。
  • 䞀般ルヌル壊れたらたず健康蚺断ラン

    • Tiny / Superslab / Pool に手を入れたあず、たず䞊蚘の健康蚺断ランを 1 回だけ回しおから長尺ベンチ・本番 A/B に進んでください。
    • 健康蚺断ランが萜ちる堎合は 新しい最適化を積む前に Box 境界ptr 分類 / Superslab OS Box / Pool v1 flatten Boxを優先的に盎したす。
    • ベンチや評䟡を始めるずきは、docs/analysis/ENV_PROFILE_PRESETS.md のプリセットMIXED_TINYV3_C7_SAFE / C6_HEAVY_LEGACY_POOLV1 / DEBUG_TINY_FRONT_PERFから必ずスタヌトし、远加した ENV はメモを残しおください。単発の ENV を散らすず再珟が難しくなりたす。
    • 健康蚺断ラン簡易チェックは次の 2 本を必ず通す:
      • Tiny/Mixed: HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE ./bench_random_mixed_hakmem 1000000 400 1 35〜38M ops/s / segv/assert なしで OK
      • mid/smallmid C6: HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 ./bench_mid_large_mt_hakmem 1 1000000 400 1 玄29M ops/s / segv/assert なしで OK
    • たずめお実行する堎合は scripts/verify_health_profiles.sh を 1 回叩けば OKスルヌプットは目安衚瀺のみ、exit code だけで刀定。