1. 课程背景与学习目标
CMU 11-868是卡内基梅隆大学为研究生开设的大语言模型系统课程,专注于从算法到工程落地的全流程技术实践。作为课程的第二讲,GPU编程基础1主要解决一个核心问题:如何理解GPU硬件架构与编程模型,从而为后续的LLM系统优化打下坚实基础。
我在学习过程中发现,很多同学(包括最初的我)容易陷入两个误区:要么过于关注理论而忽视工程实现细节,要么直接跳入代码编写却不理解底层硬件行为。这讲内容恰好架起了理论与实践的桥梁,下面我就结合课程内容和自己的实践心得,带大家系统掌握GPU编程的核心要点。
2. 神经网络计算的核心算子解析
2.1 典型神经网络层的计算分解
以情感分析任务中的三层前馈网络为例,其计算过程可拆解为以下核心操作:
-
嵌入层(Embedding):本质是查表操作。假设词表大小50,000,嵌入维度768,则每次查询需要:
- 根据输入token ID(如1024)定位内存地址
- 读取连续的768个float32值(共3KB数据)
- 实际场景中,批量处理128个token时需同时读取128×768=98,304个浮点数
-
线性层(Linear):核心是矩阵乘法。输入矩阵X(128×768)与权重矩阵W(768×256)相乘:
- 计算量:128×768×256 = 25,165,824次乘加运算
- 内存访问:读取X(75KB) + W(768KB) = 843KB
- 计算强度(Compute Intensity):约30 FLOP/Byte(属于计算密集型)
-
ReLU激活:纯元素级操作。对25,165,824个元素执行max(0,x):
- 无数据依赖,可完全并行
- 计算量与内存访问量1:1(低计算强度)
实践技巧:在CUDA优化时,不同算子需要采用不同策略。矩阵乘法重点优化共享内存使用,而ReLU这类操作更关注内存合并访问。
2.2 低级算子的硬件映射
四种基础算子在现代GPU上的最佳实现方式:
| 算子类型 | 典型操作 | GPU优化要点 | 性能瓶颈 |
|--
