课题18:指令调度(基本块内列表调度)
难度:高
概述:在基本块内重排RISC-V指令,减少数据冒险引起的流水线停顿,提高指令级并行性。
详细任务:
1. 定义RISC-V指令延迟模型(如lw延迟2周期,算术指令1周期)。
2. 构建依赖有向图:节点为指令,边为RAW/WAR/WAW依赖,边权为延迟周期。
3. 实现列表调度算法:维护就绪队列(所有前驱已调度),按优先级(最长路径长度)选择指令发射。
4. 输出调度后的指令序列,并计算预估的总时钟周期数(相比原始顺序的改善)。
5. 集成到后端,添加--schedule选项。
交付产物:
- inst_scheduler.py模块
- 测试用例及调度前后对比
- 文档:延迟模型、算法说明
12周每周目标:
- W1:学习指令调度原理(数据冒险、流水线停顿、列表调度算法)。
- W2:定义RISC-V简单延迟模型(如lw延迟2,算术指令1,分支1)。
- W3:实现依赖分析:为基本块内指令构建有向图,节点为指令索引,边为RAW依赖。
- W4:添加WAR和WAW依赖边(虽不引起真冒险,但影响寄存器分配,先处理RAW)。
- W5:为每个节点计算优先级(最长路径长度到结束节点)。
- W6:实现列表调度核心:维护就绪队列,按优先级选择指令,更新时钟。
- W7:实现调度器,输出调度后的指令序列。忽略分支延迟槽。
- W8:编写模拟器功能:给定原始顺序和调度后顺序,比较预估总周期数。
- W9:处理分支指令:分支必须作为基本块的最后一条,调度时不能将其提前。
- W10:实现寄存器重命名(可选,复杂),先不实现,靠列表调度避免冲突。
- W11:集成到代码生成后端,添加--schedule选项,测试短基本块。
- W12:测试更复杂的循环体,分析调度前后性能提升,撰写文档。