110 lines
3.1 KiB
Markdown
110 lines
3.1 KiB
Markdown
|
|
# Phase 44 — Cache-miss / writeback profiling(次の芯を “測ってから” 決める)
|
|||
|
|
|
|||
|
|
Phase 42 の結論: gate は打ち止め(Top50 圏外)。
|
|||
|
|
Phase 43 の結論: header write を branch で削るのは負け筋(straight-line が強い)。
|
|||
|
|
|
|||
|
|
次は “どこで stall しているか” を定量化してから攻める。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 目的
|
|||
|
|
|
|||
|
|
FAST build(`make perf_fast`)の Mixed で、
|
|||
|
|
- `tiny_region_id_write_header`(alloc)
|
|||
|
|
- `unified_cache_push` / `tiny_c7_ultra_free`(free)
|
|||
|
|
が **L1/L2/LLC/DTLB/ストアバッファ**のどれで詰まっているかを特定する。
|
|||
|
|
|
|||
|
|
この Phase は **計測のみ**(コード変更ゼロ)でOK。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Step 0: 固定条件
|
|||
|
|
|
|||
|
|
- バイナリ: `./bench_random_mixed_hakmem_minimal`
|
|||
|
|
- 条件: `ITERS=200000000 WS=400`(短すぎるとノイズが増える)
|
|||
|
|
- clean env: `scripts/run_mixed_10_cleanenv.sh` は A/B 用。ここでは単発 perf 用に直接叩いてよい。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Step 1: perf stat(メモリ系カウンタ)
|
|||
|
|
|
|||
|
|
例(環境によってイベント名が違うので、まずは一般的なものを試す):
|
|||
|
|
|
|||
|
|
```sh
|
|||
|
|
perf stat -e \
|
|||
|
|
cycles,instructions,branches,branch-misses, \
|
|||
|
|
cache-references,cache-misses, \
|
|||
|
|
L1-dcache-loads,L1-dcache-load-misses, \
|
|||
|
|
LLC-loads,LLC-load-misses, \
|
|||
|
|
dTLB-loads,dTLB-load-misses, \
|
|||
|
|
iTLB-loads,iTLB-load-misses \
|
|||
|
|
-- ./bench_random_mixed_hakmem_minimal 200000000 400 1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
記録するもの(最低限):
|
|||
|
|
- IPC(instructions / cycles)
|
|||
|
|
- cache-misses / cache-references
|
|||
|
|
- L1-dcache-load-misses
|
|||
|
|
- LLC-load-misses
|
|||
|
|
- dTLB-load-misses / iTLB-load-misses
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Step 2: perf record(どの関数が miss を起こしているか)
|
|||
|
|
|
|||
|
|
```sh
|
|||
|
|
perf record -F 99 -g -- ./bench_random_mixed_hakmem_minimal 200000000 400 1
|
|||
|
|
perf report --no-children | head -120
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
可能なら(環境が許す場合):
|
|||
|
|
|
|||
|
|
```sh
|
|||
|
|
perf record -e cache-misses -F 99 -g -- ./bench_random_mixed_hakmem_minimal 200000000 400 1
|
|||
|
|
perf report --no-children | head -120
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
目的:
|
|||
|
|
- “時間が掛かっている関数” と “cache-miss を出している関数” が一致しているか確認。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Step 3: 次の Phase を決める(分岐)
|
|||
|
|
|
|||
|
|
### Case A: `tiny_region_id_write_header` が store-bound
|
|||
|
|
|
|||
|
|
兆候:
|
|||
|
|
- cache-miss は少ないのに IPC が低い
|
|||
|
|
- `perf record` で header write が支配的
|
|||
|
|
|
|||
|
|
次:
|
|||
|
|
- Phase 45: “branch を増やさずに store を減らす”案だけ検討(例: まとめ書き、別境界への移動)
|
|||
|
|
|
|||
|
|
### Case B: `unified_cache_push` / `tiny_c7_ultra_free` が miss-bound
|
|||
|
|
|
|||
|
|
兆候:
|
|||
|
|
- L1/LLC/DTLB miss が支配的
|
|||
|
|
- cache-misses のホットが free 側に寄る
|
|||
|
|
|
|||
|
|
次:
|
|||
|
|
- Phase 45: prefetch / データ配置(struct packing / align)を検討
|
|||
|
|
|
|||
|
|
### Case C: iTLB/i-cache が支配的
|
|||
|
|
|
|||
|
|
兆候:
|
|||
|
|
- iTLB-load-misses が相対的に多い
|
|||
|
|
|
|||
|
|
次:
|
|||
|
|
- “削除”ではなく **hot text の clustering**(ただし Phase 18 v1 の section-splitting は禁止)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ログ
|
|||
|
|
|
|||
|
|
- `docs/analysis/PHASE44_CACHE_MISS_AND_WRITEBACK_PROFILE_RESULTS.md` を作り、
|
|||
|
|
- perf stat(数値)
|
|||
|
|
- perf report Top(時間と miss の Top)
|
|||
|
|
- 判定(Case A/B/C)
|
|||
|
|
を書いて次の Phase を確定する。
|
|||
|
|
|