执行后端

选择 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 收缩表达式。

切片执行使用同一个切片集合和单片收缩序,但两类后端的调度不同:

通过 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 完成未验证
python
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 不替这些库选择兼容发行包。