课题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:测试更复杂的循环体,分析调度前后性能提升,撰写文档。