📘 课程 📊 Dashboard 🧪 测试

ScratchV 编译器优化历史

模型: cnn.onnx (3×Conv + 3×MaxPool + 2×FC)  |  Baseline: LLVM float32 (1.06B 动态指令)  |  更新于 2026-07-19
−72%
动态指令减少
5.3x
vs LLVM 差距缩小
−72%
推理时间减少 @100MHz
2.08x
当前 vs LLVM

动态指令趋势

绿色虚线 = LLVM float32 baseline(1.06B) | 橙色实线 = ScratchV 各版本 | 勾选版本框进行对比
LLVM 1.06B 1.00B 2.00B 3.00B 4.00B 5.00B 6.00B 7.00B 8.00B 7.80B v0.1.0 7.4x vs LLVM 3.22B v0.2.0 3.0x vs LLVM 2.20B v0.3.0 2.1x vs LLVM
LLVM baseline (1.06B)
ScratchV

优化时间线 — 点击展开查看详情

v0.3.0
2026-06-08
Conv2D 循环展开 + ic 指针增量
K=3 时完全展开 kw/kh 循环(9个MAC线性排列),消除全部内层循环控制指令。ic 迭代改用指针增量代替地址重算。
▾ 点击收起详情
优化要点
  • kw+kh 全展开: K=3 时 9个MAC 直接展开, 消除 addi+slt+bne 循环控制, 节省 ~4条/MAC
  • ic 指针增量: 预计算 channel_advance 常数, ic 层从 14条地址重算 → 1条 add
  • 行跳跃常量外提: 释放 s10/s11 寄存器存放 row_advance 和 ic_advance
较上一版:动态指令−31.6%vs LLVM−0.96x推理时间−31.7%
2.20B
动态指令
2.08x
vs LLVM 比值
8 instr/MAC
内层循环效率
22.0s
@100MHz 推理时间
与 LLVM 差距: 1.14B 条指令 (2.08x)

Dynamic Instruction Breakdown

CategoryCount%
ALU R-type704.7M32.0%
ALU I-type699.0M31.7%
FP00.0%
Shift193.4M8.8%
Load400.3M18.2%
Store5.2M0.2%
Branch201.2M9.1%
Jump00.0%
Upper imm.00.0%
Total2.20B100%

Per-Operator Type

Op TypeDynamic Insnsvs LLVM
conv1.54B0.87x
gemm78.3M1.75x
maxpool24.2M3.03x
relu16.2M1.52x
sigmoid150.61x
v0.2.0
2026-06-05
Conv2D 内层循环优化
四项优化针对最内层循环(占动态指令 97%):边界检查移除、常量外提、指针步进、强度削减。
▸ 点击展开详情(指令分类 + 算子对比)
优化要点
  • 边界检查移除: pads=0 时跳过 ih/iw 越界检查,节省 8条/MAC
  • 常量外提: a2-a7 空闲寄存器预加载 K/stride/W/H*W/C_in,节省 16条/MAC
  • 指针步进: 最内层 kw 循环使用 in_ptr/wt_ptr 指针加法代替完整地址重算,节省 12条/MAC
  • 强度削减: ih_base/iw_base 在 oh/ow 循环外一次性计算,节省 1条/MAC
较上一版:动态指令−58.7%vs LLVM−4.33x推理时间−58.7%
3.22B
动态指令
3.04x
vs LLVM 比值
12 instr/MAC
内层循环效率
32.2s
@100MHz 推理时间
与 LLVM 差距: 2.16B 条指令 (3.04x)

Dynamic Instruction Breakdown

CategoryCount%
ALU R-type1.03B32.0%
ALU I-type1.02B31.7%
FP00.0%
Shift282.7M8.8%
Load585.2M18.2%
Store7.6M0.2%
Branch294.1M9.1%
Jump00.0%
Upper imm.00.0%
Total3.22B100%

Per-Operator Type

Op TypeDynamic Insnsvs LLVM
conv2.26B1.27x
gemm114.5M2.56x
maxpool35.4M4.43x
relu23.6M2.22x
sigmoid220.89x
v0.1.0
2026-06-04
初始版本 — ONNX→RISC-V 编译器初版
Conv/Gemm/MaxPool 均使用直接循环 + 完整地址重算 + 边界检查。Q16.16 定点乘使用 MULH+MUL 全精度。
▸ 点击展开详情(指令分类 + 算子对比)
优化要点
  • ONNX 模型解析与内存规划
  • Conv2D 多层循环直接展开,逐元素边界检查
  • Gemm 矩阵乘法基础实现
  • MaxPool 滑动窗口基础实现
  • Q16.16 定点乘法 (MULH+MUL)
7.80B
动态指令
7.37x
vs LLVM 比值
30 instr/MAC
内层循环效率
78.0s
@100MHz 推理时间
与 LLVM 差距: 6.74B 条指令 (7.37x)

Dynamic Instruction Breakdown

CategoryCount%
ALU R-type2.49B32.0%
ALU I-type2.47B31.7%
FP00.0%
Shift684.7M8.8%
Load1.42B18.2%
Store18.3M0.2%
Branch712.3M9.1%
Jump00.0%
Upper imm.00.0%
Total7.80B100%

Per-Operator Type

Op TypeDynamic Insnsvs LLVM
conv5.46B3.07x
gemm277.3M6.19x
maxpool85.7M10.73x
relu57.3M5.37x
sigmoid532.15x
ScratchV Compiler | GitHub  |  JSON data  |  Dashboard  |  Generated 2026-07-19 11:02