跳转至

Passes

PyPTO IR 变换的参考文档,按阅读顺序组织。实际执行顺序请查阅 pass manager。

文档编号

下表是当前的 pass 文档索引。请通过 pass manager 实现 (python/pypto/ir/pass_manager.py)核对执行顺序,以及可选或依赖后端的 pass 的运行条件。

  • 00 用于 pass manager 概述。
  • 01–89 预留给流水线 pass 页面,按默认流水线的顺序排列。 可选 pass 在对应表项和独立页面中说明。
  • 90 及以上预留给工具 pass(utility passes)和基础设施。在多个位置运行的工具 pass 集中记录,不为每次调用分配独立的页面编号。
  • 文档编号表示阅读顺序,不是绝对执行位置;重复调用的工具 pass 和条件执行的 pass 可能使两者不同。
  • 如果某个流水线 pass 尚无独立页面,请预留其编号并在索引中注明缺口,保持后续页面编号对齐。

新增、删除或调整 pass 顺序时,请更新受影响的页面编号、本索引、pass manager 概述、 站点导航和交叉引用,并保持中英文文档同步。

框架

页面 内容
Pass、PassContext、PassPipeline 和 PassManager 带属性跟踪、插桩与策略化流水线的 pass 组织与执行框架

默认流水线

序号 Pass 作用
01 InlineFunctions 把 FunctionType.Inline 函数体展开到每个调用点
02 UnrollLoops 在编译期展开 ForKind::Unroll 循环
03 CtrlFlowTransform 把 break / continue 改写为结构化控制流
04 ConvertToSSA 转换为 SSA 形式,含变量重命名、phi 节点与 iter_args
05 Simplify 折叠算术表达式、shape 表达式与标量常量绑定
06 FlattenCallExpr 把嵌套调用表达式拍平为三地址形式
07 OutlineHierarchyScopes 把 Hierarchy 作用域外提为带 level / role 元数据的函数
08 OutlineGraphScopes 把 pl.graph 区域外提为 FunctionType.Graph 函数,使作用域形式与 @pl.jit.graph 汇聚
09 OutlineIncoreScopes 把 InCore 作用域外提为独立函数
10 OutlineClusterScopes 把 Cluster 作用域外提为 Group 函数,独立 Spmd 作用域外提为 Spmd 函数
11 DeduplicateOutlinedKernels 合并闭合的 outlined kernel 与独占 Group 单元,保留每次调用
12 ConvertTensorToTileOps 在 InCore 函数中把 tensor 算子转为 tile 算子,并更新编排层调用点
13 OptimizeOrchTensors 消除编排层冗余分配并改善数据流
14 LowerCompositeOps 把复合 tile / 分布式算子分解为基础原语
15 FlattenTileNdTo2D 合并除最后一维外的所有维度,把 3D+ tile 操作拍平为 2D
16 BlockNzTensorViews 把逻辑 pl.NZ 张量改写为 pto-isa 的分块 rank-5 形式,并同步改写其 tile.load 坐标
17 BlockMxScaleTensorViews 将逻辑 MX scale 视图迁移为规范的 rank-5 物理分块形式
18 LegalizeTileCast 把 ISA 无法单条指令完成的 tile.cast 展开为最短的原生 cast 链
19 AutoTileMatmulL0 依据后端 L0 容量选择 L0 tile 形状 (m, n, k) 并据此分块 matmul
20 CanonicalizeTileSlice 把 tile.slice 下降为规范的 tile.extract 形式
21 InferTileMemorySpace 推断每个 tile 的片上 MemorySpace,并插入 tile.move 消解残留不匹配
22 InsertMxScaleAddr 在 memory space 解析完成后,于 MX matmul 消费者前插入 tile.tget_scale_addr
23 ResolveBackendOpLayouts 修正逐元素算子所需的后端 tile layout
24 LowerAutoVectorSplit 把 AUTO pl.split 的混合 InCore 函数转换为显式 split_aiv 形式
25 ExpandMixedKernel 把混合 InCore 函数拆分为独立的 AIC(Cube)与 AIV(Vector)kernel
26 InjectGMPipeBuffer 为经 GM 路由的跨核 pipe 注入 __gm_pipe_buffer workspace(Ascend910)
27 SplitVectorKernel 标记 split 属性并处理不拆分的双 AIV 路径
28 StampTfreeSplit 把每个跨核 tpop 的 split 与 pipe id 复制到与之配对的 tfree 上
29 NormalizeReturnOrder 把每个 InCore 函数的返回元组重排为规范顺序
30 SkewCrossCorePipeline 对混合 cube/vector 循环做软流水,使两个核重叠执行
31 LowerPipelineToSlots 把 pl.pipeline 循环体改为轮转一个分配的多个 slot,而不是复制(memory_planner=PTOAS)
32 LowerPipelineLoops 把 pl.pipeline(N, stage=F) 的循环体复制 F 份以启用乒乓缓冲
33 CanonicalizeIOOrder 按 scalar → load → compute → store 阶梯重排流水循环体内的语句
34 MaterializeTensorStrides 为每个尚无 stride 的 tensor view 填入紧致规范 stride
35 InitMemRef 初始化 MemRef 并创建地址未分配的 alloc 操作
36 SelectBufferIRFunctions / MaterializeSemanticAliases 强制语义要求同一分配的缓冲区真正共用一块(循环携带、原地更新)
37 MemoryReuse 基于生命周期分析复用缓冲区并删除冗余 alloc;memory_planner=DSA_RP 或 PTOAS 时跳过
38 AllocateMemoryAddr 为已有 alloc 操作分配真实地址;memory_planner=PTOAS 时跳过
39 FoldNoOpReshape 折叠既不改变物理形状也不改变分配的 tile.reshape
40 FuseCreateAssembleToSlice 把 tensor.create + tensor.assemble 融合为单个 tensor.slice 视图
41 LowerL2TensorCollectives 把写在 CHIP orchestration 函数体里的托管集合通信改写成一个本地 builtin AIV task,不按设备扇出,也不产生嵌套 L2 dispatch
42 LegalizeSpmdLaunches 为可能为空的 SPMD launch 添加保护
43 DeriveCallDirections 先物化包装函数的 ParamDirection,再为每个调用逐实参推导 ArgDirection
44 AutoDeriveTaskDependencies 推导保守的任务间依赖边
45 ExpandManualPhaseFence 压缩 manual scope 中收益明确的全数组 TaskId 依赖
46 SynthesizeAllReduceSignals 把 host allreduce 的可选 signal 转为显式的内部 signal IR
47 MaterializeCommDomainScopes 在每个 host 编排函数体内装配 WindowBuffer 与 CommDomainScopeStmt 包装
48 LowerHostTensorCollectives 把 host 级 tensor 集合通信改写为内部 builtin chip 派发
49 MaterializeDistTensorCtx 为每个 DistributedTensor 物化显式的 CommCtx 参数与实参
50 LegalizeGraphBoundary 把 Graph 函数体内派生的边界标量外提到调用点,并拒绝 host_build_graph runtime 无法录制的边界
51 MaterializeRuntimeScopes 插入 AUTO RuntimeScopeStmt 使编排 codegen 能 1:1 发射 SIMPLER_SCOPE
52 ClassifyIterArgCarry 把编排层 ForStmt 的每个 iter_arg 分类为平凡别名或需物化的重绑定携带
53 InsertCommFence 为每个发布性写入打标记(本地:region system.cacheinvalid + system.fence;远端写:仅 fence;opaque 写:whole-GM),并为每个 wait 插入 whole-GM system.cacheinvalid;notify 本身不加任何标记
54 MaterializeValidShapeSymbols 将设备 kernel 中无法绑定的 valid_shape 符号转换为前置的 Scalar[INDEX] 参数,并传入调用方的实际有效范围
55 LowerTileToBuffer 默认将选中 kernel 的已规划 Tile 存储转换为显式 Buffer 操作,其余 kernel 保留 Tile

默认流水线之外

页面 内容
工具 Pass 在流水线多个位置运行的归一化与清理 pass
诊断系统 编译期警告与性能提示的统一咨询通道
IR 验证器 在 pass 之间校验 IR 正确性的可插拔属性验证器

共享材料

页面 内容
共享 Pass 工具函数 include/pypto/ir/transforms/utils/ 中的可复用工具
Loop-Carried Compiler Dependency 压缩 循环携带依赖边的压缩方式

另请参阅

  • IR —— 这些 pass 所变换的表示。
  • 后端 —— pass 如何在不对后端分支的前提下获得逐架构答案。
  • 代码生成 —— 流水线跑完之后运行的部分。