算子目录
每个算子家族一行。每个名字都链到 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 数字会选中标量操作数形式。Tensor/Tensor 与 Tile/Tile 形式的 div 设置 high_precision=True 时会在 A5 上选择速度较慢、精度较高的 PTO 路径;A2/A3 接受该参数但 PTO-ISA 会忽略它并返回默认结果,编译时会给出告警 |
neg abs recip |
pl. |
取负、绝对值、倒数;FP16/FP32 倒数设置 high_precision=True 时会在 A5 上选择速度较慢、精度较高的 PTO 路径;A2/A3 接受该参数但 PTO-ISA 会忽略它并返回默认结果,编译时会给出告警 |
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. |
指数、自然对数。log 的 high_precision=True 在 A5 上选择更慢、更高精度的 PTO 路径;A2/A3 接受该参数但 PTO-ISA 会忽略它并返回默认结果,编译时会给出告警 |
sqrt rsqrt |
pl. |
平方根;倒数平方根。high_precision= 只作用于张量路径,传给 Tile 会抛异常 —— tile 级的精度由是否传入 scratch tile 决定:pl.tile.rsqrt(src, tmp) |
sin cos |
pl. |
三角函数 |
比较与选择
| 算子 |
可达 |
作用 |
cmp cmps |
pl. |
比较两个操作数 / 操作数与标量 |
maximum minimum |
pl. |
两个操作数的逐元素最大 / 最小 |
maximums minimums |
pl. (t) |
与标量的逐元素最大 / 最小 |
max min |
pl. (t) |
两个标量取最大 / 最小 —— 不是 tile 规约。规约 tile 请用 row_max / col_max(以及对应的 min 形式) |
select |
pl. (t) |
out[i] = cond[i] ? a[i] : b[i]。条件是 cmp / cmps 的掩码(若持有 0/1 值,请先比较:cmps(v, 0, cmp_type=1));任一分支可以是常量标量。不需要 scratch tile,由 lowering 补齐。两个 tile 分支的 shape、valid 范围与 dtype 必须一致 |
sel sels |
pl. (t) |
select 背后 1:1 对应 TSEL / TSELS 的形式:必须传掩码,scratch tile 由调用方提供 |
激活
位运算
规约
行规约折叠最后一个轴;列规约折叠第一个轴。
若干规约接受 tmp_tile 参数。传入它会改变规约策略(二叉树 vs 顺序),从而改变浮点结合顺序 —— 结果是在容差内有差异,而不是错误。对部分有效 tile 的规约取决于填充值,见 内存 § 有效形状。
Tensor 的 pl.col_sum(x, is_binary=True) 使用编译器分配的静态二维输入 [ceil(M/2), N] 大小的临时缓冲区(其他形状保守使用输入大小)进行树形归约。默认 False 保持顺序归约。该选项改变浮点求和顺序,可能增加 UB 占用。Tile 调用方仍通过传入 tmp_tile 选择树形归约。
广播与展开
形状与布局
量化
| 算子 |
可达 |
作用 |
quant_mx |
pl. (T/t) |
Ascend950 block-32 动态量化,生成 FP8E4M3FN 或 packed fp4e2m1x2 数据及 FP8E8M0 scale。FP4 输入须为 FP16/BF16;axis1 返回 [M,K/2],axis0 将 [N,K] 转置为 [K,N/2]。quant_scale_alg="ocp" 为默认值;"nv" 支持 FP4 axis0。Tensor 调用物化 GM 数据和 MX layout scale,tile 调用保留在片上。FP8 结果可供 matmul_mx 使用;原生 FP4 矩阵乘受 PTOAS v0.67 几何问题限制(见 类型)。 |
quant_mx_raw |
pl.tile. (t) |
直接使用 Ascend950 TQUANT,显式提供 max/scaling 工作区。返回原生 FP4E2M1X2 或 INT8 数据及原始 UINT8 指数,不进行 MX scale 分块打包。axis1 允许任意正行数和 32 的倍数 K(原生 FP4 为 64 的倍数);源有效行数可小于物理行数。axis0 直接使用源朝向,每 32 个有效行分组;FP16/BF16 行数为 64 的倍数时,可用 interleave=True 交错相邻指数对。 |
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