63 lines
3.5 KiB
Markdown
63 lines
3.5 KiB
Markdown
|
|
# 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 mode(memset を軽量化する実装を入れたら)
|
|||
|
|
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 のみに適用。
|