Files
hakmem/docs/analysis/PHASE65_HOT_SYMBOL_ORDERING_1_RESULTS.md

106 lines
3.5 KiB
Markdown
Raw Normal View History

# 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 でのみ動作)