High-Performance FP16 General Matrix Multiplication on NVIDIA Ada Lovelace via CUTLASS and WMMA: A Benchmark and Pipeline-Depth Analysis
本文通过对 NVIDIA Ada Lovelace 架构 RTX 4060 上 cuBLAS、CUTLASS 以及自定义 WMMA 实现的 FP16 GEMM 性能进行基准测试,揭示了采用特定分块几何结构的深度为三的流水线达到了峰值吞吐量的 52.7%,并表明共享内存压力而非流水线深度是限制进一步优化的主要瓶颈。
原始论文采用 CC BY 4.0 许可(https://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下你拥有一个超级快速的厨房(GPU),里面有一支由被称为 Tensor Cores 的专业厨师组成的团队。这些厨师在处理和混合食材(矩阵乘法)以准备一场盛大宴会(深度学习)方面极其高效。在全新的“Ada Lovelace”炉灶(RTX 4060 显卡)上,这个厨房理论上能够每秒供应 60.55 TFLOPS(即 60.55 万亿次数学运算)。
但问题在于,尽管厨师们能够切得那么快,并不代表他们真的切得那么快。他们经常不得不等待食材从储藏室运送到位。
核心实验:如何让厨师保持忙碌
研究人员想要找出组织厨房的最佳方式,以确保厨师永不停工。他们测试了三种运行厨房的方式:
- 黑盒模式 (cuBLAS): 来自 NVIDIA 的预包装、闭源配方,通常效果很好,但你无法调整细节。
- 开放蓝图 (CUTLASS): 一个灵活的、开源的工具包,让你能从零开始构建自己的厨房布局。
- DIY 方法 (WMMA): 一个定制构建的厨房,你可以控制厨师的每一个动作,但建造难度极大。
他们设置了一个规模巨大的烹饪挑战,食材大小为 8192 × 8192,并尝试了不同的“流水线深度”(Pipeline Depth)。把流水线深度想象成厨房里随时准备好的食材托盘数量。
- 流水线深度 2: 只有 2 个托盘备好。
- 流水线深度 3: 3 个托盘备好。
- 流水线深度 4: 4 个托盘备好。
普遍的常识(以及一个简单的数学模型)认为更多的托盘 = 更快的速度。逻辑是:“如果我们有更多的托盘,厨师就永远不会缺食材,所以他们会工作得更快。”
意外:并非越多越好
研究人员测量了速度,结果如下:
- 深度 2: 厨房运行速度为 25.6 TFLOPS。厨师们等待的时间太多了。
- 深度 3: 厨房提速到了 31.9 TFLOPS(这是理论最大值的 52.7%)。这是黄金平衡点!
- 深度 4: 厨房的速度反而下降到了 31.1 TFLOPS。
这是主要发现: 增加第 4 个托盘并没有提供帮助,反而让情况变糟了。一个简单的数学模型预测速度应该跳升至 35.4 TFLOPS,但实际并未如此。该模型产生了 13.8% 的误差。
为什么增加一个托盘会适得其反?
论文解释说,厨房的空间是有限的。当他们增加第 4 个托盘时(使“共享内存”使用量增加到 96 KB),这迫使厨房减少了可以同时工作的烹饪团队(线程块/threadblocks)的数量。
- 使用 3 个托盘时,每个炉灶可以容纳 2 支厨师团队。
- 使用 4 个托盘时,每个炉灶只能容纳 1 支团队。
尽管单个团队拥有的食材更多,但由于可以随时切换进场的团队变少了,他们必须等待更长时间。研究人员测量到,占用率(正在工作的团队数量)下降了,且厨师们必须使用更多的“寄存器”(他们的个人笔记本),这也拖慢了速度。
赢家与输家
- 赢家: 使用 3 个托盘且特定分块大小为 256 × 128 的 CUTLASS 工具包。它达到了 31.9 TFLOPS。这表现得非常出色,甚至略微超过了标准的“黑盒”(cuBLAS)——虽然这种 1.3% 的差距几乎可以忽略不计(作者称这可能只是噪声),但它证明了开放蓝图可以媲美闭源方案。
- DIY 亚军: 定制的 WMMA 内核(完全 DIY 的厨房)在稍小的测试中跑出了 25.1 TFLOPS。它较慢是因为没有使用那种将食材配送与烹饪重叠进行的“双缓冲”技巧。
- 输家: “增加流水线深度总是有益的”这一观点。论文明确否定了这一点,针对此特定硬件而言并非如此。
他们有多确定?
作者对这些数字非常有信心,因为他们直接在硬件上进行了测量,运行了 10 次测试并取了平均值。他们甚至将数学计算与 NVIDIA 内置的工具(分析器)进行了对比,发现他们的自定义代码与工具完美匹配。
然而,他们也承认了一些未被证实的事项:
- 他们只测试了一种特定的问题规模(8192)。他们不知道“3 个托盘最好”的规则是否适用于更小或形状奇特的题目。
- 他们无法测试高于 4 的流水线深度,因为厨房空间已经耗尽(内存不足)。
- 他们必须在 Windows 上运行测试,由于驱动程序的一个故障,导致他们无法在同一次运行中对比自定义代码和标准代码(尽管他们在分开的运行中完成了对比)。
总结
如果你想在处理重度数学任务时充分发挥像 RTX 4060 这样的消费级显卡的性能,不要只是不断增加缓冲区。存在一个“金发姑娘原则”(即恰到好处的原则)。在这种情况下,3 阶段的准备是最完美的。如果增加到 4 阶段,厨房就会变得过于拥挤,从而拖慢所有人的进度。
研究人员已经将所有的代码开源,因此任何人都可以尝试构建自己的“厨房”,看看能否打破 31.9 TFLOPS 的纪录。他们建议未来的工作应关注不同的问题规模,并使用 Linux 以获得更干净的数据,但就目前而言,他们已经证明了对于这种配置,31.9 TFLOPS 是当前的巅峰,而 31.1 TFLOPS 则是当你试图过度贪婪地索取内存时所得到的结果。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。