---
title: "执行后端"
description: "区分 ArcTN 原生 CPU 执行器、显式 opt_einsum 数组后端和 Cotengra 树互操作。"
eyebrow: "切片与执行"
---

## 默认后端与显式选择 {#dispatch}

`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 和已安装数组库决定。

## 未切片与已切片的分派 {#unsliced-and-sliced}

| 场景 | 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 是另一条路线 {#cotengra}

`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 结论里。

- [Quimb 前端教程](/docs/tutorial-quimb)

## 同步、计时与依赖 {#timing}

在 `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 完成未验证 |

```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 不替这些库选择兼容发行包。
