第9章. 提升 CUDA内核效率与算术密集度
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
即使通过大规模并行和高指令级并行性完全隐藏延迟,内核性能仍可能受限于每次内存访问所完成的有效工作量。算术强度(亦称运算强度)衡量从内存传输的每字节数据所执行的浮点运算次数,即每字节浮点运算次数(FLOPS per byte)。
新一代GPU的计算吞吐量已远超内存带宽。这种差距的扩大意味着提升算术强度比以往任何时候都更为关键。更高的算术强度表明内核每获取一个字节数据就能完成更多计算,这对充分利用GPU的计算能力至关重要。
算术强度是 屋顶线性能模型中的关键指标。该模型通过绘制内核性能(FLOPS/秒)与算术强度(FLOPS/字节)的关系曲线,直观呈现硬件在内存带宽与计算吞吐量方面的上限(屋顶)。由此可判断内核是受限于内存传输(内存瓶颈),还是受限于算术逻辑单元吞吐量(计算瓶颈)。
实际操作中,可通过Nsight Compute等工具生成Roofline图表,该工具包含Roofline分析视图。借助这些工具,您可验证内核初始阶段是内存有界还是计算有界,并在优化过程中持续进行性能剖析与改进验证.
优化目标是推动内核向计算瓶颈领域发展,充分利用GPU日益增强的计算能力。屋顶线性能模型能为优化工作提供精准指引。
如前章所示,屋顶线图通过一条水平线表示硬件峰值计算吞吐量(屋顶),一条从原点出发的斜线则表示受内存带宽限制的峰值可达吞吐量。内核的算术强度决定其在x轴上的位置,其性能可参照这些上限进行评估(如图9-1所示)。
图9-1. 典型 屋檐线模型(GFLOP/s与FLOPs/byte的算术强度关系)
算术强度较低的内核( ,即每字节数据移动的数学运算量较少)将有界于内存带宽。此时内核速度受硬件内存带宽制约,因为GPU大部分时间都在等待数据而非进行计算。
相反,算术强度极高的内核(即每传输字节执行大量浮点运算)则会受计算能力限制,因为其正将算术逻辑单元和张量核心的性能推向极限。此时内存带宽利用率成为次要考量因素。
核心目标始终是通过提升全局内存数据传输的每字节运算量(FLOPs/字节),尽可能提高 的算术强度。可采用以下技术提升算术强度:使用循环分块复用数据、利用片上L1/共享内存实现数据复用、融合多个内核为单一内核以避免中间结果写入全局内存。
现代编译器框架 (如PyTorch的TorchInductor)会自动执行部分优化,以保持计算在GPU上进行、减少片外内存传输并提升有效算术强度。但开发者仍可能需要手动组合这些技术,或编写自定义CUDA内核,例如确保数据在被缓存驱逐前实现最优复用.
还可采用低精度数据类型(FP16、FP8、FP4)减少内存传输量,并利用张量核心提升每秒浮点运算量。综合运用这些方法将提高每字节浮点运算量比率,从而提升算术强度。接下来我们将具体探讨这些技术。
需注意并非所有工作负载都能轻易提升运算强度,这受限于算法特性。但应积极寻找优化机会:改进算法、复用数据、融合运算、增大批量大小,在不改变算法结果(如精度)的前提下提升运算强度。
多级微分块与软件预取
如第七章所述,分块(又称切块或 分区) 与数据复用是提升算术强度的有效手段。该章阐明:将矩阵A和B的小子矩阵(分块)加载至共享内存后,每次从全局内存获取的字节数据均可用于执行大量乘累加运算,且速度达到静态随机存取存储器(SRAM)级别。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access