单核 AMD Zen 3 跑出 85.3 GFLOPS
85.3 GFlops: Optimizing FP32 Matrix Multiplication on a Single AMD Zen 3 Core
在 AMD Zen 3 架构的单核上,我通过 28 种不同的优化组合,成功将 FP32 矩阵乘法性能推至 85.30 GFLOPS,达到了理论峰值 134.4 GFLOPS 的 63.5%。这次实验深入探索了 Cache blocking、Register blocking、FMA 链式指令以及 B-pack 等底层技术。结果显示,MX24 模型凭借 4 行寄存器阻塞和特定的 B-pack 策略,性能比朴素实现提升了 56.5 倍,甚至追平了 AMD AOCL 和 OpenBLAS 等成熟库的表现。更有趣的是,盲目使用软件预取或非临时存储反而会导致性能断崖式下跌,这证明了在底层优化中,理解硬件行为比堆砌技巧更重要。
非临时存储指令导致了灾难性的后果,因为结果矩阵 C 需要被读 - 改 - 写,而该指令会在每次写入时强制使缓存行失效。
HN 评论区
22- gitowiec
是什么语言?我的 Firefox 把它识别为英语,我想是因为 HTML 里有 lang=en。
- adrian_b
这里有趣的一点是,这是一项优化研究,其目标是确定在 Zen 3 CPU 上执行矩阵乘法的最优实现变体。
很可能类似的优化策略也适用于现代 Zen 5,不过最优变体的一些参数值可能会翻倍,因为 Zen 5 的寄存器数量是两倍,每个寄存器的容量也是两倍,并且它每个时钟周期可以处理和传输两倍数量的 FP32 数据。
作者给出的 63.5% 理论最大吞吐量这一数值,可能偏保守,因为在进行繁重计算时 CPU 的时钟频率会下降,因此在该频率下的实际效率可能会更高,例如可能达到理论最大吞吐量的 70% 到 80%。
ATLAS 这个兼容 BLAS 的库曾尝试为其主机计算机自动执行此类优化,但我没有深入研究过它的优化方法是否仍然适用于带有 AVX+FMA 或 AVX-512 的现代 CPU。
- ranger_danger
作为对比,当今性能最好的 GPU 执行 FP32 运算的速度可以超过 100 TFLOP/s。
- Razengan
像三进制/四进制和/或模拟计算等替代 CPU 架构,在矩阵乘法方面会不会表现更好?
- houslast
突破 AMD Zen 3 的极限:单核实现 85.3 GFLOPS!
我最近挑战了从单个 AMD Zen 3 核心中榨取每一滴性能的任务,成功在 FP32 矩阵乘法中达到了惊人的 85.3 GFLOPS。通过深入底层软件优化——专注于高级 SIMD 向量化、严格的缓存管理和指令流水线——我在不依赖多线程的情况下最大化了 CPU 效率。这个项目为高性能计算(HPC)爱好者提供了一个强有力的概念验证,证明了经过深度优化的代码依然能释放现代硅片中隐藏的惊人潜力。