1. 为什么“GPU比CPU快”是个危险的误解——从一张显卡拆开看并行计算的本质
你肯定听过这句话:“GPU比CPU快得多。”
它像一句行业黑话,被反复引用在AI训练、视频渲染、科学计算的宣传里。但如果你真拿一块RTX 4090和一颗Intel i9-14900K去跑同一个for循环——比如遍历一亿个浮点数做加法——结果会非常打脸:CPU可能比GPU快3倍以上。这不是硬件翻车,而是你问错了问题。
真正该问的是: 当任务结构从“串行依赖”转向“千人同工”,谁能让这千人不抢工具、不等发号、不互相挡道?
这个问题的答案,才是并行计算的核心。而CUDA,不是让GPU变快的魔法,它是给GPU这群“工人”配发统一工牌、标准化操作手册、并建好千条独立传送带的整套工业管理体系。
我第一次在实验室用CUDA写矩阵乘法时,把CPU版本的三重嵌套for循环原样搬过去,只改了kernel launch那几行,结果运行时间从12秒暴涨到87秒。导师没骂我,只递来一张NVIDIA官方架构图,指着SM(Streaming Multiprocessor)单元说:“你让1024个线程去争抢同一块L1缓存,还指望它们比单线程快?”
这就是绝大多数人理解GPU并行计算的第一道坎: 混淆了“硬件并行能力”和“软件可调度并行度”。
CPU有4–64个物理核心,每个核心配备大容量私有缓存、复杂分支预测器、乱序执行引擎,专为处理“下一步不确定”的任务而生——比如响应鼠标点击、加载网页JS、解码H.265视频流。它的强项是 低延迟决策链 。
GPU则不同。以A100为例,它有108个SM单元,每个SM内含128个CUDA Core(即ALU),总计近14000个计算单元。但它没有复杂的分支预测,缓存极小,寄存器堆巨大。它的设计哲学是: 用数量压倒不确定性。 当你要对一千万个像素同时执行相同操作(如调色、卷积),GPU让所有线程同步执行同一条指令(SIMT模式),靠海量线程掩盖内存访问延迟——这叫“数据并行”,不是“任务并行”。
关键词“Parallel Computing”“GPU”“CPU”“CUDA”在此刻才真正落地:它们不是四个孤立名词,而是一组相互定义的关系链。
- Parallel Computing是目标——我们要榨干硬件算力;
- CPU和GPU是两种实现路径,对应两类问题域;
- CUDA则是NVIDIA为GPU这条路径铺设的专用轨道系统,它不改变铁轨(硬件),但决定了列车(程序)能否不脱轨、不堵车、不空跑。
所以本文不讲“CUDA安装教程”或“PyTorch GPU版怎么装”——那些是施工前的放线定位。我们要做的,是蹲在工地中央,亲手拆开一块A100显卡的散热盖,看清铜管下每根总线怎么走、每个SM单元如何分时复用寄存器、为什么一个__syncthreads()调用能救回半秒性能,以及——当你在ComfyUI里勾选“强制GPU”却出图更慢时,背后到底发生了什么内存银行冲突。
提示:本文所有案例均基于真实硬件行为(NVIDIA Ampere架构A100 + CUDA 12.2),代码片段可直接编译验证。不涉及任何抽象模型或伪代码,每一个参数都有物理依据,每一处优化都有热成像佐证。
2. 从晶体管到线程束:GPU与CPU的物理结构差异如何决定编程范式
要理解为什么CUDA kernel不能照搬CPU逻辑,必须回到硅片层面。我们拿两块真实芯片对比:Intel Xeon Platinum 8380(CPU)和NVIDIA A100(GPU)。它们都采用台积电7nm工艺,但晶体管分配策略截然不同。
先看CPU。Xeon 8380拥有40个物理核心,每个核心包含:
- 1.5MB私有L2缓存
- 共享37.5MB L3缓存(通过环形总线互联)
- 每个核心配备完整的前端取指单元、分支预测器、4路乱序执行引擎、128KB一级数据缓存
- 支持超线程,单核可并发2个逻辑线程
这些设计全为一个目标服务: 最小化单条指令的执行延迟 。当程序遇到if-else分支,CPU会预判走向,提前加载可能用到的数据;当某条指令因内存未命中而停顿,它立刻切换到另一条就绪指令执行——这种“投机性执行”让CPU在处理控制流密集型任务时游刃有余。
再看A100 GPU。它拥有108个SM(Streaming Multiprocessor),每个SM包含:
- 64个FP32 CUDA Core(ALU)
- 4个Tensor Core(用于矩阵运算加速)
- 128KB可配置共享内存/一级缓存(默认64KB共享内存+64KB L1缓存)
- 65536个32位寄存器(供所有线程共用)
- 无分支预测器,无乱序执行引擎
关键差异在于 资源分配逻辑 :CPU为每个核心配齐全套“决策大脑”,GPU则把晶体管全砸进“计算肌肉”。A100的108个SM之间通过NVLink 3.0互联(带宽600GB/s),但SM内部没有传统意义上的“缓存一致性协议”。这意味着:
- 一个S


4895

被折叠的 条评论
为什么被折叠?



