GPU架构

📘 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 扔给显卡:

  1. 显卡接收到这个 Block。
  2. SM 把它切成 128÷32=4128 \div 32 = 4128÷32=4 个 Warp。
  3. SM 的调度器开始轮流指挥这 4 个 Warp 干活。
关键问题:如果 Warp 里有人"掉队"了怎么办?(Branch Divergence)

这是 GPU 编程里著名的**"分支发散"问题。
因为 Warp 里的 32 个线程必须执行
同一条指令**。

  • 如果不一致 :比如代码里写了 if (性别 == 男) { ... } else { ... }
  • 尴尬的局面 :如果这 32 个线程里,前 16 个是男,后 16 个是女。大家不能分头行动。
    1. 第一步 :所有人先陪着前 16 个男线程跑 if 里的代码(此时后 16 个女线程虽然什么都不做,但也得陪跑,浪费时间)。
    2. 第二步 :所有人再陪着后 16 个女线程跑 else 里的代码(此时前 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 (活跃掩码)
    1. 第一步:先让所有线程跑 do A,但用掩码把 x<0 的线程**"屏蔽"**(Mask off,虽然通电但不写入结果)。
    2. 第二步:再让所有线程跑 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 广播体操 一声口令,多人做动作(但每人做的对象不同)。
相关推荐
青瓷程序设计1 小时前
【害虫识别系统】Python+深度学习+人工智能+算法模型+TensorFlow+图像识别+卷积网络算法
人工智能·python·深度学习
YuTaoShao1 小时前
【LeetCode 每日一题】3602. 十六进制和三十六进制转化——(解法二)手写进制转换
linux·python·leetcode
充值修改昵称1 小时前
数据结构基础:图论基础全面解析
数据结构·python·图论
喵手1 小时前
Python爬虫实战:城市公交数据采集实战:从多线路分页到结构化站点序列(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·城市交通数据采集·多线路分页导出csv·sqlite持久化存储
2301_811232981 小时前
使用Python进行PDF文件的处理与操作
jvm·数据库·python
深蓝海拓1 小时前
海康 MV 相机几种Bayer RG像素格式的处理
笔记·python·qt·学习·pyqt
少年强则国强1 小时前
anaconda安装配置pycharm
ide·python·pycharm
m0_561359671 小时前
自动化与脚本
jvm·数据库·python
盐真卿1 小时前
python第五部分:文件操作
前端·数据库·python
多打代码1 小时前
2026.1.29 复原ip地址 & 子集 & 子集2
开发语言·python