主要观点:
- 介绍了理解 GPU 工作原理的相关资源及从这些资源中学习到的各种事实。
- 详细阐述了 GPU 的计算和内存层次结构、两种性能状态(内存受限和计算受限)、第三种状态(开销)以及增加性能的两种基本策略(融合和分块)。
- 讨论了提高性能的其他考虑因素,如占用率和延迟隐藏、避免线程分歧、量化等。
关键信息和重要细节:
- 计算和内存层次结构:GPU 设计导致计算速度远快于访问主内存的速度,如 NVIDIA A100 GPU 每秒可执行 19.5 万亿次 32 位浮点运算,但内存带宽仅约 1.5 太字节/秒。GPU 由全局内存(VRAM)、流式多处理器(SM)、共享内存(SRAM)、寄存器文件等组成,各部分性能不同。
两种性能状态:
- 内存受限:操作的运行时间由从全局内存到 SM 的数据传输速度决定,SM 大部分时间空闲等待数据。
- 计算受限:操作的运行时间由 SM 的算术速度决定,内存总线在 SM 忙碌时空闲。算术强度(AI)是决定性能状态的正式指标,AI 低于 13 时为内存受限,高于 13 时为计算受限。
- 第三种状态:开销:性能也可能受主机端开销限制,现代框架使用异步执行来缓解此问题,本文假设内核足够大,开销不是主要限制因素。
增加性能的策略:
- 融合:将一系列单独的内存受限操作融合为一个内核,消除中间内存流量,提高效率,如
y = relu(x + 1)
的融合操作。 - 分块:对于计算密集型内核,使用分块策略最大化 SM 快速内存内的数据重用,如矩阵乘法的分块计算。
- 融合:将一系列单独的内存受限操作融合为一个内核,消除中间内存流量,提高效率,如
其他性能考虑因素:
- 占用率和延迟隐藏:SM 通过执行其他工作来隐藏长延迟指令的延迟,高占用率可增加可选择的 warp 数量,提高计算单元的利用率。
- 避免线程分歧:避免在性能关键部分使用条件分支导致线程分歧,降低 warp 的有效吞吐量。
- 量化:将张量元素的精度从 FP32 降低到 FP16 或 BFP16,可减少内存需求和提高计算速度。
引用和参考:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。