{
  "title": "ScratchV 优化历史",
  "model": "cnn.onnx (3×Conv + 3×MaxPool + 2×FC)",
  "baseline": {
    "name": "LLVM float32",
    "static_insns": 1102,
    "dynamic_insns": 1059548774,
    "time_100mhz_s": 10.6
  },
  "milestones": [
    {
      "date": "2026-06-04",
      "version": "v0.1.0",
      "title": "初始版本 — ONNX→RISC-V 编译器初版",
      "description": "Conv/Gemm/MaxPool 均使用直接循环 + 完整地址重算 + 边界检查。Q16.16 定点乘使用 MULH+MUL 全精度。",
      "changes": [
        "ONNX 模型解析与内存规划",
        "Conv2D 多层循环直接展开，逐元素边界检查",
        "Gemm 矩阵乘法基础实现",
        "MaxPool 滑动窗口基础实现",
        "Q16.16 定点乘法 (MULH+MUL)"
      ],
      "static_insns": 785,
      "dynamic_insns": 7802187284,
      "vs_llvm_ratio": 7.37,
      "time_100mhz_s": 78.0,
      "per_mac_insns": 30,
      "tag": "baseline",
      "instruction_breakdown": {
        "static_insns": 785,
        "dynamic_insns": 7802187284,
        "categories": {
          "alu_r": 2494913893,
          "alu_i": 2474639598,
          "shift": 684718265,
          "load": 1417287924,
          "store": 18332219,
          "branch": 712295383,
          "jump": 0,
          "upper": 0,
          "fp": 0
        },
        "per_operator": {
          "conv": {
            "dynamic_insns": 5463470179,
            "ratio": 3.07
          },
          "gemm": {
            "dynamic_insns": 277347034,
            "ratio": 6.19
          },
          "maxpool": {
            "dynamic_insns": 85655275,
            "ratio": 10.73
          },
          "relu": {
            "dynamic_insns": 57267031,
            "ratio": 5.37
          },
          "sigmoid": {
            "dynamic_insns": 53,
            "ratio": 2.15
          }
        }
      }
    },
    {
      "date": "2026-06-05",
      "version": "v0.2.0",
      "title": "Conv2D 内层循环优化",
      "description": "四项优化针对最内层循环（占动态指令 97%）：边界检查移除、常量外提、指针步进、强度削减。",
      "changes": [
        "边界检查移除: 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"
      ],
      "static_insns": 749,
      "dynamic_insns": 3221687828,
      "vs_llvm_ratio": 3.04,
      "time_100mhz_s": 32.2,
      "per_mac_insns": 12,
      "tag": "optimized",
      "instruction_breakdown": {
        "static_insns": 749,
        "dynamic_insns": 3221687828,
        "categories": {
          "alu_r": 1030202612,
          "alu_i": 1021830927,
          "shift": 282734625,
          "load": 585228102,
          "store": 7569760,
          "branch": 294121799,
          "jump": 0,
          "upper": 0,
          "fp": 0
        },
        "per_operator": {
          "conv": {
            "dynamic_insns": 2255982166,
            "ratio": 1.27
          },
          "gemm": {
            "dynamic_insns": 114522445,
            "ratio": 2.56
          },
          "maxpool": {
            "dynamic_insns": 35368871,
            "ratio": 4.43
          },
          "relu": {
            "dynamic_insns": 23646766,
            "ratio": 2.22
          },
          "sigmoid": {
            "dynamic_insns": 22,
            "ratio": 0.89
          }
        }
      }
    },
    {
      "date": "2026-06-08",
      "version": "v0.3.0",
      "title": "Conv2D 循环展开 + ic 指针增量",
      "description": "K=3 时完全展开 kw/kh 循环（9个MAC线性排列），消除全部内层循环控制指令。ic 迭代改用指针增量代替地址重算。",
      "changes": [
        "kw+kh 全展开: K=3 时 9个MAC 直接展开, 消除 addi+slt+bne 循环控制, 节省 ~4条/MAC",
        "ic 指针增量: 预计算 channel_advance 常数, ic 层从 14条地址重算 → 1条 add",
        "行跳跃常量外提: 释放 s10/s11 寄存器存放 row_advance 和 ic_advance"
      ],
      "static_insns": 887,
      "dynamic_insns": 2203799060,
      "vs_llvm_ratio": 2.08,
      "time_100mhz_s": 22.0,
      "per_mac_insns": 8,
      "tag": "optimized",
      "instruction_breakdown": {
        "static_insns": 887,
        "dynamic_insns": 2203799060,
        "categories": {
          "alu_r": 704711216,
          "alu_i": 698984556,
          "shift": 193404927,
          "load": 400325919,
          "store": 5178102,
          "branch": 201194336,
          "jump": 0,
          "upper": 0,
          "fp": 0
        },
        "per_operator": {
          "conv": {
            "dynamic_insns": 1543207053,
            "ratio": 0.87
          },
          "gemm": {
            "dynamic_insns": 78339203,
            "ratio": 1.75
          },
          "maxpool": {
            "dynamic_insns": 24194114,
            "ratio": 3.03
          },
          "relu": {
            "dynamic_insns": 16175596,
            "ratio": 1.52
          },
          "sigmoid": {
            "dynamic_insns": 15,
            "ratio": 0.61
          }
        }
      }
    }
  ]
}