---
title: "固定路径切片与动态切片"
description: "Fixed 保持收缩路径不变；Dynamic 在选择切片 index 的同时尝试局部调整路径。"
eyebrow: "切片"
---

## 固定路径切片（Fixed） {#public-values}

Fixed 保持已经找到的收缩顺序不变，只选择哪些内部 index 需要切片。目的是减小每次收缩产生的中间张量，而不是重新搜索一条路径。

例如，将维度为 2 的内部 index $x$ 切片，就分别计算 $x=0$ 和 $x=1$ 两个子任务，再把结果相加。两个子任务使用相同的收缩顺序。

```pseudocode
path = 收缩序优化得到的路径
sliced_indices = 在 path 上选择切片 index，使中间结果满足大小上限
return path, sliced_indices
```

## 动态切片（Dynamic） {#mode-semantics}

Dynamic 从未切片搜索得到的路径出发，在选择切片 index 后，尝试用局部重构调整收缩顺序，再重新选择切片 index。它同时考虑路径与切片的组合，而不只是固定一条路径。

```pseudocode
path = 收缩序优化得到的路径
选择切片 index，并检查中间结果大小
在规定的搜索范围内:
    尝试局部重构路径，并重新选择切片 index
    按大小限制和切片后的总目标值保留较好的方案
return 最终路径, 切片 index
```

Dynamic 会增加搜索工作，最终路径可能改变，也可能保持不变；不能保证比 Fixed 更省计算量。

这里的“动态”发生在规划阶段：路径和切片 index 可以一起调整。方案确定后，各个 slice 都使用返回的最终路径进行数值计算。比较 Fixed 与 Dynamic 的结果时，应同时查看切片 index、切片数量和全部切片的总目标值。

```diagram
slicing-modes
Fixed 不调整收缩树；Dynamic 可以调整。图中固定同一组切片 index，只展示树结构的区别，实际选择的 index 也可能不同。
```

## 设置中间张量大小上限 {#shared-start}

`target_size` 指定**每个切片中，单个二元收缩结果最多包含多少个元素**。例如，`target_size=65_536` 时，一个 $256\times256$ 的结果张量满足限制，$512\times512$ 的结果则超过限制。

它限制的是单个结果张量的大小，不是全部张量占用的内存之和，也不是进程内存或 GPU 显存上限。完整定义见[中间张量大小上限](/docs/slicing#target-size)。

在 Python 高层接口中，`slicing_mode="fixed"` 是默认设置。不传 `target_size` 时，按普通路径收缩，不额外选择切片；使用 `slicing_mode="dynamic"` 时必须提供 `target_size`。如果原路径已经满足大小限制，Fixed 可以返回空的切片列表。

## 切片方案与数值计算 {#execution}

选择切片方案只确定收缩路径和切片 index，还没有计算张量数值。`arctn_schedule` 返回方案和报告；`arctn_contract` 接收数组后，会完成方案选择、各切片的收缩以及最后的求和。

两种方式的调用见[切片示例](/docs/tutorial-slicing)。怎样计算各切片并相加，见[切片计算与求和](/docs/slicing-execution)。

## 大小检查与失败处理 {#hard-constraint}

ArcTN 根据最终路径和切片 index，用整数计算检查大小限制。未找到满足 `target_size` 的方案时，Rust 返回 `Err`，Python 高层抛出 `ValueError`；不会把超过上限的方案作为成功结果返回。

`max_time` 控制普通收缩序搜索阶段的时间检查，不保证包括切片和数值计算在内的整个任务都在该时间内结束。无论搜索何时停止，最终方案仍须通过大小检查。
