pypto_pro.language.store_tile#
产品支持情况#
Ascend 950PR/Ascend 950DT:支持
Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
功能说明#
把UB或L0C Buffer中的Tile结果写回GM。与pypto_pro.language.store的区别在于,偏移以Tile块索引为单位,内部自动按块索引乘以Tile形状,换算成绝对元素坐标。该接口是pypto_pro.language.load_tile的反向操作。
例如Tile形状为[64, 128]时,tile_offsets=[2, 2]等价于pypto_pro.language.store的绝对偏移[128, 256]。
下图以UB源Tile为例展示按块索引写回GM Tensor的过程。块索引先换算为元素偏移,再确定目标块的落点;L0C Buffer中的源Tile通过Fixpipe写回。

函数原型#
pypto_pro.language.store_tile(
dst_tensor: Tensor,
src_tile: Tile,
tile_offsets: Offset,
*,
relu_pre_mode: Optional[ReluPreMode] = None,
scale: Optional[Union[float, Scalar, Tile]] = None,
order: Optional[List[int]] = None,
atomic: AtomicType = AtomicType.AtomicNone,
phase: Optional[STPhase] = None,
) -> None
参数说明#
参数 |
输入/输出 |
说明 |
|---|---|---|
dst_tensor |
输出 |
目的操作数,Tensor类型,存储空间为GM。支持的数据类型和分形组合详见约束说明。写入范围不得越过Tensor边界。 |
src_tile |
输入 |
源操作数,Tile类型,存储空间为UB或L0C Buffer。位于UB时通过MTE3流水写回,首地址按32字节对齐;位于L0C Buffer时通过Fixpipe写回,首地址按64字节对齐。 |
tile_offsets |
输入 |
目标Tensor的Tile块偏移,List[int或Scalar]类型。由order指定的维度按块索引乘以Tile对应维度大小换算,其余维度按绝对偏移使用;不支持负数索引,换算后的绝对偏移不得超过对应维度的形状。 |
relu_pre_mode |
输入 |
预处理模式,pypto_pro.language.ReluPreMode类型,可选。支持ReluPreMode.NormalRelu。 |
scale |
输入 |
量化比例,float、Scalar或Tile类型,可选。float或运行时Scalar表示整块Tile使用同一比例;运行时DT_FP32 Scalar直接传比例值,运行时DT_INT32或DT_INT64 Scalar须传入预编码的float32位模式。Tile表示逐列量化,须位于Fixpipe Buffer,数据类型为DT_INT64,形状为[1, N],其中N为16的倍数且不大于512。 |
order |
输入 |
维度映射,List[int]类型,可选。指定源Tile的两个维度分别对应目标Tensor的哪两个维度,仅支持包含两个升序维度索引的列表,例如[0, 2];维度索引必须在目标Tensor的维度范围内。省略时使用目标Tensor的最后两个维度。 |
atomic |
输入 |
原子写模式,pypto_pro.language.AtomicType类型,可选。支持AtomicType.AtomicNone(覆盖写)和AtomicType.AtomicAdd(原子累加)。 |
phase |
输入 |
分块写回阶段,pypto_pro.language.STPhase类型,可选。支持STPhase.Partial和STPhase.Final;scale为逐列量化Tile时不能同时设置该参数。 |
约束说明#
数据类型和分形要求(与store一致)#
源 → 目的 |
分形要求 |
数据类型要求 |
|---|---|---|
UB → GM |
源与目的分形必须相同,支持ND、DN、NZ。 |
源与目的数据类型位宽必须相同,支持DT_INT8、DT_UINT8、DT_FP16、DT_BF16、DT_INT16、DT_UINT16、DT_FP32、DT_INT32、DT_UINT32、DT_INT64、DT_UINT64、DT_FP8E8M0、DT_FP8E4M3FN、DT_FP8E5M2、DT_HF8、DT_FP4E2M1、DT_FP4E1M2。 |
L0C Buffer → GM(不配置scale) |
NZ → ND,NZ → NZ。 |
支持DT_FP32 → DT_FP32/DT_FP16/DT_BF16,以及DT_INT32 → DT_INT32/DT_FP16/DT_BF16。 |
L0C Buffer → GM(配置scale) |
NZ → ND,NZ → NZ。 |
支持DT_FP32 → DT_INT8/DT_UINT8/DT_HF8/DT_FP8E4M3FN/DT_FP16/DT_BF16/DT_FP32,以及DT_INT32 → DT_INT8/DT_UINT8/DT_FP16/DT_BF16。 |
当dst_tensor声明为NZ时,其物理排布和完整Tensor shape约束见TensorLayout,同布局搬运、源Tile、order和L0C Buffer直接写回约束与store一致。store_tile还需满足以下NZ搬运约束:
tile_offsets按Tile块索引寻址:最后两项分别乘以Tile的M、N shape,前导项选择batch;换算后的M、N offset需分别按16和目标Tensor dtype对应的C0对齐。
返回值说明#
无。
调用示例#
按Tile块索引从UB写回GM#
import pypto_pro.language as pl
@pl.jit(auto_mutex=True)
def store_tile_kernel(
x: pl.Tensor[[64, 64], pl.DT_FP16],
out: pl.Tensor[[256, 64], pl.DT_FP16], # 4 个 64x64 的块
):
tt = pl.TileType(shape=[64, 64], dtype=pl.DT_FP16, target_memory=pl.MemorySpace.Vec)
tile_x = pl.make_tile_group(type=tt, addrs=0x0000, mutex_ids=[0])
with pl.section_vector():
cur_x = tile_x.current()
pl.load(cur_x, x, [0, 0])
for ti in pl.range(0, 4, 1):
pl.store_tile(out, cur_x, [ti, 0])
高维Tensor写回#
# 四维BSND Tensor:Tile对应第1、3维,其余维度使用绝对偏移
pl.store_tile(p_buf, p_f16, [b_idx, qi * 2 + sub_id, n_idx, ki], order=[1, 3])