---
title: "路径指标"
description: "用六项 PathStats 分别描述算术量、中间结果、单步 footprint、逻辑读写量和存活对象峰值。"
eyebrow: "核心概念"
---

## PathStats 的六项指标 {#six-metrics}

设第 `s` 个二元步骤的左右输入和结果元素数为 `|A_s|`、`|B_s|`、`|C_s|`。读写计数对原始叶张量采用原输入各轴的元素数；单步规模采用一元求和和对角处理后的逻辑大小，分别记为 `|A'_s|`、`|B'_s|`。中间结果在两种口径下大小相同。ArcTN 在完整路径重放后报告以下六项对数指标。

| 字段 | 定义 | 回答的问题 |
| --- | --- | --- |
| log10\_flops | log10(Σ\_s F\_s) | 整条路径需要多少标量乘法 |
| log2\_max\_size | log2 max\_s \|C\_s\| | 最大的二元结果张量有多少元素；单张量网络取最终输出大小 |
| log2\_max\_contraction\_size | log2 max\_s(\|A'\_s\|+\|B'\_s\|+\|C\_s\|) | 最大的单步输入加输出 footprint |
| log2\_total\_size | log2 Σ\_s \|C\_s\| | 全部步骤写出的结果元素总量 |
| log2\_read\_write | log2 Σ\_s(\|A\_s\|+\|B\_s\|+\|C\_s\|) | 整条路径的逻辑读写复杂度 |
| log2\_peak\_size | log2 max 活跃元素总数 | 路径模拟中的存活对象峰值 |

> [!WARNING]
> **模型量与实测量**
>
> 这些量都是结构估计，不是规划秒数、数值执行秒数、进程 RSS、显存占用、缓存缺失或硬件性能计数器。Rust 中单张量网络的合法空路径没有二元步骤：`log10_flops`、`log2_total_size` 和 `log2_read_write` 用负无穷表示零工作量，`log2_max_contraction_size` 为 0；`log2_max_size` 取最终输出大小，`log2_peak_size` 仍计入完整输入。Python 规划报告将这种零工作量的 `log10_flops`、`log2_total_size` 显示为 `0.0`；满足请求目标时，`sliced_log10_flops_total` 也采用此显示约定。`log2_read_write` 和目标元数据仍保留零工作量语义。这些特殊显示值不表示工作量为 1，也不表示路径无效。

## 单步指标计数 {#per-step-accounting}

本步 FLOPs 按参与二元收缩的所有指标维度之积计一次标量乘法；结果大小是本步保留腿的维度之积。ArcTN 在 log2 域累加大数，避免大型网络的线性值溢出。

本步结果保留属于 `output` 的指标，以及仍被这两个输入以外的张量使用的指标；其余参与本步的指标求和消去。

结构计数公式：单步规模用一元处理后的逻辑输入大小，读写量对叶张量用原输入大小

```text
F_s = product(dim(leg) for leg in union(A_s, B_s))
result_s = product(dim(leg) for leg in C_s)
step_footprint_s = |A'_s| + |B'_s| + |C_s|
read_write = sum_s (|A_s| + |B_s| + |C_s|)
```

> **FLOPs 的口径**
>
> 复数标量乘法在该结构模型中仍计为一次标量乘法。实际指令数和不同 dtype 的吞吐必须通过执行 benchmark 测量。

## 三个容易混淆的大小指标 {#memory-related-metrics}

| 指标 | 包含什么 | 不包含什么 |
| --- | --- | --- |
| log2\_max\_size | 单个二元步骤的新结果 `C`；单张量网络取最终输出 | 该步的两个输入、其他存活张量、workspace |
| log2\_max\_contraction\_size | 某个二元步骤的 `\|A'\|+\|B'\|+\|C\|`，其中叶张量采用一元处理后的逻辑大小 | 其他存活张量、并发 slice、allocator 与后端 workspace |
| log2\_peak\_size | 模拟执行中的全部存活张量；结果在输入释放前计入 | 转置临时量、allocator 开销、库 workspace 与并行任务叠加 |

`target_size` 限制每个 slice 的二元收缩结果元素数；单张量网络另检查最终输出，因此与 `log2_max_size` 的结构口径最接近。它不涵盖所有一元临时数组，不直接约束 `log2_peak_size`，也不等于 RSS 或显存。

> [!WARNING]
> **并行执行的额外内存**
>
> 如果数值执行同时并行多个 slice，总驻留内存可能明显高于单个 slice 的路径指标。评估内存时还要记录 dtype、线程数、并发 slice 数和实测 RSS。

## 统一重算再比较 {#recompute-and-compare}

```rust
let stats = arctn::simulate_path(&net, &ssa_path)?;
println!("{:?}", stats);
```

跨方法或跨库比较使用同一种合法路径表示，并在相同网络、维度和 evaluator 下重放。各库原生汇总字段可能采用不同的 FLOPs、读写或 unary 处理口径。

- 记录网络与维度是否完全相同。
- 记录路径是否切片，以及切片后的指标是单片还是全部 slices 的总量。
- 记录路径格式、objective、候选预算、seed/repeat 和 wall limit。
- 把 planner API 时间、外部进程 wall 和数值执行时间分开。

> **total write 与 read/write complexity**
>
> `log2_total_size` 只累计每步写出的结果，`log2_read_write` 同时累计左右输入与结果。两者不能都简称为“读写量”。
