97 lines
3.0 KiB
Markdown
97 lines
3.0 KiB
Markdown
|
|
# Phase 60: Alloc Pass-Down SSOT(重複スナップショット/ルート計算の排除)
|
|||
|
|
|
|||
|
|
目的:
|
|||
|
|
- 現状の層(FastLane/Box群)と学習層(OFF)を維持したまま、**alloc 側の op-per-loop 冗長**を削って **+5–10% の積み上げ**を狙う。
|
|||
|
|
- 方針は Phase 19-6C(free 側 pass-down)と同型: **入口で 1回だけ計算し、下流へ引き回す**(境界 1 箇所、単純化)。
|
|||
|
|
|
|||
|
|
スコープ:
|
|||
|
|
- 対象: alloc hot path(`malloc_tiny_fast.h` / `front_fastlane_try_alloc()` 相当)
|
|||
|
|
- 非対象: アルゴリズム刷新(segment/page 再設計)、研究箱の物理削除(layout tax リスク)
|
|||
|
|
|
|||
|
|
成功基準(A/B):
|
|||
|
|
- Mixed 10-run mean(FAST build)で **+1.0% 以上 = GO**
|
|||
|
|
- ±1.0% = NEUTRAL(freeze、code cleanliness 目的で保持)
|
|||
|
|
- -1.0% 以下 = NO-GO(revert)
|
|||
|
|
|
|||
|
|
計測の正:
|
|||
|
|
- `BENCH_BIN=./bench_random_mixed_hakmem_minimal scripts/run_mixed_10_cleanenv.sh`
|
|||
|
|
- 比較は **同一バイナリ + ENV トグル**(別バイナリ比較は layout 混入)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Step 0: Runtime 実行確認(必須)
|
|||
|
|
|
|||
|
|
Phase 40/41 の教訓: ASM にあっても実行されない最適化は触らない。
|
|||
|
|
|
|||
|
|
- `perf report --no-children` で top 50 に alloc 側の対象関数が入っていることを確認する。
|
|||
|
|
- 対象候補(例):
|
|||
|
|
- `malloc_tiny_fast*`
|
|||
|
|
- `front_fastlane_try_alloc*`
|
|||
|
|
- `tiny_c7_ultra_alloc`
|
|||
|
|
- `unified_cache_pop_or_refill`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Step 1: L0 ENV box(戻せる)
|
|||
|
|
|
|||
|
|
新規:
|
|||
|
|
- `core/box/alloc_passdown_ssot_env_box.{h,c}`(or `.h` only)
|
|||
|
|
|
|||
|
|
ENV:
|
|||
|
|
- `HAKMEM_ALLOC_PASSDOWN_SSOT=0/1`(default: 0)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Step 2: L1 “入口で 1回だけ” helper(SSOT)
|
|||
|
|
|
|||
|
|
設計:
|
|||
|
|
- alloc 入口で必要な情報(例: `route_kind`, `use_tiny_heap`, `class_idx`, `policy_snapshot_ptr`)を 1 回だけ確定する。
|
|||
|
|
- 下流の cold/slow/refill には **引数で渡す**(再計算禁止)。
|
|||
|
|
|
|||
|
|
実装指針:
|
|||
|
|
- `static inline` helper でまとめる(関数分割を増やさない=layout tax 回避)
|
|||
|
|
- 例:
|
|||
|
|
- `alloc_compute_route_and_heap(class_idx, ...) -> {route_kind, use_tiny_heap}`
|
|||
|
|
- `alloc_select_handler(route_kind, ...)`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Step 3: 下流の重複を除去(pass-down)
|
|||
|
|
|
|||
|
|
典型的に削れる冗長:
|
|||
|
|
- policy snapshot の二重取得
|
|||
|
|
- `tiny_route_for_class()` の複数回呼び出し
|
|||
|
|
- route kind → heap kind 判定の重複
|
|||
|
|
|
|||
|
|
注意:
|
|||
|
|
- 入口の branch を増やしすぎない(Phase 43 の教訓: branch は store より高い)
|
|||
|
|
- “monolithic + early-exit” を優先し、noinline helper 乱立は避ける
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Step 4: A/B(Mixed 10-run)
|
|||
|
|
|
|||
|
|
OFF:
|
|||
|
|
- `HAKMEM_ALLOC_PASSDOWN_SSOT=0`
|
|||
|
|
|
|||
|
|
ON:
|
|||
|
|
- `HAKMEM_ALLOC_PASSDOWN_SSOT=1`
|
|||
|
|
|
|||
|
|
判定:
|
|||
|
|
- GO: +1.0% 以上
|
|||
|
|
- NEUTRAL: ±1.0%
|
|||
|
|
- NO-GO: -1.0% 以下(即 revert)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Rollback
|
|||
|
|
|
|||
|
|
- `HAKMEM_ALLOC_PASSDOWN_SSOT=0`(同一バイナリで切戻し)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 次(Phase 60B/C 候補)
|
|||
|
|
|
|||
|
|
- 60B: TLS “同じ値を 1回だけ読む” を徹底(alloc/free 入口で snapshot/passdown)
|
|||
|
|
- 60C: `unified_cache_*` の telemetry(release atomics/relaxed counters)見直し(compile-out)
|