在软件测试这个圈子里摸爬滚打十几年,我见过太多刚入门的开发者对着满屏的报错代码抓狂,也见过不少非技术背景的朋友被"算力"、"张量"、"核心数"这些术语吓得退避三舍。其实,剥开那些高大上的外壳,计算机硬件世界的运行逻辑,往往朴素得让人发笑。
今天,我想用一个稍微长一点的故事,带大家彻底读懂你电脑里那三位"大神"——CPU、GPU和NPU,到底是怎么分工的,以及它们之间那场持续了数十年的"爱恨情仇"。
如果把电脑比作一家超级公司,CPU就是那位全能CEO兼首席运营官。他拥有一颗超强的大脑,逻辑严密,反应极快。
无论是处理操作系统的复杂调度(比如决定先打开微信还是先播放音乐),还是运行那些充满分支判断的业务逻辑(比如"如果用户余额不足,就跳转支付页面,否则直接扣款"),他都能游刃有余。
你的主人(也就是作为用户的你)一直夸他:"能力强,办事效率高,真是我的左膀右臂。"但最近,这位CEO有点崩溃了,甚至想辞职。
不知从哪天起,随着图形渲染和人工智能任务的爆发,主人突然扔给他成千上万个极其简单、枯燥的加减乘除题。
"算一下 3.14 乘以 2.5。"
"再把结果加上 0.01。"
"再乘以另一个数......"
"再把这一万个结果加起来。"
对这位能处理亿级逻辑判断的"天才"来说,这简直是幼儿园大班的作业。让他做这种题,就像让爱因斯坦去数蚂蚁,让米其林大厨去切土豆丝。
但问题是,量太大了!即便这位CEO练就了"一心二用"甚至"一心十六用"的本领(这就是我们常说的多核多线程),面对这种海量的重复劳动,他也得一个个排队算。
他的缓存满了又空,空了又满,累得气喘吁吁,风扇呼呼直转,温度飙升到90度,效率却低得可怜。终于有一天,CPU忍不住在系统日志里抱怨:
"喂!你到底在干嘛?天天让我算这种破玩意儿,大材小用啊!我可是要处理复杂逻辑的!"
"哥,我就让你算了两个矩阵乘法,跑个AI模型而已,这么半天还没算完?我还嫌你慢呢!你看隔壁玩游戏的多流畅,怎么到你这就卡成PPT了?"
CPU听到这更生气了:明明累得要死,还要被嫌弃,这上哪说理去?我又不是专门干这个的!
痛定思痛,这位聪明的CEO想了个绝招:既然我自己干不完,那就花钱招一堆特别便宜的"实习生"来帮我!
脑子简单:复杂的逻辑判断他们完全不会,如果你问他们"如果下雨怎么办",他们会直接死机。他们只会做一件事:最简单的加减乘除。
数量庞大:因为结构简单,造价便宜,你可以招几千甚至几万个。
绝对服从:只要CEO一声令下,所有人同时动手,绝不磨叽。
以前,CEO一个人一次只能算一道题。现在,他站在高台上吹个哨子,成千上万个实习生同时开工。
"所有人听令!第一组算第一列,第二组算第二列......开始!"
原本需要算半天的任务,瞬间搞定。效率直接翻了十几倍甚至上百倍。
CEO给这群实习生起了个响亮的名字——GPU(图形处理器)。而每一个实习生,就是GPU里的一个 CUDA Core(流处理器)。
这可不是我瞎编的童话,咱们看看真实世界的数据,保证让你下巴掉下来。
拿英伟达最新的旗舰显卡 RTX 5090(基于Blackwell架构的GB202核心)来说,它的内部结构就像一座精密的超级工厂:
它内部有 12个 GPC(图形处理集群),好比12个大车间;
最关键的是,每个SM单元里藏着 128个 流处理器(也就是我们的"实习生")。
12 × 8 × 2 × 128 = 24,576
没错,这颗GPU里住着 两万四千多名 随时待命的"实习生"!
对比一下英特尔最新的 酷睿Ultra 9 处理器,作为CPU界的佼佼者,它也就 16个大核、22个线程。这16个核心就像是16位经验丰富的老专家。
如果我们强行把GPU的SM单元类比成CPU的核心,把流处理器类比成线程,那么这颗GPU就相当于一颗拥有192个大核心、24,576个线程的怪物级CPU。
试想一下,如果真有这么一颗CPU上市,售价估计得飙到 500万人民币。为什么?因为维持2万多个能够独立处理复杂逻辑的核心协调工作,其电路设计的复杂度是天文数字。但GPU聪明就聪明在,它让这些核心"变傻",只干简单的活,从而实现了数量的指数级爆炸。
CPU 是博学的教授,擅长处理复杂的、通用的、逻辑性强的任务(比如运行操作系统、编译代码、处理数据库事务)。
GPU 是人海战术的包工头,擅长处理简单的、重复的、海量的数据并行计算(比如图形渲染、视频编码、AI矩阵运算)。
有了GPU这帮实习生,本来已经很快了。但在AI领域,工程师们的贪婪是无止境的。AI领域的计算,大部分时候就是在做枯燥的 矩阵乘法。
比如计算神经网络中某个神经元的值,本质就是输入向量与权重向量对应元素相乘,然后把所有结果加起来。假设一个GPU有12个核心(为了举例简化),它可以同时计算12组乘法。这显然比CPU一个个处理快多了。
这一来一回"倒腾"数据,就像是你让工人搬完砖,必须先把砖放回仓库,登记入库,然后再申请出库,再搬到大腿上才能砌墙。大量的时间浪费在了"搬运"和"等待"上,而不是"计算"本身。
当然有!如果中间的结果不用存回仓库,直接通过专门的硬件电路,像工厂的 自动化流水线 一样,乘法算完的瞬间,数据直接顺着电线流向加法器,整个过程一气呵成,岂不是爽翻天?
🔸 大神1. Tensor Core(张量核心):GPU里的"特种部队"
这是在GPU内部增加的专用单元。它们不像普通实习生那样只能做一个乘法,而是直接内置了"矩阵乘法器"。
你给它四个数,它直接在硬件层面完成"乘加"全过程,一步到位。
这就好比在实习生大军里,混进了一批开着叉车的特种兵,一次能搬运一整托盘的货物,效率比普通手搬高了几个数量级。现在的AI训练,主要靠的就是这些Tensor Core。
🔸 大神2. NPU(神经网络处理器):另起炉灶的"偏科生"
有些厂商觉得,既然AI计算这么重要,干脆别在GPU里打补丁了,直接发明一种全新的芯片吧!
于是 NPU 诞生了。N代表Neural(神经),它是专门为深度学习定制的。
它的电路结构完全是为矩阵运算量身定做的,数据在芯片内部像水流一样自动流转,没有任何多余的搬运开销。在特定的AI任务上,它的效率吊打CPU和GPU,而且功耗极低(手机里能跑大模型,全靠NPU省电)。
灵活性极差。它是极致的"偏科生"。它只能干标准的矩阵乘法和卷积。如果你稍微改动一下公式,或者来个非标准的逻辑判断(比如"如果结果大于0.5就执行A,否则执行B"),NPU就直接傻眼,完全干不了,还得把任务踢回给CPU。
总结一下这三者的关系,我们可以用"装修队"来比喻:
|
|
|
|
|
|
|
|
|
|
|
逻辑分支复杂导致GPU/NPU无法并行;频繁的上下文切换导致CPU过载。
|
|
|
|
|
|
显存不足导致OOM;数据搬运(CPU→GPU)耗时过长;串行逻辑过多导致利用率低。
|
|
|
|
|
|
输入形状变化导致回退CPU;量化精度损失导致结果偏差;控制流(if/else)支持差。
|
懂了CPU、GPU和NPU的这些特性,在测试工作中就能少走很多弯路。这里有两个典型的实战场景,大家在工作中可以留意一下:
如果你在测试一个AI服务时,发现GPU利用率很低(比如只有10%-20%),但CPU温度飙升,接口延迟很高。这时候,你应该立刻想到:是不是有大量的数据预处理(比如复杂的字符串切分、逻辑判断)被放在了CPU上做?是不是应该把这些"搬砖"的活儿,尽量打包好扔给GPU去并行处理?
NPU是"偏科生",它最怕不规则的逻辑。在测试使用NPU加速的模型时,要特别关注输入数据的形状(Shape)是否固定。如果模型在运行中突然遇到了不同尺寸的图片,导致NPU无法处理而回退到CPU执行,这种"模式切换"的耗时可能会导致服务出现偶发性的超长延迟(毛刺)。
GPU监控:使用 nvidia-smi 命令,实时观察显存占用和GPU-util(利用率)。如果利用率上不去,就是并行度不够。
通用分析:使用 PyTorch 自带的 torch.utils.benchmark 或者 Chrome 浏览器的 Performance Tab 来分析代码瓶颈。
虽然底层芯片五花八门,架构各异,但作为开发者,我们其实是幸福的。
假如你很不巧(或者很幸运)学了Python,用了PyTorch或TensorFlow这样的框架,你根本不需要关心底层是谁在干活。
这种看似"傻瓜式"的一行代码切换背后,凝聚了无数工程师多年辛勤耕耘的智慧与心血。特别是 CUDA生态,英伟达花了近二十年,才让那两万多个"实习生"变得如此听话好用。
而NPU目前还没有像CUDA那样统一的生态,不同厂商(华为、苹果、谷歌等)提供的开发者套件各不相同,这也是为什么有时候我们在NPU上部署模型会遇到各种坑的原因。
为了让大家直观体验三大硬件的算力差异,这里提供一段可直接复制运行的完整PyTorch实测Demo,无需复杂配置,可本地对比CPU、GPU的矩阵运算速度,直观感受硬件架构差异:
deftest_hardware_speed(device):
# 生成10000*10000随机矩阵,模拟AI常规矩阵运算任务
mat_a = torch.randn(10000, 10000).to(device)
mat_b = torch.randn(10000, 10000).to(device)
_ = torch.matmul(mat_a, mat_b)
result = torch.matmul(mat_a, mat_b)
# 同步等待GPU运算完成(GPU异步执行,必须同步才能精准计时)
print(f"运行设备:{device},运算耗时:{end_time - start_time:.4f} 秒")
if __name__ == "__main__":
test_hardware_speed('cpu')
if torch.cuda.is_available():
test_hardware_speed('cuda')
print("未检测到可用GPU设备,跳过GPU测试")
运行上述代码可清晰发现:CPU完成大规模矩阵运算耗时显著更长,而GPU依托并行架构,耗时大幅压缩,完美印证了前文的硬件分工逻辑。
当然,罗马并非一日建成,好用的工具链也不是天上掉下来的。每一次顺畅的 model.fit() 背后,都是无数底层驱动工程师在熬夜修Bug。
......
本文节选自第九十一期《51测试天地》
原创文章
《到底是GPU还是CPU?》
文章后续为大家详细讲解了:
AI发展历史和作者感悟
想继续阅读全文
或查看更多《51测试天地》的原创文章
请点击下方 阅读原文或扫描二维码 查看
声明:本文为51Testing软件测试网 测测小仙女儿 用户投稿内容,该用户投稿时已经承诺独立承担涉及知识产权的相关法律责任,并且已经向51Testing承诺此文并无抄袭内容。发布本文的用途仅仅为学习交流,不做任何商用,未经授权请勿转载,否则作者和51Testing有权追究责任。如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:editor@51testing.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。