单机并行

说明公共路径规划调用、低层算法、slice chunks 和 GEMM 线程分别在哪一层并行。

本页目录

并行单位

位置 可并行工作 仍需顺序或同步的部分
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 不规定公开的内部任务数量或同步方式。

线程池与嵌套并行

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 的可选线程池。

线程数、工作量和结果

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

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

Warning

资源口径

线程池宽度不是物理核数,也不是实际平均用核。只写 RAYON_NUM_THREADS=8 不能证明阶段使用了 8 个物理核。

并行运行的报告口径

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