📘 课程 📈 历史 🧪 测试 💻 GitHub

ScratchV vs LLVM — 追赶 LLVM 进度

LLVM RV64FD (float32) — baseline (target ≤1.0x)  |  ScratchV RV32IM (Q16.16) — 1.58× current
−72%
动态指令减少
5.3x
vs LLVM 差距缩小
−72%
推理时间减少 @100MHz
2.08x
当前 vs LLVM
1 run recorded · history.json

1. Version vs LLVM Progress · 版本追赶进度

Each version's dynamic instruction ratio vs LLVM baseline (1.0x = LLVM). Goal: ≤1.0x (beat LLVM).
LLVM 1.0x 🎯 LLVM baseline (目标) v0.1.0 7.37x 7,802,187,284 v0.2.0 3.04x 3,221,687,828 -4.33x v0.3.0 2.08x 2,203,799,060 -0.96x Progress: 7.4x → 2.1x (+5.3x, 83% toward LLVM) · Gap remaining: 1.1x

动态指令趋势

绿色虚线 = 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
ScratchV

2. Dynamic Instruction Distribution · 指令粒度

Per-category breakdown with percentages — identifies compilation instruction bottlenecks
CategoryLLVMLLVM %ScratchVSV %SV/LLVM
ALU R-type131,372,7397.1%929,645,35232.0%7.08×
ALU I-type524,713,47728.4%922,090,82131.7%1.76×
FP524,722,18428.4%0.0%0.00×
Shift0.0%255,137,1238.8%
Load527,439,52328.6%528,104,45118.2%1.00×
Store3,053,6180.2%6,830,8820.2%2.24×
Branch80,766,5074.4%265,412,8049.1%3.29×
Jump25,779,6841.4%0.0%0.00×
Upper immediate27,157,6041.5%0.0%0.00×
Total1,845,005,337100%2,907,221,433100%1.58×
Biggest bottleneck: ALU R-type (7.08x vs LLVM). " Store ratio 2.24×: LLVM keeps accumulators in FP registers (few stores). ScratchV spills to stack every MAC due to limited registers.

3. Operator Comparison · 算子粒度

Per-operator-type dynamic instruction ratio (ScratchV / LLVM) — identifies which operator types have the most optimization headroom
relu 1.88x 20,004,960 gemm 1.38x 62,006,398 conv 1.14x 2,035,777,532 maxpool 0.96x 7,646,672 sigmoid 0.72x 18 Bar width = ScratchV / LLVM dynamic instruction ratio · Green <1.5x · Yellow 1.5–4x · Red >4x Green dashed line = LLVM baseline (1.0x) · Numbers on right = ScratchV dynamic instruction count

Per-Operator Instruction Type Breakdown

Category distribution (% of total dynamic instructions) per operator type — compare compiler instruction mix patterns
conv (3 ops, ratio: 1.14x)
CategorySV %SV barLLVM %LLVM bar
ALU I31.3%28.6%
FP0.0%28.6%
Load25.0%28.6%
ALU R25.0%7.1%
Shift12.5%0.0%
Branch3.7%4.3%
Jump1.2%1.4%
Upper1.2%1.4%
gemm (2 ops, ratio: 1.38x)
CategorySV %SV barLLVM %LLVM bar
ALU I33.3%23.1%
FP0.0%30.8%
Load22.2%30.8%
ALU R22.2%7.7%
Shift11.1%0.0%
Branch5.6%4.6%
Upper3.3%3.1%
Jump2.2%0.0%
maxpool (3 ops, ratio: 0.96x)
CategorySV %SV barLLVM %LLVM bar
ALU I34.8%33.3%
Load26.1%25.0%
Branch13.0%12.5%
ALU R8.7%8.3%
Store8.7%4.2%
FP0.0%8.3%
Jump4.3%4.2%
Upper4.3%4.2%
relu (4 ops, ratio: 1.88x)
CategorySV %SV barLLVM %LLVM bar
ALU I26.7%25.0%
Load26.7%25.0%
Store13.3%25.0%
Branch13.3%12.5%
FP0.0%12.5%
ALU R6.7%0.0%
Jump6.7%0.0%
Upper6.7%0.0%
sigmoid (1 ops, ratio: 0.72x)
CategorySV %SV barLLVM %LLVM bar
FP0.0%32.0%
ALU I27.8%20.0%
ALU R16.7%12.0%
Branch16.7%8.0%
Load11.1%12.0%
Shift11.1%0.0%
Store5.6%8.0%
Jump5.6%4.0%
Upper5.6%4.0%
Orange = ScratchV dominant · Green = SV lower · Blue = LLVM. Longer bar = higher % of total instructions.
ModelOp TypeSV StaticSV DynamicLLVM DynamicRatio
cnn_fc1_Gemmgemm8762,005,24744,781,5671.38x
cnn_fc2_Gemmgemm801,1518311.39x
cnn_layer1.0_Convconv165425,115,646371,976,1901.14x
cnn_layer1.1_Relurelu5614,760,9607,872,5121.88x
cnn_layer1.2_MaxPoolmaxpool975,658,3685,904,3840.96x
cnn_layer2.0_Convconv1651,097,367,551960,196,6071.14x
cnn_layer2.1_Relurelu563,572,1601,905,1521.88x
cnn_layer2.2_MaxPoolmaxpool971,369,3281,428,8640.96x
cnn_layer3.0_Convconv165513,294,335449,132,5431.14x
cnn_layer3.1_Relurelu561,670,880891,1361.88x
cnn_layer3.2_MaxPoolmaxpool96618,976645,8880.96x
cnn_relu1_Relurelu549605121.88x
cnn_sigmoid1_Sigmoidsigmoid6918250.72x

4. Optimization Timeline · 优化时间线

Click to expand each version — instruction category breakdown with percentages and per-operator comparison

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

v0.1.02026-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-type2494.9M32.0%
ALU I-type2474.6M31.7%
FP00.0%
Shift684.7M8.8%
Load1417.3M18.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
v0.2.02026-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-type1030.2M32.0%
ALU I-type1021.8M31.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.3.02026-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
ScratchV CI · LLVM RV64FD baseline · GitHub · Optimization History · Generated 2026-07-19 11:02