固定路径切片与动态切片

Fixed 保持收缩路径不变;Dynamic 在选择切片 index 的同时尝试局部调整路径。

本页目录

固定路径切片(Fixed)

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

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

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

动态切片(Dynamic)

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

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

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

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

Fixed 不调整收缩树;Dynamic 可以调整。图中固定同一组切片 index,只展示树结构的区别,实际选择的 index 也可能不同。

设置中间张量大小上限

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

它限制的是单个结果张量的大小,不是全部张量占用的内存之和,也不是进程内存或 GPU 显存上限。完整定义见中间张量大小上限。

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

切片方案与数值计算

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

两种方式的调用见切片示例。怎样计算各切片并相加,见切片计算与求和。

大小检查与失败处理

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

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