课题28:完善后端指令选择
难度:中
概述:为RISC-V后端增加对更多ONNX/DSL算子的支持,并添加新数据类型(如float64),扩展编译器的适用场景。
详细任务:
1. 分析当前instruction_select.py中已有的算子映射(如add → add,mul → mul等)。
2. 识别缺失的常用算子:如div(除法)、mod(取模)、sqrt、min/max等。
3. 为缺失算子实现RISC-V指令映射(注意RISC-V整数除法需要div/rem,浮点需要扩展指令集)。
4. 添加float64(双精度浮点)支持:增加新的寄存器类、加载存储指令(fld/fsd)、算术指令(fadd.d等)。
5. 更新类型系统,在IR中区分f64和f32。
6. 编写测试用例验证新算子和新类型。
交付产物:
- 更新后的instruction_select.py和type_system.py
- 新增的测试程序(使用除法和双精度浮点)
- 文档:支持的操作列表、数据类型说明
12周每周目标:
- W1:学习项目当前指令选择模块,列出已支持的算子和类型。
- W2:识别缺失的常用整数算子(除法、取模),查阅RISC-V手册中div/rem指令。
- W3:实现整数除法和取模的指令选择,编写简单DSL测试(a / b)。
- W4:测试除法和取模的正确性,处理除零错误(可忽略或插入陷阱)。
- W5:学习RISC-V浮点扩展(F/D扩展),了解fld/fsd和fadd.d等指令。
- W6:在IR中添加float64类型,修改类型解析器。
- W7:实现float64的加载和存储指令选择。
- W8:实现float64算术指令(加、减、乘、除)。
- W9:实现float64比较指令(feq.d, flt.d等)和条件分支。
- W10:编写测试用例:双精度浮点求和、点积等。验证模拟器支持。
- W11:为sqrt、min/max等添加指令选择(可使用库调用或硬件指令)。
- W12:更新文档,撰写新算子、新类型的使用指南。