---
title: "执行后端"
description: "选择 Rust CPU、NumPy 或 GPU 数组后端，了解切片执行与计时方式。"
eyebrow: "数值执行"
---

## 选择后端 {#dispatch}

`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 调用指定的数组库 | 保留输入设备数组所在的设备；按所用数组库准备输入 |

## 切片如何执行 {#unsliced-and-sliced}

未切片时，原生后端沿给定 SSA path 执行；外部后端准备并执行一个固定的 opt_einsum 收缩表达式。

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

- **原生后端：**Rust 通过 Rayon 将切片分组执行，再按固定分组顺序合并结果。
- **外部后端：**Python 依次枚举切片 index 的取值组合，对每片调用同一个收缩表达式，并在所选数组库上相加。不在片间复用中间张量。

## 通过 Quimb / Cotengra 执行 {#cotengra}

`arctn_tree` 返回带有收缩序和切片 index 的 Cotengra `ContractionTree`，本身不执行数组收缩。随后调用树的收缩方法时，由 Cotengra/autoray 选择数组运算并执行切片。

已有 Quimb `TensorNetwork` 时，直接传入 `optimize=ArcTNOptimizer(...)` 即可。Quimb 通过 `ArcTNOptimizer.search()` 获取上述树，见 [Quimb 前端示例](/docs/tutorial-quimb)。这条执行路线与直接调用 `arctn_contract` 的执行后端不同。

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

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