原文:https://dev.to/lovestaco/cpu-gpu-tpu-npu-dpu-qpu-six-chips-one-question-438b(作者 @lovestaco)
打开笔记本电脑的规格表,你会看到 CPU、GPU;如果机器足够新,可能还会看到 NPU。
打开云实例页面,平台会提供 GPU、TPU,以及一块看起来像网卡、实际上像一台披着风衣的完整计算机的设备。
在某个实验室里,一台比深空还冷的制冷机正在运行 QPU。
六个缩写,都以 PU 结尾,也都在做“计算”。
一个显而易见、却长期被忽略的问题是:为什么不干脆做一个非常强的处理器,然后一劳永逸?
简短的回答是:“计算”并不是一件事。更长的回答才有趣。
CPU 是那种什么都答应的老好人
CPU 是中央处理器(Central Processing Unit),也是典型的通用型处理器。
它要运行操作系统、API 处理程序、正则表达式、if 语句、数据库、构建工具,还有那个莫名其妙吃掉 4GB 内存的 Slack 客户端。
CPU 的设计目标是擅长_不可预测_的工作:分支密集的代码,下一条指令取决于上一条结果。
指针追踪。长依赖链:由于第 5 步确实需要第 4 步的输出,所以根本无法并行。
为了做到这一点,现代 CPU 核心塞满了大量与数学运算无关的机制:分支预测器猜测 if 会往哪边走,乱序执行在你看不见的地方重新排列指令,多级缓存则竭尽全力掩盖内存延迟高得尴尬这一事实。
这些聪明设计都要消耗晶体管和功耗。所以你得到的是少量非常聪明的核心,而不是成千上万个核心。
这种设计本来很好,直到工作负载换了形态。
然后有人丢给你一百万个完全相同的加法
假设你需要在几百万个数值上执行同一个操作。相同指令,不同数据,没有分支,谁也不用等谁。
CPU 可以做这件事。它甚至可以通过多核心和 SIMD 单元并行处理。
只是它做不好,因为你为分支预测硬件付出的成本,正在预测一个根本不存在的分支。
于是 GPU,也就是图形处理器(Graphics Processing Unit),登场了。
GPU 来自图形渲染,而渲染正是这类问题最纯粹的形态。
一帧 4K 画面大约有 830 万个像素;如果跑 60fps,你每秒要对所有像素着色 60 次,并且每个像素都执行同样的光照计算。
所以 GPU 设计师做出了与 CPU 设计师相反的取舍:去掉复杂的单核智能,把晶体管花在算术单元上,让成千上万个线程步调一致地执行。
这种模型有一个名字:SIMT,即 Single Instruction Multiple Threads,单指令多线程。
谁也没想到的是:神经网络的计算形状,竟然和图形渲染很像。
Transformer 的一次前向传播,主体是巨大的矩阵乘法,也就是数百万次彼此独立的乘加操作。这正是 GPU 的母语。
显卡就这样意外地成为整个 AI 产业的算力底座,这可能是硬件史上最赚钱的一次意外。
下面是同一份晶体管预算的两种完全不同的花法。左边是四个核心,但其中大部分面积并不是算术单元。
右边则是一大片算术单元,它们完全不会自己做决策。

📌 Sleeping Shaq 梗:对多两个 CPU 核心无感,对 16000 个简单并行核心瞬间清醒(图,点击查看)
如果计算总是同一套,就造一颗只做这些计算的芯片
当矩阵乘法成为一个行业的主要成本后,下一步几乎不可避免。
这就是 TPU,即张量处理单元,Google 的机器学习加速器。
GPU 仍然是通用并行计算机。它有调度器、寄存器文件,以及一套能应对各种任务的内存模型。
TPU 则把目标收窄:让芯片专门围绕张量和矩阵运算设计,并根据这些运算实际的数据流动方式来设计数据搬运。
如果你对这类话题感兴趣,Google 的首篇 TPU 论文值得一读,因为它非常直白地谈到了其中的取舍。
这颗芯片并不“聪明”。
它是一个由乘累加单元组成的大型脉动阵列,控制逻辑被大幅剥离;它之所以能在每瓦性能上胜出,恰恰是因为它拒绝保持灵活。
专用硬件的全部论点可以用一句话概括:假设越狭窄,当假设成立时,回报就越大。
而当假设不成立时,摔得也越惨。
让 TPU 去跑 JSON 解析器,不会有什么好结果。
这个取舍值得展开讲,因为它是解释这一整套芯片谱系的核心思路。
可以想象一根绳子,一端是灵活性,另一端是每瓦吞吐量,每一类经典芯片都站在这根绳子上的某个位置:

但并非所有 AI 都运行在数据中心
你的手机会用人脸解锁、在通话时虚化背景、把语音消息转成文字,还会修复一张在弱光下拍出的照片。
这些任务都不应该绕一圈送到 GPU 集群处理。那样会慢,会为了无线传输消耗电量,还意味着为了获得这些功能,把你的脸部数据发送到别人的服务器上。
这就是 NPU,即神经网络处理单元:一个位于设备本地的小型 AI 加速器,通常与 CPU、GPU 集成在同一颗芯片上。
Apple 将其称为 Neural Engine,并通过 Core ML 对外提供;Qualcomm 和 Intel 也有自己的方案;笔记本电脑上那些“AI PC”贴纸,本质上都是在说它内置了 NPU。
TPU 和 NPU 都是 AI 加速器,因此有必要把二者的区别说清楚。差异其实不在数学运算本身,而在它们所面向的运行环境:
- TPU:数据中心。接市电。训练和部署超大规模模型。优化目标是每机架吞吐量。
- NPU:你的口袋。靠电池运行。持续执行小型模型。优化目标是每瓦运算量,以及别把牛仔裤口袋烫坏。
方程相同,约束条件却天差地别。这足以解释为什么需要两种不同芯片。
这颗芯片的工作根本不是计算
最让人意外的部分在这里。
想象一台云主机同时运行几十个虚拟机。在你的应用代码执行之前,这台机器必须先完成:终结网络数据包、运行虚拟交换机、执行安全组策略、加密流量、把实际位于远端存储上的磁盘呈现为虚拟磁盘,并处理机房里的各种 I/O 中断。
传统上,这些工作都由宿主 CPU 完成。也就是说,你买了一台 64 核服务器,但其中相当一部分算力从未真正接触客户负载。
业界委婉地把这称为“数据中心税”。
DPU,即数据处理单元,把这笔“税”转移到自己的芯片上。
它是一块带有自身 CPU 核心、网卡,以及网络、存储、加密硬件引擎的卡,负责接管基础设施工作,让宿主 CPU 回去运行应用。

AWS Nitro 是最著名的例子,也正是因此,AWS 才能提供几乎保留全部宿主核心的裸金属实例。
NVIDIA BlueField 是同一思路的商业化通用版本。
因此,DPU 并不是在通用性阶梯上走得更远。
它站在完全不同的坐标轴上,因为它的工作负载是搬运数据,而不是计算数据。
📌 Gru 的计划梗图:GPU 闲置,因为 CPU 正忙着当网卡(图,点击查看)
然后还有一种,甚至根本不在玩同一场游戏
到目前为止,前面提到的处理器都属于经典计算机范畴。CPU、GPU、TPU、NPU、DPU,它们本质上都是在处理比特,而一个比特要么是 0,要么是 1。
QPU,也就是量子处理单元,使用的是量子比特。
量子比特可以处于叠加态,多个量子比特之间还可以形成纠缠。量子算法正是利用这些特性,以经典算法在结构上无法做到的方式去探索问题空间。
这里有两个常见误区,需要较真一下:
QPU 不是更快的 CPU。 它是一种不同的计算模型。
不存在把 Web 服务器移植到 QPU 上就能获得加速的场景。
大多数问题根本无法获得量子优势。
“所有任务都能指数级加速”是营销话术。
真正有前景的方向其实很窄,也很具体:模拟量子系统(化学、材料)、某些优化问题,以及密码学。其中,Shor 算法 正是人们现在就关心后量子密码学,而不是等到 2040 年才开始担心的原因。
如果你想上手真实硬件,而不是停留在概念层面,IBM Quantum 允许你免费运行量子电路。
当前的量子计算机噪声大、规模小,纠错是所有人都在攻克的难关。这确实是令人兴奋的研究方向,但它不是数据中心升级项目。
📌 等待骷髅梗图:等待一台具有密码学意义的量子计算机(图,点击查看)
那到底该怎么选?
不要从缩写词出发,而要从工作负载的形态出发。
📌 示意图:从工作负载形态到处理器选择的决策树(图,点击查看)
把它当成一组问题,而不是一套等级体系:
- 工作负载是否分支密集且任务多样?选 CPU。大多数软件都属于这种情况,这没什么问题。
- 是否是对海量数据重复执行同一种操作?选 GPU。
- 如果这种操作具体来说是数据中心规模下的张量计算?选 TPU。
- 如果是电池供电设备上的张量计算?选 NPU。
- 如果瓶颈在数据搬运,而不是计算本身?选 DPU。
- 如果这个问题已经有量子算法具备已知优势?选 QPU,未来也许行,但今天大概率还不行。
这里有一点值得真正记住:这不是一场竞赛。这些芯片是同事,不是对手。
你从手机上向某个 AI 功能发起一次请求,可能就会碰到其中四种处理器。手机的 NPU 会先判断能否在本地处理该请求。
如果不能,CPU 会构造请求;数据中心里的 DPU 负责连接终结,并处理存储和密码学工作;服务器 CPU 运行应用逻辑;GPU 或 TPU 执行实际推理。

在真实代码里会咬人的部分
了解这套分类体系当然是好事。
但实际开发中的陷阱在于:加速器只能帮到它真正执行的那部分工作。
Amdahl 定律 在这方面毫不留情。如果程序里有 20% 的运行时间无法被加速,那么即使把剩下 80% 加速到无限快,整体上限也只有 5 倍。
在现实中,那 20% 无法加速的部分,往往是数据加载、预处理,以及通过 PCIe 总线复制张量。
这就是为什么总会有“我们买了 GPU,结果只提速 1.3 倍”的故事。GPU 本身没问题,问题是 GPU 一直在饿肚子。
用大约十行代码就能亲眼看到这件事:
import time, torch
x = torch.randn(8192, 8192)
t = time.perf_counter()
x @ x
print(f"cpu: {time.perf_counter() - t:.3f}s")
g = x.cuda()
torch.cuda.synchronize()
t = time.perf_counter()
g @ g
torch.cuda.synchronize() # kernel 是异步的,所以要诚实地测量
print(f"gpu (resident): {time.perf_counter() - t:.3f}s")
t = time.perf_counter()
(x.cuda() @ x.cuda()).cpu() # 很多人会不小心写成这样
torch.cuda.synchronize()
print(f"gpu (+copies): {time.perf_counter() - t:.3f}s")
中间那个数字,就是宣传材料里会出现的数字。
最下面那个数字,则是每次调用都跨总线搬运数据时,你实际会得到的结果。
在大型矩阵乘法中,数据传输的开销甚至可能超过计算本身。解决办法始终一样:让数据驻留在设备上,并批量处理任务,让每一次数据搬运都值得。
同样的教训也出现在 NPU 上:最快路径是张量始终不离开加速器可见的共享内存;也出现在 DPU 上:它的全部意义就是让数据包不再反复穿过主机内存。
如果你想知道自己的机器里到底带了哪些芯片:
lscpu | grep -E 'Model name|^CPU\(s\)|Flags' | cut -c1-120 # 核心数 + SIMD 支持 nvidia-smi --query-gpu=name,memory.total --format=csv # 独立 GPU ls /dev/accel* /dev/dri/render* 2>/dev/null # 加速器 + 渲染节点
在一台现代笔记本上,最后一条命令会悄悄显露出一些有趣的信息:里面的芯片,通常比你预期的更多。
一张流程图建立心智模型
如果这些内容里只能记住一点,那就记住判断问题,而不是记住缩写词。
下面这个版本可以直接贴进笔记:
flowchart TD
A[What shape is this work?] --> B{Branchy, varied, sequential?}
B -->|Yes| CPU[CPU]
B -->|No| C{Same op over huge data?}
C -->|No| D{Bottleneck is moving data?}
D -->|Yes| DPU[DPU]
D -->|No| Q{Known quantum advantage?}
Q -->|Yes| QPU[QPU, eventually]
Q -->|No| CPU
C -->|Yes| E{Neural network math?}
E -->|No| GPU[GPU]
E -->|Yes| F{Data center or device?}
F -->|Data center| TPU[TPU]
F -->|Device on battery| NPU[NPU]
出现六种处理器,并不是因为计算变得毫无必要地复杂。
之所以会有六种,是因为“做得更通用”和“做得更快”往往朝相反方向拉扯,而不同问题恰好落在这根绳子的不同位置。
CPU 对几乎所有任务都说“可以”,所以每件事都只能做到平庸。
TPU 几乎只对极少数任务说“可以”,但能把它接受的少数任务做得非常出色。
其他处理器则介于两者之间,各自负责特定工作。
原文:https://dev.to/lovestaco/cpu-gpu-tpu-npu-dpu-qpu-six-chips-one-question-438b(作者 @lovestaco)



