执行后端
选择 Rust CPU、NumPy 或 GPU 数组后端,了解切片执行与计时方式。
本页目录
选择后端
arctn_contract 与 ArcTNExecutionPlan.execute 默认使用 backend="native",即 Rust CPU 执行器。使用 NumPy 或 GPU 数组库时,指定对应后端;ArcTN 不根据硬件自动切换,也不会在执行失败后改用另一后端。
后端决定每一步数组运算由哪个库执行。例如,同一条收缩序可以交给 Rust CPU 实现或 NumPy;已有 CuPy 设备数组时,也可以交给 CuPy 执行。选择后端不会改变已经确定的收缩序。
| backend | 执行方式 | 数组位置 |
|---|---|---|
native |
Rust 的 matrixmultiply CPU 内核 |
输入整理为 C 连续存储的 NumPy 数组后传入 Rust |
numpy |
opt_einsum 调用 NumPy | CPU |
cupy、torch、jax 等 |
opt_einsum 调用指定的数组库 | 保留输入设备数组所在的设备;按所用数组库准备输入 |
切片如何执行
未切片时,原生后端沿给定 SSA path 执行;外部后端准备并执行一个固定的 opt_einsum 收缩表达式。
切片执行使用同一个切片集合和单片收缩序,但两类后端的调度不同:
- **原生后端:**Rust 通过 Rayon 将切片分组执行,再按固定分组顺序合并结果。
- **外部后端:**Python 依次枚举切片 index 的取值组合,对每片调用同一个收缩表达式,并在所选数组库上相加。不在片间复用中间张量。
通过 Quimb / Cotengra 执行
arctn_tree 返回带有收缩序和切片 index 的 Cotengra ContractionTree,本身不执行数组收缩。随后调用树的收缩方法时,由 Cotengra/autoray 选择数组运算并执行切片。
已有 Quimb TensorNetwork 时,直接传入 optimize=ArcTNOptimizer(...) 即可。Quimb 通过 ArcTNOptimizer.search() 获取上述树,见 Quimb 前端示例。这条执行路线与直接调用 arctn_contract 的执行后端不同。
同步、计时与依赖
在 arctn_contract 报告中,native 和 NumPy 被视为同步执行:调用返回时,数值结果已经计算完成。execution_wall_s 包含准备收缩表达式与调用后端的时间,不含输入准备;execution_total_host_wall_s 还包含 execution_input_prepare_wall_s。
GPU 数组库可能只在调用时提交计算,稍后才由设备完成。ArcTN 不主动插入设备同步,因此其他外部 backend 的 execution_wall_s 为 None,而不是把较短的主机调用时间当成完整计算时间。未切片 plan.execute(return_info=True) 返回编译对象的计时字段。
| 字段 | 范围 |
|---|---|
| execution_setup_wall_s | 表达式编译和输入数组切片索引的准备 |
| execution_dispatch_wall_s | 从开始调用 backend 到主机调用返回 |
| execution_wall_s | native/NumPy 的 setup 与 dispatch;arctn_contract 中不含输入准备 |
| execution_timing_scope | 标记同步主机时间,或外部 backend 完成未验证 |
from arctn import arctn_contract
value, info = arctn_contract(
inputs, output, size_dict, arrays,
backend="cupy", return_info=True,
)
# 对异步设备后端,使用对应库的同步或 event timing
外部执行依赖可通过 arctn[execution] 安装。CuPy、PyTorch、JAX 及其 CUDA/runtime 版本由调用者按目标硬件安装;ArcTN 不替这些库选择兼容发行包。