执行后端
区分 ArcTN 原生 CPU 执行器、显式 opt_einsum 数组后端和 Cotengra 树互操作。
本页目录
默认后端与显式选择
arctn_contract(..., backend=...) 与 ArcTNExecutionPlan.execute(..., backend=...) 默认使用 native,不根据数组类型或硬件自动切换后端。native 进入 ArcTN 的 Rust CPU executor;其他合法的非空名称都作为显式 opt_einsum 数组 backend。执行失败时也不会隐式切换到另一后端。
GPU 数组后端
ArcTN 的 native executor 面向 CPU。CuPy、PyTorch 或 JAX 数组由 opt_einsum 与相应数组库执行。
| backend | ArcTN 负责 | 实际张量运算 |
|---|---|---|
| native | 完整原生执行、切片调度、结果归并 | Rust matrixmultiply CPU kernel |
| numpy | 编译固定表达式并显式分派 | opt_einsum + NumPy/其底层实现 |
| cupy / torch / jax 等 | 验证 shape/dtype、固定路径和切片索引计划 | opt_einsum 选择的数组库与设备 runtime |
实现边界
CuPy、PyTorch 或 JAX 路线不是 ArcTN 自研 GPU executor。ArcTN 提供路径、切片计划和统一分派,具体设备算子及兼容性由 opt_einsum 和已安装数组库决定。
未切片与已切片的分派
| 场景 | native | 显式非 native backend |
|---|---|---|
| 未切片 | Rust contract_network / compiled executor | 编译并执行一个 opt_einsum contract_expression |
| 已切片 | Rust contract_network_sliced;Rayon 外层 chunks | Python 串行枚举 assignment;每片复用同一个 contract_expression |
| 结果累加 | Rust 按固定 chunk 顺序 | 在所选数组 backend 上相加 |
| 数组位置 | 复制到 C-contiguous NumPy buffer 后进入 Rust | 非 NumPy设备数组保留原对象和设备位置 |
外部 sliced execution 会先从单片表达式中移除 sliced legs,构造每个输入的索引计划,再按固定顺序取视图和提交表达式。当前实现不会把外部 slices 自动分发到 Rayon,也不会跨 slice 复用数值中间张量。
Cotengra ContractionTree 是另一条路线
arctn_tree 把 ArcTN 的 SSA path 转成 Cotengra ContractionTree,并把 sliced legs 写入该树。ArcTNOptimizer.search() 委托给同一入口,所以 Quimb/Cotengra 可以直接取得带 sliced indices 的树。调用者随后执行该树时,数组分派和切片执行由 Cotengra/autoray 负责。
已经持有 Quimb TensorNetwork 时,可直接把 ArcTNOptimizer 传给 optimize=;需要显式保存、检查或延迟执行树时,再单独调用 arctn_tree。
| 入口 | 返回值 | 数值执行 |
|---|---|---|
| arctn_contract | 数值结果,可选报告 | 调用中由 native 或 opt_einsum backend 执行 |
| arctn_tree / ArcTNOptimizer.search | ContractionTree | 随后由调用方通过 Quimb/Cotengra 执行 |
计时口径
使用 arctn_contract 和执行返回的 Cotengra tree 是两种不同执行栈。它们的 setup、调度、同步和计时范围不能混在一个 backend 结论里。
同步、计时与依赖
在 arctn_contract 报告中,native 和 NumPy 被视为同步执行,execution_wall_s 包含 setup 与 dispatch,不含输入准备;execution_total_host_wall_s 还包含 execution_input_prepare_wall_s。其他外部 backend 可能异步返回;ArcTN 不主动插入设备同步,因此把 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 不替这些库选择兼容发行包。