1. 课程导入

各位同学,咱们今天聊聊多核系统。说实话,我刚入行那会儿,芯片设计的主流还是单核。那时候大家比的是谁的主频更高、流水线更深。但后来,功耗墙和指令级并行瓶颈把这条路堵死了。你想想看,频率往上提一档,功耗翻着跟头涨,散热成本根本扛不住。

于是行业转向了多核。这不是什么高深的理论,说白了就是:一个核跑不动,那就上两个、四个、八个。我在2010年左右参与过一个4核应用处理器项目,当时觉得4核已经够奢侈了。现在回头看,16核、64核甚至上百核的系统都不稀奇。

核心驱动力: 功耗墙 + 指令级并行瓶颈 → 转向多核并行架构

1.1 单核到多核的演进路线

演进过程大致分三个阶段:

  1. 单核极致优化期:深流水线、超标量、乱序执行。我做过一个7级流水线的设计,那时候觉得10级就是天花板了。结果Intel搞了31级流水线的NetBurst,功耗直接爆炸。
  2. 同构多核期:把多个相同核放在一颗芯片上,共享内存。ARM的big.LITTLE算是个变种,但本质上还是同构思路的延伸。
  3. 异构多核期:CPU + GPU + NPU + DSP,各司其职。RISC-V在这块有天然优势——指令集可扩展,想加什么加速器都行。

嗯,这里要注意:多核不是简单的核数叠加。缓存一致性、互联带宽、内存访问冲突,这些才是真正的坑。我曾经在一个项目里,8个核跑起来,性能还不如4个核——因为缓存一致性协议没调好,大部分时间都花在无效化缓存行上了。

1.2 多核系统的分类:SMP vs AMP

多核系统按架构分两大类。我直接给你画个对比表,一目了然:

特性 SMP(对称多处理) AMP(非对称多处理)
操作系统 单一OS实例管理所有核 每个核可运行不同OS或裸机
内存视图 统一共享内存空间 每个核有私有内存或分区
核间关系 对等,任务可任意调度 主从或分工明确
缓存一致性 硬件自动维护 通常软件管理或不需要
典型场景 服务器、手机AP 嵌入式、实时控制
设计复杂度 高(一致性协议复杂) 低(但软件负担重)

SMP 是咱们这门课的重点。为什么?因为缓存一致性协议在SMP里是刚需。你想想看,两个核同时读写同一个内存地址,如果没有硬件一致性,数据就乱套了。

AMP 呢?我做过一个AMP系统,一个核跑Linux做管理,另一个核跑裸机做实时控制。两个核之间通过共享邮箱通信,根本不需要缓存一致性——因为每个核只访问自己的私有内存。简单粗暴,但有效。

我的建议: 如果做消费类产品(手机、平板),选SMP;如果做工业控制或IoT,AMP往往更省事。别为了用一致性而用一致性。

1.3 RISC-V多核架构简介

RISC-V的多核架构,我个人的理解是:它把选择权交给了你。不像ARM那样给你一套固定的互联方案,RISC-V只定义指令集和一致性接口,具体怎么连、用什么协议,你自己定。

来看一个典型的RISC-V多核系统框图:

RISC-V多核系统架构图 RISC-V 多核系统典型架构 RISC-V Core 0 L1 I/D Cache RISC-V Core 1 L1 I/D Cache RISC-V Core 2 L1 I/D Cache RISC-V Core 3 L1 I/D Cache 缓存一致性互联总线(TileLink / ACE / CHI) L2 共享缓存(可选) Snoop Filter / Directory DDR 内存控制器 UART / SPI / I2C DMA / 中断控制器 说明:RISC-V 核心通过一致性互联总线访问共享L2缓存和内存,外设通过独立总线接入

这个图里,四个RISC-V核各自有私有的L1指令和数据缓存。它们通过一条一致性互联总线连接起来。这条总线就是咱们这门课的核心——它负责维护所有核看到的内存视图一致。

RISC-V社区主推的一致性协议是TileLink,它定义了五种操作模式(从最简单的TL-UL到最复杂的TL-C)。我个人比较喜欢TL-C,因为它支持缓存一致性,而且协议清晰,不像ACE那么绕。

避坑提醒: 我曾经在一个项目里直接用TL-UL搭多核系统,结果发现核间数据同步全靠软件刷缓存,性能惨不忍睹。后来换成TL-C,硬件自动维护一致性,代码量直接砍掉一半。所以,如果做SMP,别省一致性协议的功夫。

1.4 RISC-V多核的关键组件

一个完整的RISC-V多核系统,离不开这几个东西:

  • RISC-V核心:支持M/S/U特权级,至少要有S模式才能跑Linux。我建议用RV64GC,通用性最好。
  • 缓存层次:L1分指令和数据,L2可选共享。缓存行大小通常是64字节,和一致性协议粒度对齐。
  • 一致性互联:TileLink或自定义总线。这里要注意,互联的带宽直接决定多核扩展性。我见过一个设计,互联只给了32位宽,4个核抢带宽抢到死。
  • 中断控制器:PLIC(平台级中断控制器)和CLINT(核间中断)。核间中断(IPI)是多核调度的基础。
  • 内存控制器:DDR4/5或HBM。多核系统对内存带宽要求高,建议至少双通道。
经验之谈: 刚开始做多核设计时,别贪多。先搭2核系统跑通一致性协议,验证没问题了再往上加核。我见过有人一上来就搞16核,结果调试一致性bug调了三个月。