mlir 编译器学习笔记之四 -- 调度

张开发
2026/4/16 23:19:58 15 分钟阅读

分享文章

mlir 编译器学习笔记之四 -- 调度
调度表调度 模调度 整数线性规划(NP适合热点) 全局/路径调度(跨分支投机a) 调度的时候资源 并行度是关键考虑需要先分析读、写、定义的依赖分析指令readylistb) 传统的readlist发射可以考虑关键逻辑优先但实际还要考虑寄存器、内存所以Priority(insn) f(关键逻辑优先级-寄存器压力增量)c) 对应单个BB, 正向或者反向分析是一样的结果。当跨BB时才存在差异正向并行反向投机d) 可以通过任务依赖图查看依赖分析准确性和调度甘特图查看调度结果1、指令的活跃区间 LiveRange [startTime, endTime]startTime: 节点开始执行的时间指令被发射到功能单元endTime: 节点结果就绪的时间指令执行完成结果可用前驱指令P: R1 R2 R3 // LiveRange: [10, 12]当前指令C: R4 R1 * 2 // 什么时候可以开始 R1 就绪即endTime2、普通调度 (严格顺序) 硬件循环允许重叠的原因T1 max(preStart hardware_switch_overhead,preEnd loop_iteration_period - latency)普通调度OOO可以提前发射但会在流水线中等待硬件循环可以更早开始执行因为有数据转发 (专有硬件不竞争通用资源)3、资源占用级联模式时需要多个功能单元4、“operand #0 does not dominate this use”。这个错误通常发生在SSA静态单赋值形式中当某个值在定义之前被使用或者控制流导致某个值在某个使用点可能没有被定义5、mlir中调度控制流scf算子(isaRegionBranchOpInterface(op))并不是BB的边界该函数在遍历基本块的操作时遇到scf::ForOp或scf::IfOp时会将之前积累的连续普通操作区间保存递归地进入ForOp的内部区域收集区域内部的操作范围然后继续从ForOp的下一个操作开始积累新的区间。因此ForOp本身作为分隔点它既不被包含在前一个区间也不被包含在后一个区间它自身也不被当作一个区间。这样划分后每个区间都是不含任何区域分支操作的一段连续操作

更多文章