第3章:多核架构入门
各位同学,今天咱们聊聊多核处理器架构。说实话,我刚入行那会儿,单核芯片还是主流。后来第一次接触多核项目,心里直打鼓——这玩意儿到底怎么协同工作的?
别急,咱们一步步来。多核架构其实没那么神秘,说白了就是多个处理器核心放在一起干活。但怎么放、怎么通信、怎么保证数据一致,这里面的门道可不少。
3.1 同构与异构:两种不同的多核哲学
先说说同构多核。什么叫同构?就是所有核心长得一模一样,指令集、微架构、性能特征都相同。典型的例子就是Intel的Core i7,8个核心完全一样。
我在做嵌入式AI芯片时,遇到过这样一个场景:用4个Cortex-A76核心做同构设计,跑Linux系统,每个核心都能处理AI推理任务。好处很明显——任务调度简单,哪个核心闲着就扔给哪个。
但同构有个问题:功耗。你想想看,所有核心都是高性能设计,跑轻量级任务时也在浪费电。这时候异构架构就派上用场了。
异构多核,就是不同种类的核心混在一起。最典型的例子是ARM的big.LITTLE架构——大核(高性能)加小核(低功耗)。我参与过一个手机SoC项目,用了4个Cortex-A78大核加4个Cortex-A55小核。日常操作跑小核,游戏渲染切到大核,功耗直接降了40%。
嗯,这里要注意:异构架构的调度策略很关键。我曾经踩过一个坑——任务从大核切到小核时,缓存没清干净,导致数据错乱。后来加了硬件同步机制才解决。
- 同构:所有核心相同,调度简单,适合通用计算
- 异构:核心类型不同,能效比高,适合移动端和AI场景
3.2 缓存一致性协议:MESI的故事
多核架构最头疼的问题是什么?缓存一致性。你想想看,两个核心各自有L1缓存,都缓存了内存地址0x100的数据。核心A改了数据,核心B不知道,还在用旧值——这不就出乱子了?
MESI协议就是解决这个问题的。它给每个缓存行打了四个标签:
| 状态 | 含义 | 我遇到的实际场景 |
|---|---|---|
| M (Modified) | 已修改,数据只在本核心缓存中有效 | 核心A写数据后,其他核心必须失效 |
| E (Exclusive) | 独占,只有本核心有这份数据 | 刚加载数据,还没人改过 |
| S (Shared) | 共享,多个核心都有这份数据 | 多个核心同时读同一变量 |
| I (Invalid) | 失效,数据已过时 | 其他核心改了数据,本核心必须重新加载 |
MESI的工作原理其实不复杂。核心A要写数据时,先发一个"我要独占"的信号。其他核心收到后,如果自己有这份数据,就标记为I(失效)。核心A写完后标记为M。其他核心要读时,核心A把数据写回内存,大家再一起读,状态变成S。
我曾经调试过一个bug:两个核心同时修改同一个变量,MESI协议虽然保证了缓存一致性,但没保证原子性。结果变量值被覆盖了。嗯,这里要提醒大家:MESI只管缓存,不管指令重排和原子操作。多核编程时还得用锁或原子指令。
3.3 内存模型:UMA与NUMA
内存模型决定了核心怎么访问内存。说白了就是:所有核心访问内存的代价是否一样?
UMA(统一内存访问):所有核心通过同一个总线访问内存,延迟相同。我最早做的多核DSP芯片就是UMA架构,4个核心共享一个DDR控制器。好处是编程简单,坏处是带宽瓶颈——核心多了总线就撑不住。
NUMA(非统一内存访问):每个核心有自己的本地内存,访问本地内存快,访问远程内存慢。我在做服务器芯片时用过NUMA,32个核心分成4个节点,每个节点有自己的内存控制器。
为什么会这样?因为物理限制。核心越多,总线竞争越激烈。NUMA把核心分组,每组有自己的内存,减少了总线压力。但代价是编程复杂度——你得考虑数据放在哪个节点的内存里。
我举个例子:在NUMA架构下,核心0访问本地内存延迟是100ns,访问核心1的远程内存延迟是300ns。如果你把线程绑在核心0上,但数据分配在核心1的内存里,性能直接打三折。
| 特性 | UMA | NUMA |
|---|---|---|
| 访问延迟 | 所有核心相同 | 本地快,远程慢 |
| 扩展性 | 差(8核以上瓶颈明显) | 好(可扩展到上百核) |
| 编程难度 | 低 | 高(需要数据亲和性优化) |
| 典型应用 | 嵌入式、移动端 | 服务器、高性能计算 |
3.4 知识体系总览
说了这么多,咱们用一张图来总结本章的核心逻辑:
这张图把本章的三个核心知识点串起来了。你想想看,设计多核芯片时,先选同构还是异构,再定缓存一致性方案,最后考虑内存模型。这三者相互影响,不能孤立看待。
我个人习惯是:先确定应用场景。如果是移动端AI推理,异构+NUMA是首选;如果是服务器通用计算,同构+UMA更省心。当然,实际项目往往更复杂,需要权衡功耗、面积、性能等多个维度。
好了,多核架构入门就讲到这里。记住一句话:没有最好的架构,只有最合适的架构。下次咱们聊聊多核编程模型,到时候会用到今天讲的知识。
公众号:蓝海资料掘金营,微信deep3321