---
title: "单机并行"
description: "说明公共路径规划调用、低层算法、slice chunks 和 GEMM 线程分别在哪一层并行。"
eyebrow: "并行与分布式"
---

## 并行单位 {#units}

| 位置 | 可并行工作 | 仍需顺序或同步的部分 |
| --- | --- | --- |
| Auto preset | 公共预设管理的路径规划工作 | 不指定内部任务映射 |
| random\_greedy | 多条完整 trials | 一条 trial 的贪心步骤 |
| bisect | 多条独立划分 trials | 一次递归划分的父子调用 |
| order\_dp | 同一 interval length 的不同区间 | 区间长度从小到大推进 |
| anneal\_paths / treesa\_path | 多条独立 chains | 一条 chain 内的 rotations |
| temper\_path(s) | 同一轮的 replica segments | 轮末相邻交换和下一轮 |
| native sliced execution | 多个固定 slice chunks | chunk 内和最终 partial merge 的顺序 |
| matrixmultiply mt | 单个 GEMM 内部线程 | 由可选 Cargo feature 和线程上限控制 |

对公开低层算法，并行对象的数量给出阶段并行度上限；给一个阶段更多线程，不代表它能持续占用同样数量的 CPU 核。Auto preset 不规定公开的内部任务数量或同步方式。

## 线程池与嵌套并行 {#thread-controls}

```bash
RAYON_NUM_THREADS=8 cargo run --release --bin tnpath -- \
  network.json --method auto --preset heavy --seed 0

RAYON_NUM_THREADS=8 MATMUL_NUM_THREADS=1 tnexec \
  --net network.json --load-path plan.json
```

| 控制项 | 作用域 |
| --- | --- |
| RAYON\_NUM\_THREADS | Auto 路径规划、公开低层算法和 native slice chunks |
| MATMUL\_NUM\_THREADS | 启用 matrixmultiply `mt` feature 时的单个 GEMM 内线程 |
| CPU affinity / launcher binding | 进程实际可以运行在哪些 CPU 上 |

外层 Rayon 与内层 GEMM 同时扩张会造成 oversubscription。`tnexec` 在实际 outer chunk 多于 1 且调用者没有显式设置时，把 `MATMUL_NUM_THREADS` 设为 1；显式环境变量始终由调用者负责。默认 Python wheel 不启用 matrixmultiply 的可选线程池。

## 线程数、工作量和结果 {#work-vs-threads}

对低层固定 `ntrials`、`chains`、`rounds` 或 `moves` 的调用，增加线程主要改变完成这些工作所需的墙钟。Auto 预设可能随资源环境改变实际搜索工作，因此比较不同线程数时必须同时记录路径质量，且不能默认工作量保持不变。

| 比较问题 | 需要固定的量 |
| --- | --- |
| 固定工作量的线程加速 | 同一入口、trial/chain/round 数、seed、objective 和输出验证 |
| Auto 资源档位的最终质量 | 记录公开配置、实测墙钟和最终路径指标，不称为普通 strong scaling |
| 带 max\_time 的结果 | 外部硬墙钟、重复次数和实际完成工作；协作式检查会受运行时序影响 |
| 切片执行加速 | 同一 path、sliced legs、dtype、chunk 规则和后端 |

> [!WARNING]
> **资源口径**
>
> 线程池宽度不是物理核数，也不是实际平均用核。只写 `RAYON_NUM_THREADS=8` 不能证明阶段使用了 8 个物理核。

## 并行运行的报告口径 {#measurement}

阶段平均 CPU 使用量可以用 `process CPU time / wall time` 估计。例如比值为 2 表示该窗口内平均每秒消耗 2 个 CPU 秒，不能单独证明使用了多少物理核。等待、内存带宽瓶颈或任务不足都会使该比值低于线程池宽度。

- 记录 CPU affinity、物理核与 SMT 映射，而不只记录逻辑线程数。
- 记录 Rayon worker count，以及是否启用 matrixmultiply mt。
- 记录 process CPU、wall time、RSS 和测量窗口边界。
- 记录 trial、chain、replica、start 或 slice chunk 的总数与完成数。
- 共享服务器上同时跑多个进程提高的是 campaign throughput；不能直接当作单进程 latency speedup。
