Phase 13 v1 + E5-2 retest: Both NEUTRAL, freeze as research boxes
Phase 13 v1: Header Write Elimination (C7 preserve header)
- Verdict: NEUTRAL (+0.78%)
- Implementation: HAKMEM_TINY_C7_PRESERVE_HEADER ENV gate (default OFF)
- Makes C7 nextptr offset conditional (0→1 when enabled)
- 4-point matrix A/B test results:
* Case A (baseline): 51.49M ops/s
* Case B (WRITE_ONCE=1): 52.07M ops/s (+1.13%)
* Case C (C7_PRESERVE=1): 51.36M ops/s (-0.26%)
* Case D (both): 51.89M ops/s (+0.78% NEUTRAL)
- Action: Freeze as research box (default OFF, manual opt-in)
Phase 5 E5-2: Header Write-Once retest (promotion test)
- Verdict: NEUTRAL (+0.54%)
- Motivation: Phase 13 Case B showed +1.13%, re-tested with dedicated 20-run
- Results (20-run):
* Case A (baseline): 51.10M ops/s
* Case B (WRITE_ONCE=1): 51.37M ops/s (+0.54%)
- Previous test: +0.45% (consistent with NEUTRAL)
- Action: Keep as research box (default OFF, manual opt-in)
Key findings:
- Header write tax optimization shows consistent NEUTRAL results
- Neither Phase 13 v1 nor E5-2 reaches GO threshold (+1.0%)
- Both implemented as reversible ENV gates for future research
Files changed:
- New: core/box/tiny_c7_preserve_header_env_box.{c,h}
- Modified: core/box/tiny_layout_box.h (C7 offset conditional)
- Modified: core/tiny_nextptr.h, core/box/tiny_header_box.h (comments)
- Modified: core/bench_profile.h (refresh sync)
- Modified: Makefile (add new .o files)
- Modified: scripts/run_mixed_10_cleanenv.sh (add C7_PRESERVE ENV)
- Docs: PHASE13_*, PHASE5_E5_2_HEADER_WRITE_ONCE_* (design/results)
Next: Phase 14 (Pointer-chase reduction, tcache-style intrusive LIFO)
🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -0,0 +1,58 @@
|
||||
# Phase 13 v1: Header Write Elimination(C7 preserve header)A/B 結果
|
||||
|
||||
**Date**: 2025-12-14
|
||||
**Verdict**: ⚪ **NEUTRAL**(Phase 13 v1 は research box freeze / default OFF)
|
||||
|
||||
設計: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_DESIGN.md`
|
||||
手順: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_NEXT_INSTRUCTIONS.md`
|
||||
|
||||
---
|
||||
|
||||
## 1. 目的
|
||||
|
||||
Phase 12 の gap 仮説(header write tax)に対して、Phase 13 v1 は:
|
||||
|
||||
- **ヘッダを消さずに維持**
|
||||
- C7 の freelist がヘッダを壊さない(header-preserving)ようにして
|
||||
- **E5-2(header write-once)を C7 にも拡張**できるかを検証する
|
||||
|
||||
---
|
||||
|
||||
## 2. 4点マトリクス(throughput)
|
||||
|
||||
| Case | HAKMEM_TINY_C7_PRESERVE_HEADER | HAKMEM_TINY_HEADER_WRITE_ONCE | ops/s | vs Case A |
|
||||
|------|--------------------------------|-------------------------------|-------|----------|
|
||||
| A | 0 | 0 | 51,490,500 | baseline |
|
||||
| B | 0 | 1 | 52,070,600 | **+1.13%** |
|
||||
| C | 1 | 0 | 51,355,200 | -0.26% |
|
||||
| D | 1 | 1 | 51,891,902 | +0.78% |
|
||||
|
||||
結論:
|
||||
- Phase 13 v1(Case D)は **+0.78%** → **NEUTRAL**(GO閾値 +1.0% 未満)
|
||||
- **E5-2 単体(Case B)が +1.13% で GO 相当**という重要な副産物が得られた
|
||||
|
||||
---
|
||||
|
||||
## 3. 判定
|
||||
|
||||
### 3.1 Phase 13 v1(C7 preserve header)
|
||||
|
||||
- **Verdict**: ⚪ NEUTRAL → **research box freeze(default OFF)**
|
||||
- 推定原因:
|
||||
- C7 preserve による freelist next のオフセット変更が、保存できた write を相殺(未確定)
|
||||
|
||||
### 3.2 Phase 5 E5-2(Header write-once)
|
||||
|
||||
- **再テスト結果**:
|
||||
- Phase 13 matrix の単発観測では **+1.13%**(Case B)
|
||||
- 専用 clean env 20-run 再テストでは **+0.54%(NEUTRAL)** → research box 維持(default OFF)
|
||||
- 詳細: `docs/analysis/PHASE5_E5_2_HEADER_WRITE_ONCE_RETEST_AB_TEST_RESULTS.md`
|
||||
|
||||
---
|
||||
|
||||
## 4. Next Actions(推奨)
|
||||
|
||||
1. Phase 13 v1 は freeze(保持はするが default OFF)
|
||||
2. E5-2 は freeze(default OFF)
|
||||
3. Phase 13 v1 の派生案(必要なら):
|
||||
- C7 の next を “より aligned” な位置に置く設計(v1b)を研究箱で検討
|
||||
146
docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_DESIGN.md
Normal file
146
docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_DESIGN.md
Normal file
@ -0,0 +1,146 @@
|
||||
# Phase 13: Header Write Elimination v1(C7 Header-Preserving Freelist)
|
||||
|
||||
**Date**: 2025-12-14
|
||||
**Status**: DESIGN(Phase 13 kickoff)→ ⚪ **NEUTRAL (+0.78%)**(research box freeze, default OFF)
|
||||
|
||||
---
|
||||
|
||||
## 0. Executive Summary(1枚)
|
||||
|
||||
Phase 12 の比較で **system malloc (glibc) が hakmem より +63.7% 速い**ことが判明し、次の大きい構造差として **“steady-state のヘッダ書き込み(write tax)”** が最優先仮説になった。
|
||||
|
||||
ただし hakmem は free の hot path で `HEADER_MAGIC` を前提に **ヘッダを読む**ため、ヘッダを “無くす/壊す” と安全性が崩れる。
|
||||
|
||||
そこで Phase 13 v1 は「ヘッダ自体は維持」しつつ、**C7 の freelist でヘッダを上書きしない**設計に寄せて、既存の **E5-2 (Header write-once)** を **C7 にも適用可能にする**。
|
||||
|
||||
狙い:
|
||||
- C1-C6 は既に write-once で “alloc 時ヘッダ書き込み” をスキップ可能
|
||||
- **C7 は現状 “free の next がヘッダを潰す” ため、alloc で毎回ヘッダ再書き込みが必要**
|
||||
- C7 の next を **base+1(user 先頭)**へ移すとヘッダが保持され、write-once で alloc 側の再書き込みを削れる
|
||||
|
||||
---
|
||||
|
||||
## 1. 現状(なぜ C7 だけ毎回書いているのか)
|
||||
|
||||
### 1.1 重要な前提(現行の正)
|
||||
|
||||
- Free hot path(例: `core/front/malloc_tiny_fast.h` の `free_tiny_fast()`)は、
|
||||
- `ptr-1` の `HEADER_MAGIC` を検証し
|
||||
- class_idx を header から抽出している
|
||||
→ **ヘッダの正しさは safety と fast path の前提**
|
||||
|
||||
### 1.2 E5-2 (Header write-once) の適用範囲
|
||||
|
||||
- `core/box/tiny_header_box.h` の `tiny_header_finalize_alloc()` が、
|
||||
- `HAKMEM_TINY_HEADER_WRITE_ONCE=1` かつ
|
||||
- `tiny_class_preserves_header(class_idx)=true`(C1-C6)
|
||||
のとき、alloc 時の `tiny_region_id_write_header()` をスキップする。
|
||||
|
||||
### 1.3 C7 が write-once にならない理由(根本)
|
||||
|
||||
- `core/box/tiny_layout_box.h` の `tiny_nextptr_offset()` が
|
||||
- C7 は `next_off=0`(= `base+0` に next を書く)
|
||||
→ free 時に **ヘッダ領域を next pointer で上書き**する
|
||||
→ alloc で必ず `tiny_region_id_write_header()` を実行し直す必要がある
|
||||
|
||||
(C0 も同じだが、C0 は stride 8B のため `base+1` に 8B next を置けない制約がある)
|
||||
|
||||
---
|
||||
|
||||
## 2. 提案(Phase 13 v1)
|
||||
|
||||
### 2.1 変更のコア
|
||||
|
||||
**C7 の next pointer を `base+1`(user 先頭)に移す**:
|
||||
|
||||
- Before(現行):
|
||||
- C7: `next_off=0` → `*(void**)base = next`(ヘッダ破壊)
|
||||
- After(Phase 13 v1):
|
||||
- C7: `next_off=1` → `memcpy(base+1, &next, 8)`(ヘッダ保持)
|
||||
|
||||
これにより C7 が “header-preserving class” になり、E5-2 の write-once が C7 にも効く。
|
||||
|
||||
### 2.2 Box Theory(箱割り)
|
||||
|
||||
```
|
||||
L0: tiny_c7_preserve_header_env_box (ENV gate, A/B, refresh)
|
||||
↓
|
||||
L1: tiny_layout_box (tiny_nextptr_offset の SSOT)
|
||||
↓
|
||||
L2: tiny_nextptr (next load/store は SSOT を参照)
|
||||
↓
|
||||
L3: tiny_header_box (class_preserves_header → write-once 適用)
|
||||
```
|
||||
|
||||
境界は 1 箇所:
|
||||
- 「C7 の next オフセット決定」= `tiny_nextptr_offset()` に集約(他で分岐しない)
|
||||
|
||||
### 2.3 戻せる(A/B)
|
||||
|
||||
- ENV: `HAKMEM_TINY_C7_PRESERVE_HEADER=0/1`(default: 0)
|
||||
- まずは research box として導入し、GO なら preset 昇格
|
||||
|
||||
---
|
||||
|
||||
## 3. Safety / Invariants(Fail-Fast)
|
||||
|
||||
### 3.1 不変条件
|
||||
|
||||
- `tiny_next_store/load` は **常に** `tiny_nextptr_offset()` を参照(直書き禁止)
|
||||
- `tiny_class_preserves_header(class_idx)` は offset!=0 で決まる(ハードコード禁止)
|
||||
- C7 preserve ON のとき:
|
||||
- free 後も `*(uint8_t*)base == HEADER_MAGIC|cls` が保持される(ヘッダ破壊が起きない)
|
||||
|
||||
### 3.2 Fail-Fast(debug 限定)
|
||||
|
||||
- デバッグのみ、C7 preserve ON のときに:
|
||||
- `tiny_header_validate(base, 7, ...)` の mismatch をワンショットで出す
|
||||
- release では常時ログ無し、必要なら stats カウンタのみ
|
||||
|
||||
---
|
||||
|
||||
## 4. A/B 計測計画(同一バイナリ)
|
||||
|
||||
この変更は “freelist next の配置” を変えるため、本来は layout 差になるが、Phase 13 v1 は **ENV で切替**できるようにして同一バイナリ A/B を維持する(Phase 5-7 の教訓)。
|
||||
|
||||
### 4.1 4点マトリクス(必須)
|
||||
|
||||
| Case | HAKMEM_TINY_C7_PRESERVE_HEADER | HAKMEM_TINY_HEADER_WRITE_ONCE | 意味 |
|
||||
|------|--------------------------------|-------------------------------|------|
|
||||
| A | 0 | 0 | 現行 baseline |
|
||||
| B | 0 | 1 | E5-2 のみ(C1-C6) |
|
||||
| C | 1 | 0 | C7 next を user に移す(ヘッダは毎回書く) |
|
||||
| D | 1 | 1 | Phase 13 v1 本命(C1-C7 を write-once) |
|
||||
|
||||
### 4.2 GO/NO-GO(Mixed 10-run)
|
||||
|
||||
- GO: mean **+1.0% 以上**
|
||||
- NO-GO: mean **-1.0% 以下**
|
||||
- NEUTRAL: ±1.0% → freeze(research box)
|
||||
|
||||
---
|
||||
|
||||
## 5. リスクと対策
|
||||
|
||||
### リスク 1: C7 next が unaligned になり memcpy 経由で遅くなる
|
||||
|
||||
- 対策: Case C(write-once 無し)を必ず測り、layout 変更単体のコストを分離する
|
||||
- もし C が大きく負ける場合:
|
||||
- “C7 next offset=8(aligned)” の派生案を検討(Phase 13 v1b)
|
||||
|
||||
### リスク 2: class_idx ハードコードが残っていて壊れる
|
||||
|
||||
- 対策: `rg "== 7|!= 7|C7 uses offset 0"` を掃除し、SSOT(`tiny_layout_box`)参照に寄せる
|
||||
|
||||
### リスク 3: ENV refresh が bench_profile putenv に追従しない
|
||||
|
||||
- 対策: Phase 8 と同様に `*_env_refresh_from_env()` を用意し、`bench_profile.h` から呼ぶ
|
||||
|
||||
---
|
||||
|
||||
## 6. 次(Phase 13 以降の視界)
|
||||
|
||||
Phase 13 v1 は「ヘッダを “消す”」ではなく「**steady-state のヘッダ再書き込みを減らす**」に寄せる。
|
||||
|
||||
もし system malloc との差がまだ大きい場合、次の大テーマは:
|
||||
- Thread cache(tcache 相当の構造)を TinyUnifiedCache に移植する(Phase 14 候補)
|
||||
@ -0,0 +1,134 @@
|
||||
# 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 のまま)、設計メモに原因を記録
|
||||
@ -9,6 +9,19 @@
|
||||
|
||||
---
|
||||
|
||||
## Addendum(2025-12-14)
|
||||
|
||||
Phase 13 v1 の 4点マトリクスで、`HAKMEM_TINY_HEADER_WRITE_ONCE=1` 単体が **+1.13%** を観測(候補)。
|
||||
|
||||
- 結果: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_AB_TEST_RESULTS.md`
|
||||
- ただし、専用 clean env 20-run 再テストでは **+0.54%(NEUTRAL)** となり、昇格は見送り。
|
||||
- 詳細: `docs/analysis/PHASE5_E5_2_HEADER_WRITE_ONCE_RETEST_AB_TEST_RESULTS.md`
|
||||
|
||||
結論:
|
||||
- E5-2 は research box のまま維持(default OFF)。
|
||||
|
||||
---
|
||||
|
||||
## A/B Test Results (Mixed Workload)
|
||||
|
||||
### Configuration
|
||||
|
||||
@ -6,6 +6,12 @@
|
||||
**Baseline**: 43.998M ops/s (Mixed, 40M iters, ws=400, E4-1+E4-2+E5-1 ON)
|
||||
**Goal**: +1-3% by moving header writes from allocation hot path to refill cold boundary
|
||||
|
||||
**Update (2025-12-14)**:
|
||||
- Phase 13 v1 の 4点マトリクスで `HAKMEM_TINY_HEADER_WRITE_ONCE=1` 単体が **+1.13%** を観測(候補)。
|
||||
- `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_AB_TEST_RESULTS.md`
|
||||
- 専用 clean env 20-run 再テストでは **+0.54%(NEUTRAL)** → 昇格は見送り。
|
||||
- `docs/analysis/PHASE5_E5_2_HEADER_WRITE_ONCE_RETEST_AB_TEST_RESULTS.md`
|
||||
|
||||
---
|
||||
|
||||
## Hypothesis
|
||||
|
||||
@ -0,0 +1,76 @@
|
||||
# Phase 5 E5-2: Header Write-Once — Promotion 判定用 指示書
|
||||
|
||||
**Status**: ✅ COMPLETE → ⚪ NEUTRAL(昇格見送り)
|
||||
|
||||
結果: `docs/analysis/PHASE5_E5_2_HEADER_WRITE_ONCE_RETEST_AB_TEST_RESULTS.md`
|
||||
|
||||
## 0. 背景
|
||||
|
||||
過去の E5-2 A/B では NEUTRAL だったが、Phase 13 v1 の 4点マトリクス再計測で
|
||||
`HAKMEM_TINY_HEADER_WRITE_ONCE=1` 単体が **+1.13%** を記録し、GO候補になった。
|
||||
|
||||
参照:
|
||||
- 旧結果: `docs/analysis/PHASE5_E5_2_HEADER_REFILL_ONCE_AB_TEST_RESULTS.md`
|
||||
- 新観測: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_AB_TEST_RESULTS.md`
|
||||
|
||||
目的: **E5-2 を preset デフォルトへ昇格できるか**を “専用 A/B” で確定する。
|
||||
|
||||
---
|
||||
|
||||
## 1. A/B 手順(clean env, 同一バイナリ)
|
||||
|
||||
推奨: Mixed 20-run(mean/median を確度高めに取る)
|
||||
|
||||
### A: baseline(WRITE_ONCE=0)
|
||||
|
||||
```sh
|
||||
RUNS=20 HAKMEM_TINY_HEADER_WRITE_ONCE=0 scripts/run_mixed_10_cleanenv.sh
|
||||
```
|
||||
|
||||
### B: optimized(WRITE_ONCE=1)
|
||||
|
||||
```sh
|
||||
RUNS=20 HAKMEM_TINY_HEADER_WRITE_ONCE=1 scripts/run_mixed_10_cleanenv.sh
|
||||
```
|
||||
|
||||
任意:
|
||||
- `HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1` でも 5-run を 0/1 で取る(回帰がないこと)
|
||||
|
||||
---
|
||||
|
||||
## 2. 判定ゲート
|
||||
|
||||
- **GO**: Mixed 20-run mean **+1.0% 以上** かつ median も正
|
||||
- **NO-GO**: mean **-1.0% 以下**
|
||||
- **NEUTRAL**: それ以外(±1.0%)→ research box 維持(default OFF)
|
||||
|
||||
---
|
||||
|
||||
## 3. GO の場合の昇格手順(小パッチ)
|
||||
|
||||
### Patch P1: preset 昇格
|
||||
|
||||
- `core/bench_profile.h`(対象プリセット)に追加:
|
||||
- `bench_setenv_default("HAKMEM_TINY_HEADER_WRITE_ONCE", "1");`
|
||||
|
||||
最初は `MIXED_TINYV3_C7_SAFE` のみに昇格でよい(C6-heavy は任意)。
|
||||
|
||||
### Patch P2: cleanenv スクリプト更新(ENV 漏れ防止)
|
||||
|
||||
`scripts/run_mixed_10_cleanenv.sh` のデフォルト値を見直す:
|
||||
- 昇格後は `HAKMEM_TINY_HEADER_WRITE_ONCE` を “研究 knob” 扱いしない
|
||||
- 例: `export HAKMEM_TINY_HEADER_WRITE_ONCE=${HAKMEM_TINY_HEADER_WRITE_ONCE:-1}`
|
||||
|
||||
(既存の運用: export された値は bench_setenv_default が上書きできないため)
|
||||
|
||||
### Patch P3: ドキュメント更新
|
||||
|
||||
- 新しい再計測結果を 1 本にまとめる(例: `docs/analysis/PHASE5_E5_2_HEADER_REFILL_ONCE_RETEST_AB_TEST_RESULTS.md`)
|
||||
- `CURRENT_TASK.md` に “E5-2 ADOPT” の記録を追記
|
||||
|
||||
---
|
||||
|
||||
## 4. NO-GO/NEUTRAL の場合
|
||||
|
||||
- `HAKMEM_TINY_HEADER_WRITE_ONCE` は research box のまま(default OFF)
|
||||
- 旧結果との差分要因(ベースライン差 / env 漏れ / build 形状)をメモして凍結
|
||||
@ -0,0 +1,177 @@
|
||||
# Phase 5 E5-2: Header Write-Once — 再テスト結果(昇格判定)
|
||||
|
||||
**Date**: 2025-12-14
|
||||
**Verdict**: ⚪ **NEUTRAL (+0.54%)** — Research box 維持(default OFF)
|
||||
|
||||
背景: `docs/analysis/PHASE5_E5_2_HEADER_REFILL_ONCE_AB_TEST_RESULTS.md`
|
||||
指示: `docs/analysis/PHASE5_E5_2_HEADER_WRITE_ONCE_PROMOTION_NEXT_INSTRUCTIONS.md`
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景
|
||||
|
||||
Phase 13 v1 の 4点マトリクス A/B で `HAKMEM_TINY_HEADER_WRITE_ONCE=1` 単体が **+1.13%** を記録し、GO 候補として浮上したため、専用の clean env 20-run で昇格可否を判定。
|
||||
|
||||
参照: `docs/analysis/PHASE13_HEADER_WRITE_ELIMINATION_1_AB_TEST_RESULTS.md` (Case B)
|
||||
|
||||
---
|
||||
|
||||
## 2. テスト構成
|
||||
|
||||
- **Benchmark**: scripts/run_mixed_10_cleanenv.sh
|
||||
- **Profile**: MIXED_TINYV3_C7_SAFE
|
||||
- **Iterations**: 20,000,000 per run
|
||||
- **Working set**: 400
|
||||
- **Runs**: 20 per case
|
||||
- **ENV**: `HAKMEM_TINY_C7_PRESERVE_HEADER=0` 固定(C7 preserve は使用しない)
|
||||
|
||||
---
|
||||
|
||||
## 3. 結果(20-run)
|
||||
|
||||
| Case | WRITE_ONCE | Mean (ops/s) | Median (ops/s) | Delta vs A |
|
||||
|------|------------|--------------|----------------|------------|
|
||||
| A (baseline) | 0 | 51,096,839 | 51,127,725 | — |
|
||||
| B (optimized) | 1 | 51,371,358 | 51,495,811 | **+0.54%** |
|
||||
|
||||
---
|
||||
|
||||
## 4. 判定
|
||||
|
||||
### 4.1 GO 条件
|
||||
|
||||
- Mean **+1.0%** 以上 かつ Median も正
|
||||
- 今回: Mean +0.54%, Median +0.72%
|
||||
|
||||
### 4.2 Verdict
|
||||
|
||||
- **NEUTRAL (+0.54%)** → Research box 維持(default OFF)
|
||||
- GO 閾値 (+1.0%) に到達せず
|
||||
|
||||
---
|
||||
|
||||
## 5. 考察
|
||||
|
||||
### 5.1 Phase 13 の 4点マトリクスとの差異
|
||||
|
||||
| Test | WRITE_ONCE=1 結果 | Runs | Baseline |
|
||||
|------|-------------------|------|----------|
|
||||
| Phase 13 (Case B) | **+1.13%** | 10 | 51,490,500 ops/s |
|
||||
| 今回 (専用 20-run) | **+0.54%** | 20 | 51,096,839 ops/s |
|
||||
|
||||
**差分要因**:
|
||||
1. **Baseline の揺らぎ**: Phase 13 の baseline (51.49M) vs 今回 (51.10M) で約 -0.76% の差
|
||||
2. **測定回数**: 10-run vs 20-run(20-run の方が信頼性が高い)
|
||||
3. **ENV 汚染**: Phase 13 では 4 ケースを連続実行(ENV リーク可能性)
|
||||
|
||||
### 5.2 Phase 5 E5-2 旧結果との比較
|
||||
|
||||
旧テスト(`PHASE5_E5_2_HEADER_REFILL_ONCE_AB_TEST_RESULTS.md`):
|
||||
- 結果: +0.45% (NEUTRAL)
|
||||
- 今回: +0.54% (NEUTRAL)
|
||||
|
||||
**一貫性**: 両テストとも NEUTRAL 範囲内で一貫
|
||||
|
||||
---
|
||||
|
||||
## 6. Next Actions
|
||||
|
||||
### 6.1 E5-2 の扱い
|
||||
|
||||
- ✅ Research box として維持(default OFF、manual opt-in)
|
||||
- ENV: `HAKMEM_TINY_HEADER_WRITE_ONCE=0/1` (default: 0)
|
||||
|
||||
### 6.2 Phase 13 v1 の扱い
|
||||
|
||||
- ✅ Research box として維持(default OFF)
|
||||
- ENV: `HAKMEM_TINY_C7_PRESERVE_HEADER=0/1` (default: 0)
|
||||
|
||||
### 6.3 次の最適化
|
||||
|
||||
Phase 12 Strategic Pause の gap 仮説リストに戻る:
|
||||
1. ~~Header write tax~~ → Phase 13 v1 NEUTRAL, E5-2 NEUTRAL
|
||||
2. **Pointer chase overhead** (次の候補)
|
||||
3. Lock contention (if applicable)
|
||||
4. Memory fence overhead
|
||||
5. Metadata access patterns
|
||||
|
||||
---
|
||||
|
||||
## 7. Raw Data
|
||||
|
||||
### Case A (baseline, WRITE_ONCE=0)
|
||||
```
|
||||
Run 1: 50725850 ops/s
|
||||
Run 2: 51547217 ops/s
|
||||
Run 3: 51076712 ops/s
|
||||
Run 4: 51527474 ops/s
|
||||
Run 5: 51193070 ops/s
|
||||
Run 6: 51597708 ops/s
|
||||
Run 7: 52239171 ops/s
|
||||
Run 8: 52386008 ops/s
|
||||
Run 9: 51618321 ops/s
|
||||
Run 10: 50919588 ops/s
|
||||
Run 11: 52415403 ops/s
|
||||
Run 12: 51125404 ops/s
|
||||
Run 13: 49785086 ops/s
|
||||
Run 14: 50915858 ops/s
|
||||
Run 15: 51130046 ops/s
|
||||
Run 16: 48960162 ops/s
|
||||
Run 17: 51385756 ops/s
|
||||
Run 18: 50849945 ops/s
|
||||
Run 19: 50550500 ops/s
|
||||
Run 20: 49987500 ops/s
|
||||
|
||||
Mean: 51096838.95 ops/s
|
||||
Median: 51127725.00 ops/s
|
||||
```
|
||||
|
||||
### Case B (optimized, WRITE_ONCE=1)
|
||||
```
|
||||
Run 1: 51594697 ops/s
|
||||
Run 2: 50145581 ops/s
|
||||
Run 3: 52268972 ops/s
|
||||
Run 4: 52083686 ops/s
|
||||
Run 5: 50612405 ops/s
|
||||
Run 6: 50556552 ops/s
|
||||
Run 7: 49910193 ops/s
|
||||
Run 8: 52657108 ops/s
|
||||
Run 9: 52053748 ops/s
|
||||
Run 10: 51957521 ops/s
|
||||
Run 11: 52417281 ops/s
|
||||
Run 12: 51712162 ops/s
|
||||
Run 13: 51531743 ops/s
|
||||
Run 14: 50832685 ops/s
|
||||
Run 15: 51337254 ops/s
|
||||
Run 16: 51218309 ops/s
|
||||
Run 17: 50110155 ops/s
|
||||
Run 18: 51459878 ops/s
|
||||
Run 19: 51931080 ops/s
|
||||
Run 20: 51036152 ops/s
|
||||
|
||||
Mean: 51371358.10 ops/s
|
||||
Median: 51495810.50 ops/s
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Rollback 手順
|
||||
|
||||
Phase 5 E5-2 は ENV-gated で default OFF。Rollback 不要。
|
||||
|
||||
手動で無効化する場合:
|
||||
```sh
|
||||
export HAKMEM_TINY_HEADER_WRITE_ONCE=0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. まとめ
|
||||
|
||||
Phase 5 E5-2 (Header Write-Once) は 20-run 再テストで **+0.54% (NEUTRAL)** を記録。
|
||||
|
||||
- GO 閾値 (+1.0%) に到達せず
|
||||
- Research box として維持(default OFF、manual opt-in)
|
||||
- Phase 13 v1 も同様に research box 維持
|
||||
|
||||
次のステップ: Phase 12 Strategic Pause の次の gap 仮説に進む
|
||||
Reference in New Issue
Block a user