Files
hakmem/PHASE_ML1_CHATGPT_GUIDE.md

63 lines
3.5 KiB
Markdown
Raw Normal View History

# PHASE ML1: ChatGPT 依頼用ガイドPool v1 memset 89.73% 課題)
## 1. 背景情報
- mid/smallmid (C6-heavy, Pool v1/flatten 系) のベンチで `__memset_avx2_unaligned_erms` が self 89.73% を占有perf 実測)。
- 目的: Pool v1 の zero コストを減らす(デフォルト安全は維持しつつ、ベンチ専用の opt-in を用意)。
- 現状: zero mode を pool_api.inc.h に直接足したところ、ベンチ起動直後にセグフォが発生。
## 2. 問題の詳細
- セグフォの推測要因
- pool_api.inc.h が複数翻訳単位から include され、`static` キャッシュ変数が TU ごとにばらける。
- ENV 読み取りをヘッダ内で直接行ったため、初期化順や再定義が崩れている可能性。
- ZERO_MODE=header 実装が TLS/flatten 経路と食い違っているかもしれない。
- 現在のコード(問題箇所のイメージ)
- `HAKMEM_POOL_ZERO_MODE` をヘッダ内で `static int g=-1; getenv(...);` する小さな関数を追加しただけで segfault。
## 3. 修正案2択
- 選択肢 A: Environment Cache を使う(推奨)
- `core/hakmem_env_cache.h` など既存の ENV キャッシュ箱に「pool_zero_mode」を追加し、ヘッダ側は薄い getter だけにする。
- 1 箇所で getenv/パース → 全翻訳単位で一貫させる(箱理論: 変換点を 1 箇所に)。
- 選択肢 B: 制約を緩和(暫定)
- ヘッダで ENV を読まない。zero/partial memset を呼ぶかどうかを、C 側の単一関数で判定して呼び出すだけに戻す。
- まずセグフォを解消し、memset の最適化は後続フェーズに送る。
## 4. 詳細な調査手順
- memset 呼び出し元の再確認
```bash
rg \"memset\" core/hakmem_pool.c core/box/pool_api.inc.h
```
- perf の再取得C6-heavy LEGACY/flatten なし)
```bash
export HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1
perf record -F 5000 --call-graph dwarf -e cycles:u -o perf.data.ml1 \
./bench_mid_large_mt_hakmem 1 1000000 400 1
perf report -i perf.data.ml1 --stdio | rg memset
perf annotate -i perf.data.ml1 __memset_avx2_unaligned_erms | head -40
```
- 呼び出し階層を掘るTLS alloc か slow path かを確認)
```bash
perf script -i perf.data.ml1 --call-trace | rg -C2 'memset'
```
## 5. 実装の方向性の再検討
- TLS alloc path で memset が本当に呼ばれているかを必ず確認(`hak_pool_try_alloc_v1_flat` 周辺)。
- memset が page 初期化のみなら、ZERO_MODE は TLS ring には効かない可能性 → 方針を「page 初期化の頻度を減らす」に切替も検討。
- ZERO_MODE を入れる場合も:
- ENV キャッシュを 1 箇所に集約。
- デフォルトは FULL zero、header/off は bench opt-in。
- Fail-Fast: 異常 ENV はログして既定値にフォールバック。
## 6. テストコマンドA/B
```bash
# ベースラインFULL zero
export HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1
timeout 120 ./bench_mid_large_mt_hakmem 1 1000000 400 1
# header modememset を軽量化する実装を入れたら)
export HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1
export HAKMEM_POOL_ZERO_MODE=header
timeout 120 ./bench_mid_large_mt_hakmem 1 1000000 400 1
```
- 比較: ops/s, SS/POOL statsあれば memset 呼び出し数 proxy、セグフォ/アサートがないこと。
- header mode で +3〜5% 程度伸びれば成功。負になれば撤回 or slow-path のみに適用。