The Roofline Model是一个帮助我们理解应用程序在特定硬件上性能表现的模型,通过这个模型,我们可以看到应用程序的性能与硬件的极限之间的关系。想象一个简单的The Roofline Model:
- 在这个图的横轴(x轴)上,我们测量的是 arithmetic or computational intensity ,用 FLOP/B 来表示。这个指标说明了应用程序在处理每个数据字节时所进行的计算量。
- 纵轴(y轴)则表示“计算吞吐量”,用 GFLOPS 来衡量,即硬件在单位时间内能完成多少计算。
图中有两条线,它们表示了硬件的性能上限:
- 水平线显示了硬件能达到的最大计算吞吐量。
- 另一条线从原点开始呈正斜率上升,它显示了硬件的最大内存带宽。
在这个图上的任何一个点都代表一个应用程序,其横坐标是计算密度,纵坐标是它实际达到的计算吞吐量。这些点都会位于上述两条线的下方,因为应用程序的性能不可能超过硬件的极限。
通过观察这个点的位置,我们可以了解应用程序的效率:
- 如果一个点靠近这两条线,意味着应用程序在有效利用内存带宽或计算资源。
- 如果一个点远离这两条线,表明应用程序没有高效利用这些资源。
这两条线的交点,标志着应用程序从受内存带宽限制转变为受计算能力限制的临界点。换句话说,计算密度低的应用程序受到内存带宽的限制,无法达到最高计算吞吐量;而计算密度高的应用程序则受到计算能力的限制,内存带宽不再是主要瓶颈。
作为一个例子,点 A1 和 A2 都代表内存受限的应用程序,而 A3 代表一个计算受限的应用程序。A1 高效地使用资源,并接近峰值内存带宽,而 A2 则不是。对于 A2,可能有额外的优化空间,通过提高内存带宽利用率来提高吞吐量。然而,对于 A1 来说,提高吞吐量的唯一方法是提高应用程序的计算强度。
为了提高这个内核的性能,我们需要通过减少它执行的全局内存访问次数,来提高内核的计算与全局内存访问比率。例如,为了充分利用 A100 GPU 提供的 19,500 GFLOPS,至少需要 (19,500 GOP/秒)/(1555 GB/秒)=12.5 OP/B 的比率。这个比率意味着,每访问一个 4 字节浮点数值,就必须执行约 50 次浮点运算!能够达到这样的比率取决于手头计算中固有的数据重用程度。我们建议读者参考 “The Roofline Model” 侧栏,了解一个用于分析程序相对于其计算强度的潜在性能的有用模型。
我们将看到,矩阵乘法提供了减少全局内存访问的机会,可以通过相对简单的技术捕获。矩阵乘法函数的执行速度可以根据全局内存访问的减少程度而相差数个数量级。因此,矩阵乘法为这些技术提供了一个极好的初始示例。本章介绍了一种常用的减少全局内存访问次数的技术,并在矩阵乘法上演示了这种技术。