ATen 基础算子讲解书(给 inductor 开发者的培训教材)
返回:← PyTorch 编译器技术栈总览
这是一本面向参与 torch-inductor(含 torch-npu _inductor_new 后端)开发人员 的基础算子功能手册。目标只有一个:系统性、全面地理解 PyTorch 基础算子到底在做什么 ——尤其是那些"看不出在干什么、为什么需要它"的操作类算子 。
本书不讲算子开发 (不教你写新算子),只讲算子功能 :数学公式 / 操作逻辑 / 实现复杂度 / 在模型里的角色。
inductor 的工作是把一个 PyTorch 计算图(由 aten.* 算子组成)编译成后端可执行的核(NPU 上是 Triton→CANN)。要做好这件事,第一步是看懂图里每个算子在干什么 。但现实是:
数学类算子 (add/mul/matmul…)好懂——它们就是数学公式的代码翻译;
操作类算子 (as_strided/gather/scatter/expand/sort…)难懂——它们不在"算数学",而在"搬运/重排/索引"数据,从功能描述很难直觉地理解"它为什么存在、模型哪里需要它"。
本书的重心因此放在操作类算子 (Part II),每个都深讲"它在干什么 / 功能是什么 / 为什么需要它 "。数学类算子(Part I)则更紧凑,重点放在数学本身和数值精度。
新手 :先读 第 0 章 张量基底 (shape/stride/广播/类型提升 + 全书分类轴),再按章号顺序读。
查某个算子 :跳到下方附录 A 全 161 算子速查 ,找到它属于哪一章。
inductor 开发者 :每章末尾有"inductor 视角",附录 C 有归类速查(pointwise / reduction / template / fallback)。
基础算子 = Core ATen Ops = torch.export(..., aten_graph=True) 后图里能看到的、不可再分解的算子集 = native_functions.yaml 里带 core 标签的算子(共 161 个基名 / 190 个重载)。
这条规则杜绝两类 scope 蔓延:
"为什么没有 silu?" —— silu 是复合算子,分解成 sigmoid + mul,两者都在第 1/6 章。silu 本身只在附录 B 给出分解式。
"transpose/reshape/contiguous/to/zeros/linspace/eye 呢?" —— 这些也是复合算子(transpose→permute、reshape→view+copy、contiguous→clone、to→_to_copy、zeros/linspace/eye→full/arange)。本书主章节只讲它们分解到 的那些基础算子;复合算子的分解式统一在附录 B。
主章节精选约 100 个最主流的 core 算子做讲解;其余约 60 个冷门算子(fft_r2c/col2im/_local_scalar_dense/_pdist_forward/3D 池化变体/reflection_pad1d 等)只在附录 A 一行带过。
分层契约(为什么 cos 一行、cumsum 两页)
为兼顾"全面"与"不臃肿",每个算子分两层之一,序言预先声明 :
Tier D(详解) ——固定模板全展开。分配给:①所有操作类(Part II)算子 (用户强调的重点);②数学/数值非平凡的算子(_softmax/var/cumsum/mm/gelu/native_layer_norm/convolution/div/pow/clamp/where/erf 等)。
Tier C(速查) ——本章开头一张速查表带过(算子 | 功能一句话 | 形状/风险 | inductor 归类)。分配给:公式一目了然的(abs/neg/add/cos/sin/exp/log/relu/eq/lt/logical_*/bitwise_* 等),且同类打包 (三角族、六个比较算子、logical/bitwise 各一组)。
详见 第 0 章 0.6 节 。本质是 位置保持 (position-preserving) vs 位置变化 (position-changing) :
轴
内涵
形状
重心
inductor 归口
本书
Part I 数学语义类
out[i] 的读地址闭式仿射、与数据值无关、不重解释存储 (逐元素 1:1 / 规约 N:1 / mm 行·列块)
平凡可推
数学/数值
pointwise/reduction/template
第 1–6 章
Part II 张量操作类
out[i] 依赖 in 别处地址 / 重解释存储
结构逻辑为主
为什么存在 + 操作逻辑
多为 fallback/scatter/gather
第 7–12 章(重心 )
Part III 模型层计算原语
重计算,inductor 用 template
专门规则
数学 + im2col/数值稳定性
template/fallback
第 13–16 章
第 0 章 张量基底 — shape/dtype/stride/contiguity/广播/类型提升/SSA 契约
stride 的本质 — 一块一维内存如何假装成任意多维张量;讲透 stride「能做 / 不能做」的精确边界(第 0 / 7 章的深度补充)
章
标题
核心算子
1
逐元素算术
add/sub/mul/div/pow/clamp/exp/log/…
2
三角与超越函数
sin/cos/atan2/sigmoid/erf/…
3
比较与布尔/位运算
eq/lt/where/logical_/bitwise_ /isinf/isnan
4
规约
sum/mean/var/amax/argmax/cumsum/…
5
线性代数核心
mm/bmm/addmm(matmul 旗舰)
6
激活函数
relu/gelu/sigmoid/_softmax/native_dropout
Part II 张量操作/结构类(位置变化,全书重心)
章
标题
核心算子
7
形状与视图
as_strided/view/expand/permute/select/slice
8
拼接与切分
cat/repeat/split_with_sizes
9
索引家族(最难)
gather/scatter/index_put/embedding/nonzero
10
排序与选取
sort/topk
11
创建与填充
empty/full/arange/rand/randn
12
内存布局与类型转换
clone/copy/to_copy/resize
章
标题
核心算子
13
卷积
convolution(+im2col/col2im)
14
池化
max_pool2d/avg_pool2d/_adaptive_avg_pool2d
15
归一化
native_layer_norm/native_group_norm/batch_norm
16
填充/上采样/采样
constant_pad_nd/upsample_*/grid_sampler_2d
## aten.<op>(签名) — 一句话功能
作用与语义 数学公式 / 操作定义;输入→输出形状;返回值/别名
示例 极简的「输入→输出」实例(`>>>` REPL + 真实 torch 输出,值经 `docs/docs/aten/_examples/verify_chNN.py` 实跑);
难点结构算子(as_strided/gather/scatter/conv/grid_sampler 等)在 REPL 后再加一张「输入张量→输出张量」标注图
为什么需要这个算子 / 数值与精度 (自适应二选一)
· 操作类:解决什么结构变换 + 模型域用途 + 与相邻算子的边界
· 数学类:数值稳定性 / 精度陷阱
实现逻辑与复杂度 伪代码(NumPy 风格)+ 时间/空间复杂度 + 是否零拷贝
边界与陷阱 负索引/空输入/accumulate/非连续/类型提升/NaN
Inductor 视角(一行) pointwise/reduction/template/fallback + 为什么
附录 A:Core ATen 全 161 算子速查表
标注:★主章节详解 = 该章有完整 Tier D 条目;△速查 = 该章速查表一行;○仅此列出 = 冷门,正文不展开。所有算子均属 core-aten 基础集(带 core 标签)。
算子
功能
讲解
sym_size / sym_stride / sym_numel / sym_storage_offset
读 shape/stride/元素数/偏移(不计算)
第 0 章
_local_scalar_dense
0 维张量 → Python 标量
○
算子
功能
add sub mul neg abs sign reciprocal
加减乘除/取反/绝对值/符号/倒数
△
div pow fmod remainder clamp
除/幂/取余(两版)/区间裁剪
★
sqrt rsqrt exp expm1 log log2 log10 log1p
指数/对数族
△
maximum minimum
逐元素取大/取小
△
floor ceil round trunc
取整族
△
算子
功能
sin cos tan sinh cosh asin acos atan asinh acosh atanh
三角/双曲族
△
atan2
两参反正切(象限正确)
★
sigmoid erf
逻辑斯蒂/误差函数
★
算子
功能
eq ne lt le gt ge
六个逐元素比较(返回 bool)
△
where
按掩码逐元素选择
★
logical_and logical_or logical_not logical_xor
布尔逻辑(操作 bool)
△
bitwise_and bitwise_or bitwise_not bitwise_xor
按位逻辑(操作整数)
△
isinf isnan
inf/NaN 判定
△
算子
功能
sum prod mean amax amin max min any
沿某维聚合
△/★
var
方差(数值/无偏估计)
★
argmax argmin
极值所在下标
★
cumsum
前缀和(scan 类)
★
注:cumprod/cummax/cummin/logcumsumexp 不在 core 161(scan 家族复合),第 4 章以 cumsum 为代表并点名家族。
算子
功能
mm bmm addmm
矩阵乘 / 批矩阵乘 / αAB+βC
★
注:matmul/mv/dot/outer/einsum/linear 都是复合(→ mm/bmm),附录 B 给分解式。
算子
功能
relu leaky_relu hardtanh tanh
分段线性/双曲正切
△
gelu
高斯误差线性单元
★
sigmoid
(见 A.2)
★
_softmax _log_softmax
数值稳定的归一化指数
★
native_dropout
随机置零 + 缩放(训练)
★
算子
功能
as_strided
直接指定 (offset,shape,stride) 的视图(底层原语 )
★
view expand permute squeeze unsqueeze select slice
改元数据/零拷贝视图
★
flip diagonal
翻转/取对角
△
注:transpose/reshape/flatten/broadcast_to 是复合(→ permute / view+copy / expand)。
算子
功能
cat
沿某维拼接
★
split_with_sizes
按尺寸切分
★
repeat
按各维重复(分配内存 )
★
注:stack/chunk/unbind 是复合(→ unsqueeze+cat / split / slice+squeeze)。
算子
功能
gather scatter scatter_add scatter_reduce
按 index 张量收集/散布(轴语义是难点 )
★
index index_select index_put
高级索引(index_put 支持 accumulate)
★
masked_scatter nonzero
掩码散布 / 非零位置
★
embedding
按 id 查表(gather 的特化)
★
_embedding_bag
分段查表+规约(sum/mean/max)
○
embedding_dense_backward
embedding 的稠密反向
○
算子
功能
sort
排序,返回 (values, indices)
★
topk
取前 k 大/小
★
注:argsort 复合(→ sort 的 indices)。
算子
功能
empty empty_strided
未初始化张量(后者指定 stride)
△
full full_like scalar_tensor
填充常量
△
arange
等差数列
★
rand randn randperm
均匀/正态/随机排列
★/△
fill
原地填充
△
注:zeros/ones/eye/linspace/randint/*_like 多为复合(→ full/arange)。
算子
功能
clone copy
显式拷贝(含跨设备)
★
_to_copy
dtype/device 转换的底层拷贝
★
resize_ alias
原地改形 / 恒等别名(SSA 逃生舱 ,见第 0 章)
△
注:to/contiguous/float() 等是复合(→ _to_copy / clone)。
算子
功能
convolution
通用卷积(stride/pad/dilation/groups/transposed/output_padding)
★
convolution_backward
卷积反向
○
col2im
列还原成图(im2col 的逆,降级可懂性关键)
○
算子
功能
max_pool2d_with_indices
最大池化(带 argmax,反向用)
★
avg_pool2d avg_pool2d_backward
平均池化
★/○
_adaptive_avg_pool2d _adaptive_avg_pool2d_backward
自适应平均池化
★/○
max_pool3d_with_indices avg_pool3d _adaptive_avg_pool3d adaptive_avg_pool1d avg_pool1d
3D/1D 变体(与 2D 同构)
○
算子
功能
native_layer_norm native_layer_norm_backward
层归一化(数值稳定 + eps)
★
native_group_norm native_group_norm_backward
组归一化
★
_native_batch_norm_legit _native_batch_norm_legit_no_training
批归一化(_legit=含 running stats 的"正式"路径)
★
算子
功能
constant_pad_nd reflection_pad2d replication_pad2d
常数/反射/复制填充
△
reflection_pad1d reflection_pad3d replication_pad3d
1D/3D 填充变体
○
upsample_nearest2d upsample_bilinear2d
最近邻/双线性上采样
★
grid_sampler_2d
双线性网格采样(空间变换/attention 用)
★
_cdist_forward _pdist_forward
成对距离(全/下三角)
○
_fft_r2c
实→复 FFT(core 里唯一的谱算子)
○
本书验证基准:torch 2.7.1 + torch-npu 2.7.1.post4。算子归类(core-aten)以 torchgen/.../native_functions.yaml 的 core 标签为准;inductor 降级以 torch/_inductor/lowering.py 为准。
本书是三大编译器教程的算子前置知识 ——Inductor 的输入就是一张由 aten.* 算子组成的计算图,理解每个算子在做什么是理解 Inductor 如何 lower 它们的前提。
Inductor 编译器教程 — 书中每个算子的「Inductor 视角」标注(pointwise / reduction / template / fallback)直接对应 Inductor 的 lowering 路径
Triton 编译器教程 — Inductor 默认生成 Triton kernel;算子类型决定了走哪条 codegen 路径
MLIR 编译器基础设施教程 — Triton 本身基于 MLIR 构建,底层 IR 理解有助于建立完整技术栈视图