Skip to content

benchmark精度仿真误差较大bug #55

Description

@jizhenjun

name: pseudo-instruction-precision-and-irtrace-bug
description: 伪指令 vs 真实指令精度结论 + IRTraceExecutor 卷积 im2col 索引 bug
metadata:
node_type: memory
type: project
originSessionId: 002a71ce-676a-4c9f-bf3f-28ac6374d96f

结论(2026-08-29 实测,seed=42):

  1. 伪指令 vs 真实指令:精度逐位相同。伪指令是语义等价宏展开(li/mv/j/bnez/max → RV32IM),与伪/真实编码无关,精度无差异。
  2. 真正精度差来源一 = 指令选择层的算法近似(instruction_select.py):_select_sigmoid clamp 到 [0,1] 而非 1/(1+e^-x)、_select_conv/_select_gemm 单次 MAC(非完整卷积/矩阵乘)、_select_maxpool 退化成 max(x,0)=ReLU(非窗口取最大)。无论用伪指令还是真实指令实现都一样差。
  3. 真正精度差来源二 = 仿真器 bug:rv32_emulator.py:518 _conv2d_numpy 的 im2col 索引错位——cols 行序是 kernel 位置主序 (i*K+j)*C_in+c,w_mat 列序是通道主序 c*K*K+i*K+j,两者配对错位。实测第一层 conv max|diff|=0.42(正确应为 ~1e-5)。
    • 修法:cols[i*K+j::K*K, :] = patch.transpose(1,0,2,3).reshape(C_in, -1)
  4. 实测数据:纯 numpy 参考 vs ONNX Runtime MSE=0.0(完全一致);IRTraceExecutor vs ONNX Runtime MSE=7.7e-3(输出 0.405 vs 0.317)。
  5. 测试错位:tests/test_cnn_pipeline.py step4 用 IRTraceExecutor(全精度 numpy 语义解释 IR)当"编译输出",既非伪指令仿真也非真实二进制执行;真正编译出的近似二进制从未被仿真验证。测试阈值 MSE<1.0 过松。

Why: 排查"伪指令精度"问题时,发现问题其实在仿真层和 lowering 近似层,不在伪/真实指令层面。
How to apply: 判断编译产物数值精度时,先修 _conv2d_numpy 索引 bug,再区分"算法近似"与"编码层";测试应把 IR 语义仿真与编译二进制仿真分开。相关 [[cnn-pseudo-instruction-mapping]] [[register-alloc-spill-findings]]。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions