一文吃透GPU的运行
·
今天把你摁进GPU内部,从晶体管到代码执行,每一根毛都给你薅明白!
1. 先搞清GPU的物理结构:SM才是真大佬!
GPU架构层级
- GPU芯片 → 整个富士康工厂
- SM(Streaming Multiprocessor,流多处理器) → 工厂里的独立车间(比如RTX 3090有82个SM)
- CUDA Core → 车间里的工人(每个SM有128个Core,3090的SM有128×82=10496个Core)
- Warp Scheduler(Warp调度器) → 车间里的流水线拉长
关键结论:CUDA Core不是直接面向线程的!真正调度线程的是SM!
2. SM内部解剖:车间里的暴力流水线
一个SM内部长这样:
[SM车间]
├── 128个CUDA Core(工人)
├── 4个Warp Scheduler(拉长)
├── 32个Dispatch Unit(发指令的喇叭)
├── 64KB共享内存(车间白板)
└── 寄存器堆(工人私藏工具箱)
运行流程
- 拉长(Warp Scheduler) 领到一捆订单(Warp,32个线程)
- 拉长怒吼:“所有人给老子执行ADD指令!”
- 32个工人(CUDA Core) 同时从自己工具箱(寄存器)掏数据,执行加法
- 下一时钟周期:拉长换下一捆订单(另一个Warp)继续吼
关键真相:
- 一个SM同时能处理多个Warp!
- 每个Warp Scheduler负责管理多个Warp的切换!
3. Warp调度:车间拉长的时间管理术
假设你的SM配置:
- 4个Warp Scheduler(拉长)
- 每个拉长管理8个活跃Warp → 车间同时管理32个Warp(32×32=1024线程)
执行过程:
- 每个时钟周期:
- 4个拉长各选一个准备好的Warp
- 每个拉长派发1条指令给32个工人(CUDA Core)
→ 4条指令 ×32线程 = 128条指令/周期(正好用满128个Core)
- 指令流水线:
- 拉长1:第1个Warp执行加法
- 拉长2:第2个Warp执行乘法
- 拉长3:第3个Warp访问内存
- 拉长4:第4个Warp同步等待
灵魂总结:SM像多线程CPU,靠乱序执行和流水线榨干硬件性能!
4. 1万个核心怎么来的?暴力堆SM!
- RTX 3090:82个SM × 128 Core/SM = 10496 Core
- 每个SM的128 Core:
- 分成4个处理块(32 Core/块)
- 每块对应一个Warp Scheduler
- 32 Core ×4 Scheduler = 128 Core/SM
执行真相:
- 每个Warp需要32个Core同时干活
- 一个SM的4个拉长 → 同时执行4个Warp → 4×32=128 Core用满!
5. Warp的生死轮回
Warp状态机
- Active:正在执行(工人疯狂敲计算器)
- Stalled:卡住了(等数据、等同步)
- Completed:干完了(滚出车间)
调度策略:
- 拉长永远优先执行非Stalled的Warp
- 一旦Warp卡住(比如访问全局内存),立刻换下一个Warp
比喻:拉长像渣男,永远找最听话的Warp,冷落卡住的Warp!
6. 最终答案:1万个核心如何跑百万线程?
暴力时间切片
- 物理限制:82个SM × 128 Core = 10496 Core
- 逻辑线程:你开100万个线程 → 分成31250个Warp(100万/32)
- 执行过程:
- 每个SM分到约31250/82 ≈ 381个Warp
- 每个SM用4个拉长轮流调度这些Warp
- 每个时钟周期推进4个Warp ×32线程 = 128条指令
- 切换速度达到GHz级别(1秒十亿次切换) → 看起来像“同时”执行
灵魂总结:GPU靠海量车间(SM)+ 流水线拉长(Warp Scheduler)+ 纳米级切换,用有限核心模拟出海量并行!
附:GPU执行全景图
[你的代码] → 拆成百万线程 → 打包成Warp → 分配到各个SM车间
↓
[SM车间]
├── Warp调度器:4个拉长管理32个Warp
├── 每周期执行4个Warp ×32线程 = 128条指令
└── 内存访问卡顿时立刻换Warp
↓
[结果写回显存] → 返回CPU
更多推荐


所有评论(0)