---
title: "MPI 执行"
description: "tnmpi 的主路径按 slice assignment 分工；它不是分布式 Light/Heavy 寻路。"
eyebrow: "并行与分布式"
---

## 主模式：固定路径切片执行 {#main-path}

`tnmpi` 通过可选 Cargo `mpi` feature 构建。主模式先确定一条路径，再由 rank 0 选择 sliced legs 并广播；各 rank 执行不同的连续 slice index 区间，最后用 MPI Allreduce 对输出逐元素求和。

> [!WARNING]
> **能力边界**
>
> MPI 主模式分布的是固定路径后的切片数值执行，不拆分单个张量，也不提供 distributed Light/Heavy。每个执行 rank 仍持有完整输入数组。

## 普通模式与 scaling mode {#modes}

| 模式 | 路径 | 切片计划 | 适合用途 |
| --- | --- | --- | --- |
| 普通模式 | 每个 rank 用 seed+rank 运行 random\_greedy，再选择 objective 最好的 rank | rank 0 计算；无显式目标时尝试取得至少 slices\_min × P 个 slices | 一般规划与执行 |
| --scaling-mode | 只由 rank 0 用固定 seed 运行 random\_greedy | 必须显式给出同一个 --target-size | 比较不同 MPI 进程数的固定 path/slices 执行 |
| --partition | 独立的超图分区路线 | 不接受 --target-size 或 --scaling-mode | 研究性 boundary-tensor 分区执行，不属于主切片流程 |

`--scaling-mode` 强制使用显式 `--target-size`，避免 `slices-min × P` 随进程数变化，从而让不同 P 使用不同 sliced legs。固定 path 和切片集合后，执行墙钟才具有直接的强缩放比较意义。

## 构建与运行 {#run}

```bash
cargo build --release --locked --features mpi --bin tnmpi

mpirun -n 4 ./target/release/tnmpi \
  --net network.json \
  --trials 64 --seed 1 \
  --scaling-mode --target-size 1048576 \
  --exec
```

- 不带 `--exec` 时只规划和报告，不加载数值输入数组。
- `--exec` 当前执行 f64；`--data` 文件是 little-endian f64，并要求同时指定 `--exec`。
- 不传 `--data` 时，各 rank 根据同一索引 seed 生成相同输入。
- `--check` 也要求 `--exec`，只适合单机 oracle 可以完成的小网络。
- 切片数应明显多于 rank 数，否则连续区间分配容易负载不足。

## 正确性与归约边界 {#correctness}

| 必须一致 | 为什么 |
| --- | --- |
| 网络、路径和 sliced legs | 所有 rank 必须计算同一精确分解的不同部分 |
| 输入张量值 | Allreduce 合并的是同一个收缩问题 |
| 目标与报告口径 | target\_size 只约束每个 slice 的二元收缩结果；单张量网络则检查最终输出 |

每个 rank 先独立复验广播的 path/slice plan，并计算自己的局部输出。Allreduce 的浮点归约树由 MPI 实现和 rank 数决定，因此不同 P 下结果应在数值容差内一致，但不承诺 bit-identical。

> [!WARNING]
> **内存边界**
>
> 增加 ranks 不会自动降低每个 rank 的输入内存：`--exec` 下每个 rank 都读取或生成完整输入。`target_size` 也不是每 rank RSS 上限。

## 每 rank 线程与时间上限 {#threads-and-time}

同一节点启动多个 ranks 时，`tnmpi` 会根据可用 CPU 并行度和本地 rank 数估计每 rank 的 Rayon 线程数。若调用者显式设置 `RAYON_NUM_THREADS`，则使用该值。MPI launcher 的 pinning/binding 仍应单独配置。

`tnmpi` 没有内部 `--max-time`，因为 ranks 之间还没有共同的协作式 deadline 协议。严格时间上限应由 `mpirun`、作业调度器或外部 watchdog 实施。

| 不支持的结论 | 实际支持的结论 |
| --- | --- |
| P 个 ranks 就把单个张量分成 P 份 | 主模式只分 slice assignment 区间 |
| MPI 提供分布式 Heavy 寻路 | 主模式只在 ranks 间选 random\_greedy 候选，或只由 rank 0 寻路 |
| target\_size 限制集群总内存 | 它限制每个 slice 的二元收缩结果元素数；单张量网络则检查最终输出 |
| Allreduce 在所有 P 下逐位相同 | 它精确合并全部子任务，但浮点顺序可变化 |
