135 lines
3.7 KiB
Markdown
135 lines
3.7 KiB
Markdown
|
|
# Phase 13: Header Write Elimination v1 — 次の指示書(C7 preserve header)
|
|||
|
|
|
|||
|
|
## 0. Status
|
|||
|
|
|
|||
|
|
- Phase 12 で system malloc が hakmem より +63.7% 速いことが判明 → Phase 13 開始
|
|||
|
|
- 方針(v1): **ヘッダは維持**しつつ、**C7 の freelist がヘッダを壊さない**ようにして “alloc 時のヘッダ再書き込み” を削る
|
|||
|
|
- 結果: ⚪ **NEUTRAL (+0.78%) → freeze (default OFF)**(副産物: E5-2 が +1.13%)
|
|||
|
|
|
|||
|
|
設計: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_DESIGN.md`
|
|||
|
|
結果: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_AB_TEST_RESULTS.md`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 目的(GO 条件)
|
|||
|
|
|
|||
|
|
Mixed 10-run(clean env)で:
|
|||
|
|
- **GO**: mean +1.0% 以上
|
|||
|
|
- **NO-GO**: mean -1.0% 以下(即 rollback / freeze)
|
|||
|
|
- **NEUTRAL**: ±1.0%(research box freeze)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 実装パッチ順(小さく積む)
|
|||
|
|
|
|||
|
|
### Patch 1: L0 ENV Box(戻せる)
|
|||
|
|
|
|||
|
|
新規:
|
|||
|
|
- `core/box/tiny_c7_preserve_header_env_box.h`
|
|||
|
|
- `core/box/tiny_c7_preserve_header_env_box.c`(refresh)
|
|||
|
|
|
|||
|
|
仕様:
|
|||
|
|
- ENV: `HAKMEM_TINY_C7_PRESERVE_HEADER=0/1`(default: 0)
|
|||
|
|
- API:
|
|||
|
|
- `tiny_c7_preserve_header_enabled() -> int`
|
|||
|
|
- `tiny_c7_preserve_header_env_refresh_from_env()`
|
|||
|
|
|
|||
|
|
要件:
|
|||
|
|
- hot path では **getenv 禁止**(lazy init + cached read のみ)
|
|||
|
|
|
|||
|
|
### Patch 2: L1 Layout SSOT 変更(境界1箇所)
|
|||
|
|
|
|||
|
|
修正:
|
|||
|
|
- `core/box/tiny_layout_box.h`
|
|||
|
|
|
|||
|
|
変更:
|
|||
|
|
- `tiny_nextptr_offset(class_idx)` の C7 分だけを L0 gate で切替
|
|||
|
|
- OFF: 既存(C7 off=0)
|
|||
|
|
- ON: C7 off=1(header-preserving)
|
|||
|
|
|
|||
|
|
### Patch 3: L2 NextPtr のコメント/前提を SSOT 準拠に
|
|||
|
|
|
|||
|
|
修正(コードの挙動変更はしない):
|
|||
|
|
- `core/tiny_nextptr.h`
|
|||
|
|
- `core/box/tiny_header_box.h`(コメントの “C7=offset0 固定” 等があれば撤去)
|
|||
|
|
|
|||
|
|
狙い:
|
|||
|
|
- C7 の offset 固定前提を残さない(設計事故の芽を摘む)
|
|||
|
|
|
|||
|
|
### Patch 4: Bench profile の refresh 同期(ENV 事故防止)
|
|||
|
|
|
|||
|
|
修正:
|
|||
|
|
- `core/bench_profile.h`
|
|||
|
|
|
|||
|
|
追加:
|
|||
|
|
- `bench_setenv_default(...)` の後に `tiny_c7_preserve_header_env_refresh_from_env()` を呼ぶ
|
|||
|
|
|
|||
|
|
(Phase 8 と同じパターン)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. A/B テスト(4点マトリクス必須)
|
|||
|
|
|
|||
|
|
`scripts/run_mixed_10_cleanenv.sh` を使用(ENV リークを防ぐ)。
|
|||
|
|
|
|||
|
|
### Case A(baseline)
|
|||
|
|
|
|||
|
|
```sh
|
|||
|
|
HAKMEM_TINY_C7_PRESERVE_HEADER=0 \
|
|||
|
|
HAKMEM_TINY_HEADER_WRITE_ONCE=0 \
|
|||
|
|
scripts/run_mixed_10_cleanenv.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Case B(E5-2 only)
|
|||
|
|
|
|||
|
|
```sh
|
|||
|
|
HAKMEM_TINY_C7_PRESERVE_HEADER=0 \
|
|||
|
|
HAKMEM_TINY_HEADER_WRITE_ONCE=1 \
|
|||
|
|
scripts/run_mixed_10_cleanenv.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Case C(C7 preserve only)
|
|||
|
|
|
|||
|
|
```sh
|
|||
|
|
HAKMEM_TINY_C7_PRESERVE_HEADER=1 \
|
|||
|
|
HAKMEM_TINY_HEADER_WRITE_ONCE=0 \
|
|||
|
|
scripts/run_mixed_10_cleanenv.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Case D(Phase 13 v1 本命)
|
|||
|
|
|
|||
|
|
```sh
|
|||
|
|
HAKMEM_TINY_C7_PRESERVE_HEADER=1 \
|
|||
|
|
HAKMEM_TINY_HEADER_WRITE_ONCE=1 \
|
|||
|
|
scripts/run_mixed_10_cleanenv.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
追加(任意):
|
|||
|
|
- `HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1` でも 5-run を取る(回帰が無いこと)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. 可視化(最小)
|
|||
|
|
|
|||
|
|
既存:
|
|||
|
|
- `HAKMEM_TINY_HEADER_WRITE_ONCE_STATS=1` を使い、
|
|||
|
|
- `alloc_skip_count / alloc_write_count` の比率が増えることを確認する
|
|||
|
|
|
|||
|
|
新規を足す場合(必要最小):
|
|||
|
|
- “C7 で skip が増えている” が見えない場合のみ、C7 だけのカウンタを追加(常時 atomic は避ける)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. 昇格(GO の場合のみ)
|
|||
|
|
|
|||
|
|
GO のとき:
|
|||
|
|
1. `core/bench_profile.h` に default を追加
|
|||
|
|
- `bench_setenv_default("HAKMEM_TINY_C7_PRESERVE_HEADER", "1");`
|
|||
|
|
- (必要なら)`HAKMEM_TINY_HEADER_WRITE_ONCE=1` も昇格
|
|||
|
|
2. `CURRENT_TASK.md` に Phase 13 v1 の結果(A/B 表)を追記
|
|||
|
|
3. rollback 手順を明記
|
|||
|
|
- `export HAKMEM_TINY_C7_PRESERVE_HEADER=0`
|
|||
|
|
|
|||
|
|
NO-GO のとき:
|
|||
|
|
- research box freeze(default OFF のまま)、設計メモに原因を記録
|