计算机体系结构 30:SIMD 与向量化边界

核心问题

编译器报告循环已向量化,怎样确认它没有改坏数值,也没有漏掉不能整除向量宽度的尾部?至少要同时保留源码、严格 CLI 验证、逐元素检查、墙钟原始样本、二进制身份和反汇编。

附件包括 30-simd.json、simd_bench.c、二进制检查、标量反汇编和向量反汇编。

范围与证据等级

证据等级为真机测量。GCC 13.3.0 在当前 Linux x86-64 宿主编译同一浮点加法内核:标量版使用 -fno-tree-vectorize,向量版使用 -ftree-vectorize -fopt-info-vec-optimized。没有绑核、固定频率或 PMU,因此墙钟值只描述本次宿主样本。

CLI 接受 N REPS ROUNDS,每个参数均做完整字符串解析和范围检查。N=4099、REPS=500、ROUNDS=5;4099 不能被实际观察到的 4 个 float lane 整除,留下 3 个尾元素。

核心案例:产物、结果与尾部必须同时成立

编译报告记录 16 字节和 8 字节向量化版本。向量反汇编的内核含 addps,尾段含 addss;标量内核只出现标量加法。ELF 头确认产物为 x86-64 PIE,SHA-256 把报告绑定到本次两个二进制。

程序先执行一次 warm-up 和逐元素比较,再运行五轮。标量与向量共十轮的 checksum 都是 57353,all_checksums_equal=true。四组非法参数 0、带尾部字符的 4099x、超过上限的 rounds 和负 reps 都以状态 2 拒绝,--help 返回 0。

标量五轮中位数为 1.599 ms,向量五轮中位数为 0.590 ms。这只能说明当前短基准里向量产物较快;启动噪声、频率、缓存状态和宿主调度仍会改变比值。

模式:优化证据要形成闭环

1
源码契约 → 编译诊断 → 二进制指令 → 数值与尾部 → 重复计时

自动向量化、循环展开和指令选择都适合这一闭环。只看汇编无法证明结果正确,只看时间也无法证明运行的是预期产物。

验收结果

本批命令退出 0。实际向量宽度、3 个尾元素、十轮校验和、CLI 拒绝结果、编译命令、ELF 头、二进制哈希和两份反汇编均已落盘。未采集 PMU,也不把当前加速比推广到其他输入或机器。

练习

若 N 改为 4096,尾部路径是否必然从二进制里消失?说明编译器为什么仍可能保留通用尾部代码。

如果只比较每组最短时间,结论会受到哪类偏差?

模式速查

证据 回答的问题 仍未回答
编译报告与 addps 产物存在向量路径 数值是否正确
逐元素与 checksum 结果及尾部正确 性能来源
重复墙钟样本 当前宿主时间分布 PMU 事件与跨机结论

一手参考资料