106 lines
3.5 KiB
Markdown
106 lines
3.5 KiB
Markdown
|
|
# Phase 65: Hot Symbol Ordering — 技術的制約により中止
|
|||
|
|
|
|||
|
|
**Status**: ⚠️ BLOCKED (技術的制約)
|
|||
|
|
|
|||
|
|
## Executive Summary
|
|||
|
|
|
|||
|
|
Phase 65 は linker の symbol ordering file を使用して hot function を連続配置し、layout tax を減らすアプローチを試みた。しかし、GCC + LTO 環境では技術的に実現不可能であることが判明した。
|
|||
|
|
|
|||
|
|
## 試行内容
|
|||
|
|
|
|||
|
|
1. **perf profiling** で hot function を特定:
|
|||
|
|
- malloc (27.84%)
|
|||
|
|
- free (24.75%)
|
|||
|
|
- main (22.33%)
|
|||
|
|
- free_tiny_fast_compute_route_and_heap (3.94%)
|
|||
|
|
- tiny_region_id_write_header.lto_priv.0 (3.59%)
|
|||
|
|
- tiny_c7_ultra_alloc.constprop.0 (3.47%)
|
|||
|
|
- unified_cache_push (3.37%)
|
|||
|
|
|
|||
|
|
2. **`build/hot_syms.txt`** を作成(17 symbols)
|
|||
|
|
|
|||
|
|
3. **Makefile target** `bench_random_mixed_hakmem_fast_ordered` を追加:
|
|||
|
|
```make
|
|||
|
|
EXTRA_LDFLAGS='-fuse-ld=lld -Wl,--symbol-ordering-file=build/hot_syms.txt'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 遭遇した技術的制約
|
|||
|
|
|
|||
|
|
### 問題 1: GNU ld は `--symbol-ordering-file` をサポートしない
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
/usr/bin/ld: 認識できないオプション '--symbol-ordering-file=build/hot_syms.txt' です
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`--symbol-ordering-file` は LLVM lld linker 固有の機能。
|
|||
|
|
|
|||
|
|
### 問題 2: GCC LTO と lld は非互換
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
ld.lld: error: undefined symbol: main
|
|||
|
|
>>> referenced by Scrt1.o:(_start)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
GCC は独自の LTO format (GIMPLE IR) を使用するため、lld が理解できない。
|
|||
|
|
|
|||
|
|
### 問題 3: LTO が hot function をインライン化
|
|||
|
|
|
|||
|
|
`nm` の出力を見ると、バイナリにエクスポートされるシンボルは僅か 33 個:
|
|||
|
|
- hot function の多くは internal (`t`) であり、LTO によってインライン化/マージされる
|
|||
|
|
- `.lto_priv.0`, `.constprop.0` などの suffix は LTO が生成した内部シンボル
|
|||
|
|
- これらは ordering file で参照しても効果がない
|
|||
|
|
|
|||
|
|
### 問題 4: LTO なしだと baseline と条件が違う
|
|||
|
|
|
|||
|
|
LTO を無効にして lld を使う場合:
|
|||
|
|
- Symbol ordering は可能
|
|||
|
|
- しかし LTO の性能向上(5-10%)を失う
|
|||
|
|
- A/B 比較が unfair になる
|
|||
|
|
|
|||
|
|
## 結論
|
|||
|
|
|
|||
|
|
**Phase 65 は技術的制約により中止。**
|
|||
|
|
|
|||
|
|
Symbol ordering アプローチは GCC + LTO 環境では以下の理由で非実現的:
|
|||
|
|
|
|||
|
|
1. **Linker 非互換**: `--symbol-ordering-file` は lld 専用
|
|||
|
|
2. **LTO 非互換**: GCC LTO format と lld は互換性がない
|
|||
|
|
3. **Symbol 消失**: LTO が hot function をインライン化し、ordering 対象が消える
|
|||
|
|
4. **Trade-off**: LTO を諦めると symbol ordering 以上の性能低下が発生
|
|||
|
|
|
|||
|
|
## Alternative Strategies
|
|||
|
|
|
|||
|
|
Phase 65 の教訓を踏まえ、以下のアプローチを推奨:
|
|||
|
|
|
|||
|
|
### Option A: PGO (Profile-Guided Optimization) - 推奨
|
|||
|
|
|
|||
|
|
GCC の `-fprofile-generate` + `-fprofile-use` を使用:
|
|||
|
|
- Compiler が hot path を自動で最適配置
|
|||
|
|
- LTO との組み合わせが可能
|
|||
|
|
- Symbol ordering より強力
|
|||
|
|
|
|||
|
|
### Option B: `-fno-inline` + Symbol Ordering (研究用)
|
|||
|
|
|
|||
|
|
特定の hot function に `__attribute__((noinline))` を付与:
|
|||
|
|
- LTO によるインライン化を防止
|
|||
|
|
- Symbol として残るため ordering 可能
|
|||
|
|
- 性能 trade-off の検証が必要
|
|||
|
|
|
|||
|
|
### Option C: Clang/LLVM に移行 (大規模変更)
|
|||
|
|
|
|||
|
|
全ビルドを Clang に移行:
|
|||
|
|
- lld と完全互換
|
|||
|
|
- Symbol ordering + LTO が両立可能
|
|||
|
|
- Migration cost が高い
|
|||
|
|
|
|||
|
|
## 次のステップ
|
|||
|
|
|
|||
|
|
1. **Phase 66 (PGO)**: `-fprofile-generate` / `-fprofile-use` を試行
|
|||
|
|
2. **Phase 67 (alternative)**: 他の layout tax 削減手法を調査
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Artifacts**:
|
|||
|
|
- `build/hot_syms.txt`: Hot symbol list (残存、将来の参照用)
|
|||
|
|
- Makefile target: `bench_random_mixed_hakmem_fast_ordered` (USE_LTO=0 でのみ動作)
|