mlir 编译器学习笔记之四 -- 调度
1、指令的活跃区间 LiveRange [startTime, endTime]
startTime: 节点开始执行的时间(指令被发射到功能单元)
endTime: 节点结果就绪的时间(指令执行完成,结果可用)前驱指令P: R1 = R2 + R3 // LiveRange: [10, 12]
当前指令C: R4 = R1 * 2 // 什么时候可以开始?==> R1 就绪,即endTime
2、普通调度 (严格顺序)& 硬件循环(允许重叠)的原因
T1 = max(preStart + hardware_switch_overhead,preEnd + loop_iteration_period - latency)普通调度OOO:可以提前发射,但会在流水线中等待
硬件循环:可以更早开始执行,因为有数据转发 (专有硬件,不竞争通用资源)
3、资源占用:级联模式时需要多个功能单元
