1. 课程导入
各位同学,咱们今天聊聊多核系统。说实话,我刚入行那会儿,芯片设计的主流还是单核。那时候大家比的是谁的主频更高、流水线更深。但后来,功耗墙和指令级并行瓶颈把这条路堵死了。你想想看,频率往上提一档,功耗翻着跟头涨,散热成本根本扛不住。
于是行业转向了多核。这不是什么高深的理论,说白了就是:一个核跑不动,那就上两个、四个、八个。我在2010年左右参与过一个4核应用处理器项目,当时觉得4核已经够奢侈了。现在回头看,16核、64核甚至上百核的系统都不稀奇。
1.1 单核到多核的演进路线
演进过程大致分三个阶段:
- 单核极致优化期:深流水线、超标量、乱序执行。我做过一个7级流水线的设计,那时候觉得10级就是天花板了。结果Intel搞了31级流水线的NetBurst,功耗直接爆炸。
- 同构多核期:把多个相同核放在一颗芯片上,共享内存。ARM的big.LITTLE算是个变种,但本质上还是同构思路的延伸。
- 异构多核期:CPU + GPU + NPU + DSP,各司其职。RISC-V在这块有天然优势——指令集可扩展,想加什么加速器都行。
嗯,这里要注意:多核不是简单的核数叠加。缓存一致性、互联带宽、内存访问冲突,这些才是真正的坑。我曾经在一个项目里,8个核跑起来,性能还不如4个核——因为缓存一致性协议没调好,大部分时间都花在无效化缓存行上了。
1.2 多核系统的分类:SMP vs AMP
多核系统按架构分两大类。我直接给你画个对比表,一目了然:
| 特性 | SMP(对称多处理) | AMP(非对称多处理) |
|---|---|---|
| 操作系统 | 单一OS实例管理所有核 | 每个核可运行不同OS或裸机 |
| 内存视图 | 统一共享内存空间 | 每个核有私有内存或分区 |
| 核间关系 | 对等,任务可任意调度 | 主从或分工明确 |
| 缓存一致性 | 硬件自动维护 | 通常软件管理或不需要 |
| 典型场景 | 服务器、手机AP | 嵌入式、实时控制 |
| 设计复杂度 | 高(一致性协议复杂) | 低(但软件负担重) |
SMP 是咱们这门课的重点。为什么?因为缓存一致性协议在SMP里是刚需。你想想看,两个核同时读写同一个内存地址,如果没有硬件一致性,数据就乱套了。
AMP 呢?我做过一个AMP系统,一个核跑Linux做管理,另一个核跑裸机做实时控制。两个核之间通过共享邮箱通信,根本不需要缓存一致性——因为每个核只访问自己的私有内存。简单粗暴,但有效。
1.3 RISC-V多核架构简介
RISC-V的多核架构,我个人的理解是:它把选择权交给了你。不像ARM那样给你一套固定的互联方案,RISC-V只定义指令集和一致性接口,具体怎么连、用什么协议,你自己定。
来看一个典型的RISC-V多核系统框图:
这个图里,四个RISC-V核各自有私有的L1指令和数据缓存。它们通过一条一致性互联总线连接起来。这条总线就是咱们这门课的核心——它负责维护所有核看到的内存视图一致。
RISC-V社区主推的一致性协议是TileLink,它定义了五种操作模式(从最简单的TL-UL到最复杂的TL-C)。我个人比较喜欢TL-C,因为它支持缓存一致性,而且协议清晰,不像ACE那么绕。
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。多核系统对内存带宽要求高,建议至少双通道。