计算机体系结构 35:独立性能研究

核心问题

矩阵行遍历比列遍历快,能否直接归因为“连续访问更适合缓存”?一个可证伪的性能研究需要保留输入、正确性、编译路径、原始重复样本和替代解释。改变行跨度的 padding 对照尤其重要:逻辑元素数几乎不变,列遍历时间却可能大幅变化。

附件:归档验收摘要、原始样本复核结果、只读验证器和历史实验记录。原始 CSV、源码、命令与环境保存在仓库的 examples/computer-architecture/performance/。

范围与证据等级

证据来自 2026-09-22 的 arm64 macOS 原生测量归档,编译器为 Apple Clang 21.0.0。2026-10-01 在本地只读复核两个 CSV 的 192 个正式样本、96 组交替配对、每条校验和及全部 16 行统计,均与归档汇总一致;没有重新计时。四项源码和本机保存的两份历史二进制也与历史 SHA-256 清单一致。二进制位于忽略的 build/,其他克隆缺少它们时验证器会单独标记缺口。

CSV 与汇总的 SHA-256 是当前文件指纹。历史清单只覆盖源码和二进制,因此这些新指纹不能证明 CSV 自采样时起没有改变。

历史实验没有 PMU、固定频率、核心绑定或频率与温度数据,宿主是否裸机也未确认。结果不能定位 cache、TLB、预取器或 DRAM 各自贡献。

核心案例:padding 推翻单变量解释

原始样本复算得到:O3 的 2048×2048 矩阵中,stride 2048 的列/行配对耗时比中位数为 35.6196;每行增加一个 padding 元素后,stride 变为 2049,比值降到 8.5251。实验设计保持逻辑求和目标不变,改变了物理行跨度。

这个对照否定“总工作集字节数足以解释全部差异”的说法,却没有单独证明 cache set conflict。padding 同时改变地址映射、页内偏移以及预取器看到的模式,需要硬件计数器或更细的控制实验才能拆分机制。

禁止向量化时,小矩阵 64×64 的列/行配对比中位数只有 1.2175。大矩阵结果不能外推为所有尺寸上的固定倍率。O3 的向量化报告还需结合运行分支阅读:行内核进入 SIMD 路径,四个列遍历输入走标量步长加载。

模式:用最小扰动挑战瓶颈假设

1
假设 → 固定输出与主要工作量 → 改一个地址参数 → 检查预测是否仍成立

padding、对齐和分块实验都能采用这个结构。对照若同时改变多个机制,只能排除旧解释,不能自动确认某个新解释。

验收结果

从仓库根目录运行 python3 examples/computer-architecture/run_batch.py 34-35,先检查第 34 篇提交差分,再调用归档验证器核对样本数、输入、配对顺序、校验和、统计值和可用历史哈希。错误时非零退出,成功时记录 raw_samples_verified_now=true。

python3 examples/computer-architecture/performance/verify_archive.py --self-test 还修改临时副本中的样本、配对、校验和、汇总及哈希。九类错误在普通 Python 和 -O 下共 18 次均被真实命令拒绝;原归档不受修改。统计复核通过支持历史样本的内部一致性,没有新增硬件机制或跨机器性能结论。

练习

设计一个只改变起始对齐、不改变行跨度的对照,它能排除哪些解释?

为什么编译器报告“循环可向量化”不足以证明某组运行输入进入了向量路径?

模式速查

观察 最小后续证据 暂时不能声称
padding 改变耗时 地址映射与硬件事件 已确认 cache conflict
O3 更快 实际分支和反汇编 所有路径都向量化
192 个墙钟样本 原始分布与顺序 跨机器普遍倍率

一手参考资料