☰
从多核到Chiplet:一文看懂计算机体系结构的演进与架构思维
2026/10/14 10:44:55 网站建设 项目流程

计算机体系结构系列写到第11篇,时间线终于从纸带、继电器一路拉到了手边这颗芯片上。前几篇我们聊过冯·诺依曼结构、流水线、分支预测、超标量和乱序执行,本质上都是在做同一件事:在不改变程序语义的前提下,把一条指令从取指到完成的全过程“压榨”得更快。但这一篇,我想把叙述的角度拧一下。因为过去二十多年里,“把单条指令推得更快”这件事已经实实在在撞上了物理极限。

这一篇适合的人,不只是做CPU设计的同学,也包括日常写代码、做运维、配服务器,甚至只是好奇手机和电脑里那颗芯片到底在忙什么的人。我会尽量用工程师之间聊天的口吻,把多核、异构、RISC-V、Chiplet这些听着高大上的词拆开揉碎讲清楚,也会穿插一些我自己在实测和选型中踩过的坑。

1. 站在第11篇看全局:处理器架构的四次大转向

1.1 从“单点快跑”到“多线并行”的路线切换

要理解架构为什么走到今天,先得回顾前10篇暗含的一条主线:早期计算机几乎把所有聪明劲都花在提升单个处理器的执行效率上。提高主频,增加发射宽度,用乱序执行隐藏访存延迟,用分支预测把流水线气泡填满,这套方法论从1970年代开始逐渐成形,到2000年前后已经打磨得非常成熟。

当时的高端桌面处理器主频从几百MHz一路冲到3GHz、4GHz,给人感觉是“只要工艺再缩一点,主频还能继续飞”。但真实世界在2000年代中期踩了刹车:此后十几年,主流处理器的主频普遍徘徊在3GHz到5GHz之间,几乎没有再出现翻倍式的增长。这不是工艺做不到,而是功耗和散热实在兜不住了。频率每往上拉一点,动态功耗会按平方关系上涨,芯片很快就不是计算单元,而是变成一个发热密度极高的电暖器。

所以架构演进在这里发生了第一次重大转向:既然单点加速的路走不下去,那不如换成“多条轨道并行跑”。多核处理器因此登上主舞台,这是计算机架构从“单点快跑”切换到“多线并行”的起点。后来大家熟悉的双核、四核、八核直到几十核,都是这一思路的延续。

1.2 决定转向的三堵墙:频率墙、功耗墙与存储墙

为什么单核频率冲不上去?拆开看其实是三堵墙叠加在一起。

第一堵是频率墙,和功耗墙基本是一回事。芯片动态功耗可以近似表示为:

[ P \approx C \times V^2 \times f ]

其中,C是等效电容,V是工作电压,f是主频。电压和频率任何一个往上提,功耗都以平方甚至更高的速度增长。到45nm制程之后,静态功耗(漏电流功耗)也跟着涨,芯片的“基础功耗”明显抬高。于是散热从芯片设计的外围问题变成了核心问题,厂商不得不转向“多核但降频”的路线:单核可以冲到极高频率,但只能维持极短暂的时间,长期运行必须限制在较低功耗范围内。

第二堵是存储墙。CPU的执行速度涨得很快,但DRAM的访问延迟降得很慢,两者之间的差距持续拉大。再加上冯·诺依曼结构本身是“取指令、取数据、执行、写回”串行使用总线的,数据搬运路径越长,效率损失越明显。早期系统可以通过加大缓存来缓解,但缓存本身也有容量、延迟和面积的三角矛盾。

第三堵是指令级并行墙。乱序执行、超大发射窗口、物理寄存器堆这些都是硬件资源,窗口宽度做到一定程度后,面积和功耗会爆炸式增长,而实际代码里能够被挖掘的指令级并行度并没有那么高。分支预测准确率即便做到98%、99%,剩下那百分之几的预测错误仍然会造成流水线冲刷,而且越往后越难优化。

把这三堵墙放在一起看,你就明白“多核取代高频”并不是某家厂商想出来的营销策略,而是物理规律逼出来的唯一出路。

演进时代主要优化目标核心成本关键瓶颈
单核高频时代主频、IPC、流水线效率功耗、散热频率墙、功耗墙、ILP极限
多核并行时代核心数量、缓存一致性、并行调度核间通信、编程复杂度Amdahl定律、访存带宽
异构加速时代专用加速单元、能效、数据流定制软件栈复杂度、互连设计通用性与专用性的平衡

2. 多核处理器:架构史上一次“进亦忧退亦忧”的选择

2.1 缓存一致性与核间通信:多核系统的“隐性税收”

多核看上去只是“多放几个执行单元”,但工程上远没那么简单。最核心的问题就是缓存一致性。

单核时代,缓存里的数据只属于自己,写错了也无所谓,处理器自己知道。多核就麻烦了:两个核同时缓存了同一块内存地址的数据,其中一个改写后,另一个核如果继续用旧的缓存值,程序就彻底乱了。为了解决这个问题,硬件引入了缓存一致性协议,比较经典的就是基于缓存行的状态机协议,比如MESI族协议,它用修改、独占、共享、失效等状态来跟踪每个缓存行的归属。

这套机制保证了多核共享内存的语义正确,但代价不小。一个核写入共享数据时,通常要在核间扩散一条失效消息,通知其他核把对应缓存行标记为失效。如果多个核频繁争抢同一个缓存行,整个系统的大部分时间都耗在一致性流量上,而不是真正执行指令。这种现象在并发编程里有个经典陷阱叫“伪共享”:两个线程明明在写不同的变量,但这两个变量碰巧落在同一个缓存行里,于是互相拖慢,性能掉得莫名其妙。

多核规模继续扩大后,又出现了NUMA问题。在非一致内存访问架构里,内存被划分成不同节点,每个核访问本地内存很快,访问远端内存要跨互连链路,延迟差出一截。程序员如果不对核和内存做亲和性绑定,操作系统可能会把一个线程调度到离它数据很远的核心上,性能损失肉眼可见。

2.2 核多了,性能不一定上去:Amdahl定律与并行度现状

比缓存一致性更让开发者头疼的,是软件本身能不能用满这么多核。Amdahl定律给出了一个非常冷静的结论:

[ S = \frac{1}{(1-p) + \frac{p}{N}} ]

其中,p是程序中可以并行化的比例,N是核心数。就算95%的代码都能并行,当N趋向无穷大时,加速比上限也只有20倍;如果只有70%能并行,那再多的核也最多把你从1分压到3分多一点。

我在实际测试中见过的典型例子是这样的:某平台有20个物理核、32个线程,看起来声势浩大,但跑一个以单线程为主的业务系统时,性能几乎没有任何提升,甚至因为系统调度和核间同步的开销,比精简配置的机器还慢了一点。反过来,同一台机器在跑并行渲染、大规模编译或者矩阵计算时,核心数直接对应着交付时间缩短,体验天差地别。

所以谈多核价值之前,一定要先问一句:我的负载到底有多少可以并行?这个问题的答案,决定了你是该买高主频小核心平台,还是大核心多路平台。

2.3 从选型角度看多核价值

做架构选型的时候,我习惯先把负载分成三类:

  • 延迟敏感型:典型的是高频交易、在线搜索、微服务请求链路。这类负载往往单线程逻辑很长,依赖单核IPC和主频,核心数够用就行,盲目堆核没有意义。
  • 吞吐敏感型:视频转码、批量数据处理、科学计算、大数据分析。这类负载的并行度通常很高,多核甚至多路扩展会带来接近线性的收益。
  • 混合型:数据库、大型服务端应用。既要支撑并发请求,又有不少单线程内部路径,需要针对缓存命中率、锁竞争和IO调度做综合调优,不能只看核心数。

一个值得养成的习惯:不要拿着产品参数页面上的核心数就下结论。先做压测,再把CPU的核利用率、缓存未命中率、锁等待时间拉出来看,多核到底是不是瓶颈,数据会告诉你。

3. 异构计算:把“专用”重新请回主舞台

3.1 GPU的翻身仗:从图形渲染到通用并行计算

多核之后的下一个重大转向,是把原本不被当作通用计算资源的芯片拉到主战场,最典型的就是GPU。

早期GPU是一个非常“专用”的处理器,整个流水线基本都是固定功能的:顶点处理、像素填充、光栅化,每一步都是焊死的电路。后来图形API越来越复杂,固定管线跟不上需求,于是出现了可编程着色器,再往后,硬件收敛到统一着色器架构:一大批执行单元既能做顶点处理,也能做像素处理,通用计算能力就此崛起。

GPU的并行模型和CPU完全不同。CPU追求低延迟,单个核心极强,能处理复杂分支;GPU走的是吞吐优先路线,用大量相对简单的核心组成计算阵列,以SIMT风格批量执行同类操作。想象一下CPU是几个各科都会的全科医生,能处理疑难杂症但人数有限;GPU是一整条流水线上的大批熟练工人,单看一个人能力平平,但几百上千人同时做同一道工序,总产出惊人。

正因如此,GPU非常适合数据并行任务:图像处理、视频编解码、物理模拟、科学计算都纷纷迁移上去。等到深度学习爆发,人们发现神经网络训练本质上是海量矩阵乘法,GPU的并行天性几乎是量身定做的,于是GPU从渲染配件一跃成为AI时代的基础算力设施。

3.2 AI加速器的架构逻辑:NPU/张量核/脉动阵列

GPU并不是异构计算唯一的主角。随着AI算力需求越来越大,芯片里开始出现更“专”的计算单元:NPU、张量核、矩阵加速单元,它们的设计逻辑比GPU更彻底地放弃了通用性。

AI计算的核心算子高度集中,主要是矩阵乘法和卷积。这两类运算的共同特点是:数据重复使用率高,乘法累加操作密集,而且对数值精度并不苛刻。FP16、INT8甚至更低位宽的运算在许多场景下就能满足精度需求,于是专用加速器在设计上可以做三件事情:

  • 把乘加单元排成脉动阵列,让数据在计算单元之间短距离流动,减少访存次数;
  • 降低数据位宽来提升单位面积的算力密度和能效;
  • 针对特定数据形状做流水线编排,让计算单元几乎不休眠。

这种架构的基本逻辑很好理解:CPU是一辆通用轿车,能拉人、能拉货、能跑高速;AI加速器则更像一辆专用货车,装载能力极强,但只能走固定的运输路线。当你的负载百分之九十都是“拉货”时,专用货车显然比通用轿车划算得多。这也是为什么手机SoC里普遍集成NPU,数据中心里出现各种加速卡,它们不是要取代CPU,而是围绕“特定计算模式”做能效和吞吐量的极致优化。

3.3 异构系统统一的现实路线:统一内存与编程模型收敛

异构计算带来的最大工程难题,是CPU和加速器之间怎么高效协同。早期GPU通用计算的时代,数据要先从CPU内存拷贝到GPU显存,计算完再拷回来,PCIe总线成了性能瓶颈。编程人员必须手动管理两份数据,非常痛苦。

后来出现的统一内存和共享虚拟地址机制,让CPU和GPU/加速器可以访问同一个地址空间,省去了大量显式拷贝。但必须说清楚,统一内存方便的是软件,并没有神奇地消灭物理带宽问题。加速器远端访问数据仍然有延迟,数据局部性做不好,性能照样崩。

移动SoC里的大小核异构是另一个方向的统一思路:把高能效核心和高性能核心放在同一颗芯片上,由调度器根据任务负载自动切换或组合使用,让轻量任务跑在低功耗核心上,重型任务再唤醒高性能核心。这种“算力随负载伸缩”的设计,比单纯堆硬件勇敢更契合真实使用场景。

从软件生态来看,异构编程模型也在逐步收敛:底层还是需要类似CUDA风格的调度方式,上层则越来越多地通过统一框架把计算分发到CPU、GPU、NPU上。对普通开发者来说,异构计算的门槛在下降,但对性能极致敏感的场景,理解硬件拓扑、数据放置和带宽模型仍然不可替代。

4. 开放指令集与Chiplet:架构叙事正在发生结构性变化

4.1 RISC-V:把指令集做成“可裁剪的积木”

讲完微架构层面的变化,还要花点时间看指令集层面的变化,因为这是计算机架构“前世今生”叙事里最有戏剧性的一段。

传统上,x86和ARM虽然一个是复杂指令集、一个是精简指令集,但它们的商业模式本质上都是封闭授权。指令集文档是受控的,想基于它们设计处理器,必须获得授权,并且不能随意修改指令集。这不一定是坏事,它保证了生态的稳定,但也让“针对特定负载定制指令”变得极其困难。

RISC-V不一样,它是一个开放指令集,基础指令集非常精简,而且整个规范以公开方式维护。更关键的是,它采用模块化扩展模式:你完全可以根据目标场景选择整数、乘除、原子操作、向量、压缩指令等不同扩展组合。比如做一个微控制器,可以只选最基础的指令集;做一个AI处理器,可以再加上向量扩展,甚至自定义专属指令。

这种“指令集随时可以裁剪和扩展”的能力,对架构设计的影响是结构性的。过去芯片公司只能被动接受上层软件生态对指令集的定义,现在可以主动让指令集贴合自己的算法。硬件和软件可以在同一张图纸上协同设计,不再需要拐一个弯去迁就无法修改的指令集。

当然,RISC-V的开放不等于自动成功。指令集开放只解决“能不能设计”的问题,真正的战场在微架构实现、工具链完善度、操作系统支持、开发者生态这些工程细节上。但至少,它为架构演进增加了一条极具活力的新岔路。

4.2 Chiplet:从一体化SoC到芯粒组合

如果说RISC-V改变了指令集的游戏规则,那么Chiplet正在改变芯片的制造和封装方式。

传统的大芯片设计追求把所有模块集成到同一块裸片(die)上,大家共享同一份制程。问题在于,制程越先进,大尺寸裸片的良率越低,成本呈非线性上涨。而且整颗芯片所有模块都得用同一套工艺,CPU核心可能想要高性能制程,IO接口和模拟模块其实用成熟制程就足够,硬绑在一起很浪费。

Chiplet的思路是把一个大芯片拆成多个功能相对独立的芯粒(die),各自选用最合适的制程制造,再通过先进封装和Die-to-Die互连接口把它们拼成一个系统级封装。这个过程中,互连协议、片间带宽、缓存一致性、功耗和热管理全部成为架构的一部分。芯片设计不再只是“画一个超大电路”,更像是做一套模块化系统设计。

用生活类比来说,传统SoC像一次开模铸造一口大铁锅,锅体、锅盖、把手一体成型,优点是没有组装缝隙,缺点是一旦某一处出问题整口锅都报废;Chiplet则像买了一套高品质厨具,锅体、锅盖、把手分开制造,每部分都可以用不同的工艺打磨到最好,再组装起来,出了问题也能针对单个部件替换。

Chiplet对行业生态的影响也很深远。它让中小团队不必在一颗die里集成所有功能,可以采购现成的芯粒或物理层IP,把自己的精力集中在核心加速器、总控逻辑等关键部分。封装能力开始和流片能力同等重要,架构设计的边界也因此向外延伸了好几层。

4.3 系统级架构的重新定义:从CPU设计到全栈协同

把RISC-V和Chiplet放在一起看,会发现现代架构设计已经不太像一个单纯“设计CPU”的工作,而更像系统架构设计。

过去,一台计算机的性能主要由处理器微架构决定,软件工程师把代码写好就行了。现在,性能取决于一整条链路的协同:指令集是否匹配负载、微架构能否充分发挥指令集、内存层次和互连拓扑是否足够宽、加速器数据通路是否畅通、操作系统调度器是否懂得绑核和迁移、编译器能否生成适配特殊指令序列的代码。

任何一环落后,都会成为整个系统的短板。很多时候跑得慢,不是CPU算得慢,而是内存带宽喂不上数据;不是核心数不够,而是调度器把线程从一个核挪到另一个核,缓存全废了。架构演进到这一步,“软硬协同”从口号变成了具体技能:做架构的人必须理解软件生态,做系统软件的人也必须理解硬件瓶颈。

5. 架构视角下的常见误判与实操参考

5.1 看处理器参数时,最容易踩的四个坑

作为常年跟硬件选型打交道的人,我发现很多朋友在看处理器规格时,会不自觉地掉进几个固定的坑里。

第一个坑是只盯主频,觉得主频高就一定快。实际上,跨代际或跨指令集比较主频意义不大。一个乱序执行能力强、缓存命中率高的处理器,即便主频低一些,单线程性能也可能反超。正确做法是看IPC趋势和实际跑分,而不是只看GHz数字。

第二个坑是只看总核心数,把核心数等同于吞吐能力。核心数只有在并行度足够高、访存带宽足够宽的前提下才有意义。很多单线程业务根本吃不掉额外核心,反而还要承担调度和锁同步的额外成本。

第三个坑是迷信AI算力峰值,比如TOPS指标。这类参数通常是特定精度、特定稀疏度、特定频率配置下的理论峰值,实际场景里因为内存带宽、散热限制和软件框架的额外开销,能跑到的真实性能往往大打折扣。选型时如果只看峰值,很容易被发布会数据带偏。

第四个坑是只看缓存总容量,忽视缓存的延迟和关联度。缓存的威力在于“命中”,命中率取决于访问模式和替换策略,容量只是其中一个因素。有的芯片缓存容量大但访问路径长,命中延迟反而不如另一颗缓存小但紧凑设计的芯片。

参数维度适合场景容易产生的误判
高主频延迟敏感、单线程逻辑误以为频率等同性能
多核心并行渲染、批量计算、数据库忽视并行度和调度开销
大缓存数据复用率高的访问模式忽视缓存延迟和替换策略
AI算力峰值AI负载专用加速器测试忽视位宽、稀疏度和散热约束

5.2 把架构思维用在日常选型与调优里

面对一台新机器或一套新平台,我一般会先用三个问题把负载“定性”,再做选型和调优决策。

第一,负载是延迟敏感还是吞吐敏感?如果是延迟敏感,优先看单核性能和频率稳定性;如果是吞吐敏感,优先看核心数和内存带宽。

第二,负载到底有多并行?用性能分析工具量化一下,能够持续并行运行的时间占比有多少。并行度不高的应用,塞再多的核也只是看着热闹,实际加速比可怜。

第三,负载瓶颈是计算还是访存?如果程序大部分时间都花在缓存未命中或者内存拷贝上,那加核心、升频率都不如优化数据结构、缩短访问局部性来得快。反过来,如果是纯计算密集且指令级并行度也不够,那专用加速器或向量指令扩展可能比多核更有性价比。

实际操作中,我通常会在正式压测之前先做一次最小复现:把核心业务路径单独抽出来,分别跑单线程、多线程、缓存绑定和不绑定场景,看性能曲线到底卡在哪一环。这样既不会浪费资源盲目堆硬件,也能快速定位软件需要调整的瓶颈点。

5.3 GPU硬件加速之外,CPU架构的“软”调优同样有用

这一点算是我个人的偏门经验:在讨论架构时,大家往往关注硬件的升级,但很多CPU性能问题其实是可以通过软件层面的架构感知来缓解的。例如,改一个缓存对齐,把热变量从同一个缓存行里拆开,就能消灭伪共享导致的性能崩盘;又例如,在启动参数里绑定线程的核亲和性,让线程尽量留在本地缓存不迁移,就能明显降低NUMA带来的跨节点延迟。这类调优不需要换机器,收益却立竿见影。

我见过最夸张的一次,某服务在开启核亲和性绑定后,接口延迟直接下降了将近三成,核心没有变,频率没有变,变的只是让线程和数据待在同一个地方。所以架构能力不只是画芯片的人才需要,做应用层开发同样值得具备:理解缓存、理解NUMA、理解核间通信成本,很多“莫名其妙”的性能问题都能迎刃而解。

我在实际使用中最大的体会是,架构演进从来不是线性的“越来越快”,而是在通用与专用之间来回摇摆。早期计算器是专用的,后来变成通用的冯·诺依曼结构;通用处理一路狂奔撞上物理墙,又转向多核;多核并行度不足,又催生了GPU和AI加速器这样的专用计算单元;现在RISC-V和Chiplet又把“按需定制”的能力交还给更多设计者。

所以真正理解架构的人,不会只盯着频率、核心数或者某个峰值算力,而是先搞清楚负载的真实形态,再决定怎么组合通用与专用、怎么平衡并行与串行、怎么分配数据与计算。这个思路,放到学习、选型、开发调试里都成立。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询