📘 GPU 架构与计算原理:全景深度学习笔记
适用对象:希望从底层原理理解 GPU 运作机制的开发者/硬件爱好者。
核心隐喻:将 GPU 视为一个高度并行化的“超级工厂”。
第一章:宏观架构 (The Macro Structure)
从上帝视角俯瞰显卡芯片。
1. GPC (Graphics Processing Cluster) - 图形处理集群
- 定义:显卡内部最高级别的硬件物理分组,相当于工厂的**“独立分厂”**。
- 关键组件:
- 光栅化引擎 (Raster Engine):【核心特征】只有 GPC 这一层级拥有。它负责将 3D 的三角形网格“拍扁”并离散化为屏幕上的 2D 像素点。
- 重要性:
- GPC 的数量直接决定了显卡的几何处理能力(每秒能生成多少个三角形)和像素填充率。
- 关于“阉割”:RTX 4090 芯片(AD102)物理上有 12 个 GPC,但为了良品率屏蔽了部分,实际开启 11 个。每少一个 GPC,不仅少了核心,还少了一组光栅引擎,这在高分辨率、高多边形场景下影响巨大。
2. TPC (Texture Processing Cluster) - 纹理处理集群
- 定义:介于 GPC 和 SM 之间的中间层,相当于**“流水线专区”**。
- 功能:主要包含PolyMorph Engine (多形体引擎),负责顶点获取、曲面细分(Tessellation)等几何形变工作。它为下面的 SM 准备数据。
3. SM (Streaming Multiprocessor) - 流式多处理器
- 定义:GPU 的最小独立战术单元,相当于**“全能生产小组”**。显卡的算力强弱主要看有多少个 SM。
- 设计哲学:
- 去中心化:GPU 没有一个超强的中央大脑,而是把管理权下放给 SM。
- 资源池化:SM 内部有独立的调度器、寄存器、缓存,保证小组内自给自足,减少对外通讯。
第二章:SM 内部解剖 (Inside the SM)
深入“生产小组”内部,看看有哪些关键设备。
1. 核心控制组件
- Warp Scheduler (线程束调度器):“包工头”。
- 补充知识:现代 SM(如 Ada 架构)通常会被切分为 4 个区块(SMSP),每个区块都有自己的调度器。这意味着一个 SM 在一个时钟周期内,可以同时发射 4 条指令给不同的核心群。
- Register File (寄存器文件):“工人的随身腰包”。
- 补充知识:这是 GPU 里速度最快的存储空间,也是最大的成本之一。每个 SM 拥有海量的寄存器(如 64K 个 32-bit 寄存器)。
- 作用:每个线程的私有变量都存在这里。寄存器够大,才能容纳成千上万个线程同时“驻扎”在 SM 里,这是实现零开销切换的物理基础。
2. 共享资源
- L1 Cache / Shared Memory:“小组公共桌”。
- 这是一块超高速内存。在现代架构中,L1 缓存和共享内存通常是统一编址的(比如总共 128KB,程序员可以配置 64KB 做缓存,64KB 做共享内存)。
- 用途:同一个 Block 内的线程通过这里交换数据,不需要经过显存。
1. CUDA Core:全能型通用工人
“什么脏活累活都能干,显卡的中流砥柱”
- 它的作用:
- 它是最基础、数量最多的核心。
- 负责处理通用计算任务,做简单的加减乘除和逻辑判断。
- 在游戏中,它负责算出哪里是墙、哪里是人、颜色是什么(光栅化渲染)。
- 什么场景会用:
- 几乎所有场景:只要显卡在工作,CUDA Core 就在干活。
- 传统游戏:CS:GO、LOL 等不带光追的游戏,主要靠它。
- 视频剪辑:Premiere、DaVinci 里的加速渲染。
- 数学计算:挖矿、普通的科学计算。
虽然“加减乘除”确实是 CUDA Core 最主要的工作(占了大约 90% 的时间),但如果它只会算术,显卡是没法运行复杂的游戏和程序的。严格来说,一个CUDA Core(或者更准确地说是显卡 SM 里的执行单元)还必须具备以下几项关键能力,才能构成一个完整的计算单元:
1. 逻辑与位运算能力 (Logic & Bitwise)
这是除了算术之外最重要的一类操作。CUDA Core 必须能处理:
- 逻辑判断:AND(与)、OR(或)、NOT(非)、XOR(异或)。
- 位移操作:把二进制数左移或右移。
- 为什么这很重要?
- 游戏里:判断“子弹是否打中人”本质上是一连串的逻辑对比(If A > B)。
- 加密/挖矿:哈希算法(Hash)大量依赖“异或”和“位移”操作,而不是简单的加减乘除。
2. 特殊函数运算 (Special Functions)
虽然简单的 CUDA Core 主要算线性数学,但在它们旁边通常配有SFU (Special Function Units,特殊函数单元)。
- 负责内容:计算
sin(正弦)、cos(余弦)、log(对数)、exp(指数)、sqrt(开方) 等。 - 场景:游戏里的水波纹模拟、光照衰减计算,全靠这些复杂的超越函数。虽然 SFU 有时被视为独立单元,但在概念上它们是 CUDA 计算流程的一部分。
3. 乘加融合 (FMA - Fused Multiply-Add)
这是 CUDA Core 的看家本领,也是显卡比 CPU 算得快的重要原因之一。
它不单单是做加法或乘法,而是一个指令完成A×B+CA \times B + CA×B+C。
- 为什么厉害:传统做法是“先乘,存起来,再加”,要两步。FMA 只需要一步,而且精度更高(中间结果不四舍五入)。这对 3D 图形渲染(矩阵运算)至关重要。
4. 整数与浮点数的分离 (INT32 & FP32)
在现代显卡(比如 RTX 30/40 系列)中,CUDA Core 的内部构造其实被“劈开”了:
- FP32 单元:专门算小数(浮点数)。比如算出这个像素的红色亮度是 0.753。
- INT32 单元:专门算整数。
- 作用:主要用于地址寻址。比如“去显存第 1024 号房间取数据”,这个“1024”是整数。
- 并发执行:以前的显卡(如 Pascal 架构),算整数时就不能算小数。现在的显卡可以一边算像素颜色(FP32),一边算下一个数据的地址(INT32),效率大增。
2. Tensor Core:AI 数学专家
“算盘打得飞快,专门处理人工智能的大数据”
- 它的作用:
- 专门针对**“矩阵运算”**设计。AI 和深度学习(Deep Learning)的本质就是无数个巨大的矩阵在相乘。
- CUDA Core 也能算矩阵,但它是“一步算一个数”;Tensor Core 是“一步算一块数(4x4矩阵)”,效率是 CUDA Core 的几十倍甚至上百倍。
- 它支持“混合精度计算”(比如用低精度换取极高速度),这对 AI 来说非常划算。
- 什么场景会用:
- DLSS(深度学习超级采样):玩游戏时,显卡先渲染低分辨率画面(减轻负担),然后用 Tensor Core 靠 AI 把它“脑补”成高清晰度画面,帧数直接翻倍。
- AI 绘图/聊天:在本地跑 Stable Diffusion(画图)或 Llama(大语言模型)时,主要靠它加速。
- 专业 AI 训练:像训练 ChatGPT 这种大模型,完全依赖它。
3. RT Core (Ray Tracing Core):光线追踪专家
“专门负责计算光线怎么反弹的物理学家”
- 它的作用:
- 专门计算**“光线和物体相交”**。
- 在模拟真实世界光照时,需要计算数亿条光线射出去后打到了什么物体、反射到哪里。
- 如果没有 RT Core,这个工作得扔给 CUDA Core 做,但 CUDA Core 做这个效率极低(就像让搬砖工人去解微积分),游戏会卡成 PPT。RT Core 专门内置了计算光线碰撞的硬件电路。
- 什么场景会用:
- 光追游戏:开启“光线追踪(Ray Tracing)”选项的游戏,比如《赛博朋克 2077》、《黑神话:悟空》。
- 看到真实反射:比如地上的水坑倒映出霓虹灯、镜子里看到主角、阴影极其真实软润。
- 3D 渲染:Blender、C4D 渲染器(如 Octane, Redshift)在预览时,能瞬间看到真实光影。
第四章:执行模型与 SIMT (The Soul of GPU)
软件层面的“指令”如何转化为硬件层面的“动作”。
1. Thread Block(线程块):软件上的“班级”
概念:这是程序员(你)在写代码时定义的逻辑分组。
当你给 GPU 布置任务时,你不能说“给我运行 10,000 个线程”,这样太乱了。你必须把这 10,000 个线程打包成一个个小方块,这就是 Thread Block。
- 它的特点:
- 资源共享:同一个 Block 里的线程,可以互相“说话”(通过共享内存 Shared Memory 通信),也可以互相“等一等”(同步)。
- 驻扎地:一个 Block 一旦分配给了一个SM(流式多处理器,刚才说的车间),它就会一直在这个 SM 上待到运行结束,不会跑去别的 SM。
- 大小限制:一个 Block 里最多包含 1024 个线程(不同架构略有不同,但通常是这个数)。
类比:
Thread Block 就像是一个**“旅游团”**。
导游(程序员)把游客分成了好几个团。同一个团的人住在同一个酒店(SM),大家可以在大堂(共享内存)里交换信息。
2. Warp(线程束):硬件上的“步伐”
概念:这是显卡硬件(SM)在真正干活时的执行单位。
虽然你在软件里定义了一个 Block 有 1024 个线程,但 SM 并不是真的有 1024 只手同时干活。SM 内部的调度器(Warp Scheduler)会把这 1024 个线程切分成很多个小份,每一份就叫一个 Warp。
- 它的特点:
- 标准大小:在 NVIDIA 显卡中,1 个 Warp = 32 个线程(雷打不动)。
- SIMT(单指令多线程):这是 Warp 最核心的特征。这 32 个线程必须**“同进同退”**。SM 发出一个指令“做加法”,这 32 个线程必须同时做加法。
- 不可分割:硬件调度是按 Warp 来的,不是按单个线程来的。
类比:
Warp 就像是**“32 人的一条腿跳绳队”**。
虽然旅游团(Block)有一千人,但过安检口(执行指令)时,必须32 个人挽着手排成一排一起跳过去。
3. 它们的关系与互动
“Block 是肉,Warp 是刀法。”
当你定义了一个包含 128 个线程的 Block 扔给显卡:
- 显卡接收到这个 Block。
- SM 把它切成128÷32=4128 \div 32 = 4128÷32=4个 Warp。
- SM 的调度器开始轮流指挥这 4 个 Warp 干活。
关键问题:如果 Warp 里有人“掉队”了怎么办?(Branch Divergence)
这是 GPU 编程里著名的**“分支发散”问题。
因为 Warp 里的 32 个线程必须执行同一条指令**。
- 如果不一致:比如代码里写了
if (性别 == 男) { ... } else { ... }。 - 尴尬的局面:如果这 32 个线程里,前 16 个是男,后 16 个是女。大家不能分头行动。
- 第一步:所有人先陪着前 16 个男线程跑
if里的代码(此时后 16 个女线程虽然什么都不做,但也得陪跑,浪费时间)。 - 第二步:所有人再陪着后 16 个女线程跑
else里的代码(此时前 16 个男线程陪跑)。
- 第一步:所有人先陪着前 16 个男线程跑
- 结果:性能减半。
1. 软件定义的层级 (Grid & Block)
- Grid (网格):由于任务太大(如 4K 屏幕的 800 万个像素),程序员将其定义为一个 Grid。
- Block (线程块):“旅游团”。
- Grid 被切分成无数个 Block(如每个 Block 128 个线程)。
- 特性:一个 Block 必须作为一个整体被分配给一个 SM,且终身不迁移。
2. 硬件执行的层级 (Warp)
- Warp (线程束):“32 人同手同脚跳绳队”。
- SM 收到一个 Block 后,会将其切分为多个 Warp(每个 Warp 固定 32 线程)。
- SIMT (单指令多线程):Warp 是硬件执行指令的最小单位。SM 发一条指令,Warp 里的 32 个线程同时执行。
3. 关键机制深度解析
A. 延迟隐藏 (Latency Hiding) —— GPU 快的真正秘密
- 问题:去显存取数据非常慢(几百个时钟周期),如果核心干等着,性能就废了。
- 解法:SM 里面通常驻扎着远超核心数量的 Warp(例如核心只有 128 个,但 SM 里可能驻扎了 48 个 Warp 共 1500+ 线程)。
- 当Warp A去取数据(卡住)时,调度器会**瞬间(0 时钟周期消耗)**切到Warp B继续计算。
- 只要 Warp 足够多,核心就永远在干活,感觉不到显存的延迟。
- 这就是为什么显卡需要高并发。
B. 分支发散 (Branch Divergence)
- 场景:代码里写了
if (x > 0) do A; else do B; - 困境:Warp 里的 32 个线程,有的 x>0,有的 x<0。但大家必须同进同退。
- 处理:Active Mask (活跃掩码)。
- 第一步:先让所有线程跑
do A,但用掩码把 x<0 的线程**“屏蔽”**(Mask off,虽然通电但不写入结果)。 - 第二步:再让所有线程跑
do B,把 x>0 的线程屏蔽。
- 第一步:先让所有线程跑
- 代价:原本并行的任务变成了串行,性能下降。
第五章:存储体系 (Memory Hierarchy)
数据流动的血管。
1. L2 Cache 的战略地位提升
- 现象:RTX 4090 的 L2 缓存 (72MB) 比 RTX 3090 (6MB) 大了 12 倍。
- 原因 - “显存墙”:显存带宽(GDDR6X)已经很难再提升了,而且功耗极高。
- 新策略:“以存代路”。尽量把数据留在芯片内部巨大的 L2 缓存里,减少去外部显存搬运的次数。这不仅提升了有效带宽,还大幅降低了功耗。
2. 显存位宽与带宽
- 公式:带宽(GB/s)=位宽(bit)×频率(GHz)8带宽 (GB/s) = \frac{位宽(bit) \times 频率(GHz)}{8}带宽(GB/s)=8位宽(bit)×频率(GHz)
- 位宽 (Bus Width):如 128-bit, 384-bit。它是物理通道的宽度(高速公路车道数)。
- 带宽 (Bandwidth):实际的数据吞吐量。
- 误区:不要只看位宽。RTX 4060 只有 128-bit 位宽,看似很惨,但因为有大 L2 缓存,其实际游戏性能(有效带宽)远超以前 128-bit 的卡。
📝 终极速记类比表 (The Mental Model)
| 概念 | 形象类比 | 核心职责 |
|---|---|---|
| GPU | 超级工厂 | 并行计算总基地。 |
| GPC | 独立分厂 | 拥有独立光栅引擎,决定图形生成速度。 |
| SM | 生产小组 | 最小管理单元,拥有独立调度器和资源。 |
| CUDA Core | 工人 | 数量巨大,负责通用计算和像素上色。 |
| Tensor Core | 会计/算盘 | 专精矩阵运算,负责 AI 加速。 |
| RT Core | 质检员/物理学家 | 专精光线投射测试。 |
| Warp | 32人跳绳队 | 硬件执行的最小单位,同手同脚。 |
| L2 Cache | 车间冰箱 | 近且快,大幅扩容后减少了跑仓库的次数。 |
| 显存 (VRAM) | 远端总仓库 | 容量大但距离远,通过卡车 (位宽) 运输。 |
| SIMT | 广播体操 | 一声口令,多人做动作(但每人做的对象不同)。 |