算子目录
每个算子家族一行。每个名字都链到 API 参考看签名 —— 本页为何不重复它们,见 算子。
怎么读这些表: 可达列给出能用的最短拼法。pl. 表示该名字不带限定即可访问;pl.tile. / pl.tensor. 表示该算子是分层级的。标 (t) 的名字是为方便而重新导出到顶层的 tile 专属算子 —— pl.load 就是 pl.tile.load,不是派发器。
创建
| 算子 |
可达 |
作用 |
create_tensor |
pl. |
分配 DDR 张量。manual_dep=True 让它在整个生命周期退出依赖跟踪 |
create_tile |
pl. (t) |
分配片上缓冲区 |
create_l1 |
pl. (t) |
显式在 L1 上分配 |
full |
pl. |
用常量填充的张量 |
arange |
pl. |
连续整数(tensor.ci) |
random |
pl. |
随机填充的张量 |
tri |
pl. (t) |
下三角或上三角掩码 tile;upper= 选边、diagonal= 平移,且只写有效区 |
const |
pl. |
带显式 dtype 的字面量 —— 见 编译期指令 |
array.create |
pl.array. |
分配核内数组 |
数据搬运
哪些搬运合法见 内存与数据搬运。
逐元素算术
| 算子 |
可达 |
作用 |
add sub mul div |
pl. |
二元算术;右侧给 Python 数字会选中标量操作数形式 |
neg abs recip |
pl. |
取负、绝对值、倒数;FP16/FP32 倒数设置 high_precision=True 时会在 A5 上选择速度较慢、精度较高的 PTO 路径 |
rem rems fmod fmods |
pl. |
floor 取余(rem*)与截断取余(fmod*)。Tensor 操作数的 shape 和 dtype 必须一致;tile-tile 操作数的物理 shape 与 valid shape 必须一致。A2/A3 的 rem* 支持 FP32/INT32,fmod* 仅支持 FP32;A2/A3 INT32 rem* 的每个 source/scalar 值必须位于 PTO-ISA 闭区间 [-2^24, 2^24]。A2/A3 scalar 形式的 valid extent 必须可证明为正。Tile rem / rems 的 scratch 物理容量和有效容量都必须可证明足够(分别为两行 / 一行并覆盖全部 source 列),且在 A2/A3 上不得与仍存活的 source 重叠。A5 接受更宽的前端 dtype 集合。high_precision=True 仅适用于 FP32 tile-tile(A5 定义,A2/A3 接受但忽略) |
addc subc addsc subsc |
pl. (t) |
带进位操作数的三输入加 / 减 |
part_add part_mul part_max part_min |
pl. |
分段算术 |
数学
| 算子 |
可达 |
作用 |
exp log |
pl. |
指数、自然对数 |
sqrt rsqrt |
pl. |
平方根;倒数平方根。high_precision= 只作用于张量路径,传给 Tile 会抛异常 —— tile 级的精度由是否传入 scratch tile 决定:pl.tile.rsqrt(src, tmp) |
sin cos |
pl. |
三角函数 |
比较与选择
激活
位运算
规约
行规约折叠最后一个轴;列规约折叠第一个轴。
若干规约接受 tmp_tile 参数。传入它会改变规约策略(二叉树 vs 顺序),从而改变浮点结合顺序 —— 结果是在容差内有差异,而不是错误。对部分有效 tile 的规约取决于填充值,见 内存 § 有效形状。
广播与展开
形状与布局
量化
| 算子 |
可达 |
作用 |
quant_mx |
pl. (t) |
Ascend950 MXFP8 block-32 动态量化,生成 FP8E4M3FN 数据及 FP8E8M0 scale(group_axis 对齐 PTOAS grpAxis)。本版本不含 MXFP4 quant。可在同一 InCore mixed task 内通过 data+scale 的直接 V2C 传输供 matmul_mx 使用(见 类型) |
tmov_x2zz |
pl. (t) |
Ascend950 指数 X-to-ZZ 布局转换(UINT8)。tmp 为只写 workspace;axis1 需 dst_rows/dst_cols 指定 ZZ [M,G](相对 TQUANT 扁平 exp)。通常由 quant_mx 降级使用,而非直接调用 |
线性代数
分阶段 GEMV 累加通过 pl.AccPhase 选择生产者阶段。以 pl.AccPhase.Final
结束的生产者必须与使用 pl.STPhase.Final 的 store 配对:
其中 lhs0、rhs0、lhs1 和 rhs1 是预加载的 tile,output 是目标 tensor。
partial = pl.tile.gemv(lhs0, rhs0, acc_phase=pl.AccPhase.Partial)
final = pl.tile.gemv_acc(partial, lhs1, rhs1, acc_phase=pl.AccPhase.Final)
pl.store(final, [0, 0], output, st_phase=pl.STPhase.Final)
Gather、Scatter、排序
Block 身份
跨核传输
混合 kernel 的接口 —— AIC 与 AIV 在同一个 InCore 函数内协作。
push 与 pop 必须配对,且每次 pop 都必须有对应的 tfree。用法见 混合 kernel 教程;机制见 TPUSH/TPOP 与 ExpandMixedKernel。
任务与依赖
| 算子 |
可达 |
作用 |
submit spmd_submit |
pl. |
派发 kernel 并捕获其生产者 TaskId |
deps= |
pl.at、内联捕获形式 pl.spmd |
添加严格 TaskId 依赖;deferred waiter 使用同一条依赖路径 |
no_dep |
pl. |
让单个任务的单个实参退出依赖跟踪 |
dump_tag |
pl. |
标记张量做选择性 dump |
见 作用域与放置。
数组
| 算子 |
可达 |
作用 |
array.create |
pl.array. |
分配 |
array.get_element |
pl.array. |
读取;也可写作 arr[i] |
array.update_element |
pl.array. |
函数式更新;也可写作 arr[i] = v |
分布式
pypto.language.distributed(约定简写 pld)承载集合通信与远程原语。完整参考见分布式编程;教程见distributed/00-model.md。
功能矩阵
| 操作 |
API |
模式 |
ReduceOp |
Atomic |
支持的 dtype |
说明 |
| AllReduce |
pld.tensor.allreduce |
mesh(InCore + HOST),ring(InCore + HOST) |
Sum、Max、Min、Prod(mesh);仅 Sum(HOST ring) |
— |
FP16、FP32(mesh;编译期硬性检查);HOST ring:仅 FP32(4 字节) |
Mesh: 每步 O(N) 远程流量。Ring: 每步 O(N/P) 远程流量,2(P-1) 步。 |
| AllGather |
pld.tensor.allgather |
— |
— |
— |
仅 FP32(HOST builtin);任意 GM dtype(InCore) |
推式。输入和 target 必须是不同的 buffer。 |
| ReduceScatter |
pld.tensor.reduce_scatter |
— |
Sum、Max、Min、Prod(InCore);仅 Sum(HOST builtin) |
— |
仅 FP32(HOST builtin);任意 GM dtype(InCore) |
每个 rank 在调用前将全部 NR 个数据块写入。 |
| Broadcast |
pld.tensor.broadcast |
— |
— |
— |
仅 FP32(HOST builtin);任意 GM dtype(InCore) |
Root 在调用前将数据写入。 |
| All-to-All |
pld.tensor.all_to_all |
— |
— |
— |
仅 FP32(HOST builtin);任意 GM dtype(InCore) |
个性化交换。输入和 target 必须是不同的 buffer。 |
| Barrier |
pld.tensor.barrier |
— |
— |
— |
— |
Signal 为 INT32,每次调用单次使用。 |
| Put |
pld.tensor.put |
— |
— |
None_ / Add |
所有 GM dtype |
dst 必须是 window-bound。支持分块和流水线 staging。 |
| Get |
pld.tensor.get |
— |
— |
— |
所有 GM dtype |
src 必须是 window-bound。支持分块和流水线 staging。 |
| Notify |
pld.system.notify |
AtomicAdd / Set |
— |
— |
— |
仅副作用的信号投递。 |
| Wait |
pld.system.wait |
Eq / Ge |
— |
— |
— |
仅副作用的信号阻塞。 |
| Deferred Wait |
pld.system.defer_wait |
仅 Ge |
— |
— |
INT32 signal |
注册单调 counter 条件而不让 AIV 自旋;Simpler 保持普通 waiter TaskId 未完成,后续工作使用普通 deps=[wait_tid]。 |
| Remote Load |
pld.tile.remote_load |
— |
— |
— |
任意(tile) |
Tile 级跨 rank 加载。 |
| Remote Store |
pld.tile.remote_store |
— |
— |
— |
任意(tile) |
Tile 级跨 rank 写入。 |
配套示例
每类算子一个可运行文件,供表格条目不够用时查阅:
| 类别 |
示例 |
| 逐元素算术 |
examples/beginner/02_elementwise.py |
| 标量操作数 |
examples/beginner/03_scalar_ops.py |
| 激活函数 |
examples/beginner/04_activation.py |
| Matmul |
examples/beginner/05_matmul.py |
| 拼接 / assemble |
examples/beginner/06_concat.py、examples/intermediate/05_assemble.py |
| 规约 |
examples/intermediate/02_softmax.py、examples/intermediate/03_normalization.py |
| 跨核搬运 |
examples/advanced/03_mixed_kernel.py |
| 任务与依赖 |
examples/intermediate/07_task_graph.py |
See Also