系列gdev-masterNVIDIA/nouveau 用户态 GPGPU 运行时从 C/C 到 Rust 的移植工程形状不是性质收在「绿照到的是哪部分」这个问题上还留了一条本机证否不了的口子libdrm 的版本落差只能上机当天量。这一篇就是那一天的实录走完——答案是一个带脚注的「能」。先把结论钉在桌上每个数都给口径数值口径真机 gate6/6 用例 stdoutstderrrc 逐字节一致比对副本剔除 6 行已登记基线插桩后§三用例构成见 §四真算力覆盖首跑 3/6 → 当晚补跑后 5/6上 GPU 真算并回拷的用例数§四、§五仓库448 个 commit138 个.rs/ 90,636 行git rev-list --count HEADfind rust/gdev-rs -name *.rs -not -path */target/*行数同条加 -exec cat {} 单测938 全绿cargo test --workspace --lib09-23 体检真跑的读数不是沿用值一、上机前的最后两步出「.so 可交」的结论之前还有两步收尾都记在案门-48 整单收口 最终见证48 键 93 条判据全部落地对账 69 48 回填 21 显式不回填出门清单从干净 HEAD 重编六步全绿双库 sha256 冻结在 MANIFEST最后做了一次「最终见证 PASS」——48 键当日全量重扫36 分钟严格判据 S1…S7 全过。结论开发机段验证完尽.so可交。发起检查第一轮查出四类真问题——最重的一条是49 个提交未推送本地唯一副本覆盖门-48 全程第二轮换方法深查不采信声明、直接量原始状态cargo test真跑 938 全绿、双库 sha 字节级与 MANIFEST 一致、证伪注入 9/9。顺带把方法论复盘如实入档第一轮为什么没看出来——看见了信息、没看见问题检查做成了「验证声明」而不是「找未声明的洞」。49 个提交当天推上远端。二、首查目标机是 oceanProxmox上的 Fedora 18 VMGTX 580 直通。第一件事不是跑是查——按单分四批每批只做「读取证 登记」批次查到什么首查内核 ✅uname -r3.6.10-4.gdev.fc18.x86_64gdev 内核在跑设备 ❌C 基线 ❌——卡点全在环境侧批次二GPU 直通 ✅nouveau.ko在盘上、只是从未modprobe批次三modprobe后card0在C 基线定案其构建脚本userON/uschedOFF与本工程移植裁定逐项吻合批次四三个测试二进制与开发机同源 ✅推送段至此打通产物上机C 基线指纹记下当时口径 N2 条。三、首跑 5/6gate 首跑✗六个用例里 5 处不一致。没慌按逐文件对读——.out/.err/.rc两侧全部取回stderr、退出码六个用例两侧全同数值memcpy 的14, 17逐字同差异全部且仅是C 侧比 Rust 多两行调试打印func:gdev_raw_dev_open line:227、1guyanqing gdev_launch。这两行是谁的三路核实一路一命令核哪路结果上游 C 源树 grep 这两行零命中目标机上两份 C 库strings命中测试二进制零命中⇒ 目标机的 C 基线 上游 C 调试 printf。Rust ≡ 上游 C不一致的是「尺子被人加过字」。这里三条铁律同时到场不改 C它带插桩也是当天的尺子、不改 Rust它没错、判据不许为了让门变绿而改——那就只剩一条路把这两行已登记的基线插桩从比对副本里剔除字面 行尾锚防误伤原始输出一个字节不动exempt_lines6写进 GATE-SUMMARY豁免行登记进 RUNBOOK §7。关键是下一步要求对豁免规则本身再来一遍自测三过才上线能消掉 5 处已知差异规则有效注入一个真差异14, 17改14, 18——仍然红规则没把门弄瞎带后缀的行不剔行尾锚真的在锚。复跑6/6 用例 stdoutstderrrc 逐字节一致。设备旁证 5/6 成立——用LD_PRELOAD把/dev/dri/*藏起来输出必须变不变的那 1 个是matrixadd无参轮设计上就不碰设备属预期这一天的绿是有信息量的绿。当天章照跑--falsifyrc011 注入、各红各通道、checkrc0首跑观测冻成基线deploy_expected/gate.record。四、绿允许写什么三个脚注「6/6 逐字节一致」这句话能写但它带脚注。六个用例其实折成三叠叠用例绿的含义真算力matrixadd -16、memcpy×2数值/输出逐字同3/6错误路径等价madd×2两侧同败在cuModuleLoad失败信息与 rc 逐字同设计内早退matrixadd 无参Invalid arguments、rc0两侧同不碰设备脚注一覆盖首跑的真算力是 3/6——madd 两个用例两侧一样地败在模块装载上。错误路径等价也是等价但它不叫真算力这一条当晚就销掉了§五5/6。脚注二madd 的Test passed验的是什么madd.c:236的回读循环是dummy_c c[idx]——读了不比。所以 madd 的Test passed证明的是「装载 → launch → 回拷 → 释放」这条 API 路径走得通不证明数值。它跑的 cubin 还是 3080 机器上新版 nvcc 编的sm_86这份 SASS 在 Fermi 上此测试设计上看不出能不能真跑——照实写不装。脚注三计时差异是测试固有的memcpy 打印的是耗时不是数据微秒数每跑必不同byte-exact 要归一化设计当日未立登记在案目标机没有 strace序列通道本次未覆盖——同样写明。五、oracle 被换sha 对撞逮住的一天当晚先销遗留。madd 装载失败的根因坐实main.c:13传的是path.madd.c:97从 cwd 拼./madd_gpu.cubin而 gate 在仓库根跑 ⇒ 永远找不到。修法很朴素用例从自己的目录跑——deploy.sh、device_probe 三处、本地 gate.sh三处一致不一致的话藏设备那一轮 cwd 不同会造出「假设备旁证」。真机补跑madd 两轮两侧Test passed、rc0全 API 链走通Exec 耗时非零C 0.584ms / Rust 0.084ms。真算力 3/6 →5/6。顺手把 C 基线指纹从 2 条补满到 6 条4 条 sha 2 条 LINK 拓扑行更正一处登记目标机build/{lib,cuda}是软链、指入build/release同 inode——一套构建两条路径原先登记的「两套并存」机制说错了判读侥幸未受影响更正也是断言复量过才落笔。然后是这一天真正值得记的事。补跑轮 gate 判红mismatch9逐文件归因无一处是 Rust 跑偏计时打印 6 处madd / memcpy 用例固有的计时行脚注三Opened/Closed3 处。后三处把一个事实钉死了gdev_platform.h:65的用户态GDEV_PRINT就是无条件fprintf(stderr, …)没有任何编译条件受GDEV_DEBUG_PRINT控制的是GDEV_DPRINT⇒ Rust 侧的打印p1/api.rs:883是忠实的缺打印的是 C 那边。而 C 那边为什么缺基线当天被人换了。push 时 sha 对撞01:30 还在的bc86bec1…15:03 变成了307bb011…exempt_lines6→0旧的调试 printf 没了但上游无条件打印也不打了 ⇒ 这是一份第三种源状态既非上游原物也非首跑那份。这件事的两层教训比当天任何一行代码都值钱指纹只护 push→gate 这个窗口。跨会话换基线指纹管不着——管着的是 GATE-SUMMARY 里sha_lib_c的对撞本轮就是这么逮住的不是理论。「C 是 oracle」第一次反过来咬oracle 不是天上掉的是人在目标机上编出来的人会重编。尺子自己会变所以量尺子的动作指纹、对撞必须是流程的一部分而不是当天的仪式。操作面同日两笔也入档cloudflared「一次连接即僵」用ControlMaster复用一条活连接撑过 push/gate 连发pkill -f匹配到自己命令行把 shell 杀了两次——杀/启分开调用 中括号技巧。产物方面gate 结果目录收拢进~/gdev-rust-gate/时间戳/并修掉 do_fetch 的一个空串假绿——门-11 同族。六、遗留与下线目标机下线sshNo route to host宿主机上qm start报PCI 0000:01:00.0 already in use by VMID 106——GTX 580 被 VM 106 占着106 不是本方的 VM。留下去的账都在 STATUS 待办区登记oracle 源状态对齐待环境负责人要么恢复上游原物 ⇒ 豁免归零、纯逐字节绿要么明确「以此版为准」⇒ 3 行进豁免表。在那之前gate 判红恒为那 3 处.err裁决那两行[gdev] Opened/Closed字面进豁免同款字面加行尾锚模式自测三过后才上线管线级验证等机器恢复后的首轮 gate计时打印的 byte-exact 归一化设计未立真机恢复后的续跑。但主问题已经答完了。plan 序 8 ——「全项目唯一未被回答的问题」——能。项目主体P0–P4 M4至此收口。这一篇的一句话真机上的绿和开发机上的绿是同一种东西——不是结论是信号。它这一天的信息量被三件事撑着藏设备会变红的旁证、先自测三过的豁免、对撞就报警的指纹。
