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):
- 伪指令 vs 真实指令:精度逐位相同。伪指令是语义等价宏展开(
li/mv/j/bnez/max → RV32IM),与伪/真实编码无关,精度无差异。
- 真正精度差来源一 = 指令选择层的算法近似(
instruction_select.py):_select_sigmoid clamp 到 [0,1] 而非 1/(1+e^-x)、_select_conv/_select_gemm 单次 MAC(非完整卷积/矩阵乘)、_select_maxpool 退化成 max(x,0)=ReLU(非窗口取最大)。无论用伪指令还是真实指令实现都一样差。
- 真正精度差来源二 = 仿真器 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)
- 实测数据:纯 numpy 参考 vs ONNX Runtime MSE=0.0(完全一致);IRTraceExecutor vs ONNX Runtime MSE=7.7e-3(输出 0.405 vs 0.317)。
- 测试错位:
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]]。
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):
li/mv/j/bnez/max→ RV32IM),与伪/真实编码无关,精度无差异。instruction_select.py):_select_sigmoidclamp 到 [0,1] 而非 1/(1+e^-x)、_select_conv/_select_gemm单次 MAC(非完整卷积/矩阵乘)、_select_maxpool退化成 max(x,0)=ReLU(非窗口取最大)。无论用伪指令还是真实指令实现都一样差。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)tests/test_cnn_pipeline.pystep4 用 IRTraceExecutor(全精度 numpy 语义解释 IR)当"编译输出",既非伪指令仿真也非真实二进制执行;真正编译出的近似二进制从未被仿真验证。测试阈值 MSE<1.0 过松。Why: 排查"伪指令精度"问题时,发现问题其实在仿真层和 lowering 近似层,不在伪/真实指令层面。
How to apply: 判断编译产物数值精度时,先修
_conv2d_numpy索引 bug,再区分"算法近似"与"编码层";测试应把 IR 语义仿真与编译二进制仿真分开。相关 [[cnn-pseudo-instruction-mapping]] [[register-alloc-spill-findings]]。