1、CMN概述:什么是CMN?为什么需要一致性?CMN在SoC中的位置
1.1 从一次流片失败说起
先讲个故事。我入行第三年,参与了一款手机SoC的设计。团队花了18个月,流片回来,跑Linux没问题,一跑多核Android游戏就死机。查了三个月,最后定位到——CPU和GPU之间缓存数据不一致。
CPU改了内存里的一个纹理数据,GPU不知道,直接用了自己L2 cache里的旧数据。画面撕裂、程序崩溃。嗯,这就是典型的一致性问题。
从那以后,我深刻理解了:没有一致性,多核SoC就是一堆各自为政的孤岛。
1.2 什么是CMN?
CMN,全称是Coherent Mesh Network,一致性网格网络。它是ARM公司推出的一套片上互连方案。
说白了,CMN就是SoC里所有主设备(CPU、GPU、DSP、NPU)之间的数据高速公路。但它不只是路,它还负责保证:
- 所有主设备看到的内存数据是同一份
- 谁改了数据,其他人能及时知道
- 数据在cache和内存之间不乱窜
核心要点: CMN不是简单的总线,而是一个带一致性协议的互连网络。它实现了硬件层面的缓存一致性,让软件开发者不用操心数据同步问题。
1.3 为什么需要一致性?
你想想看,现代SoC里有多少个处理器核心?
- 8个CPU核心(大小核架构)
- 1个GPU(几百个着色器核心)
- 1个NPU(神经网络处理器)
- 1个DSP(数字信号处理器)
每个处理器都有自己的cache。CPU改了数据,数据留在L1 cache里。GPU去读内存,读到的还是旧数据。这不就乱套了吗?
我在项目中遇到过最典型的场景:CPU写了一个共享变量,DSP读到的却是旧值。调试了整整一周,最后发现是DMA绕过了一致性协议直接访问内存。
避坑指南: 我曾经在配置CMN时,忘记给某个加速器开启snoop filter功能。结果这个加速器读到的数据永远是过时的。排查了三天,最后发现是HN-F(Home Node Filter)的配置位没置1。这种低级错误,新手特别容易犯。
1.4 CMN在SoC中的位置
CMN位于SoC的中心位置。它连接着:
- 计算域:CPU集群、GPU、NPU
- 内存域:DDR控制器、HBM控制器
- I/O域:PCIe控制器、USB控制器、Ethernet
- 系统域:调试接口、性能监控单元
我习惯把CMN比作一个十字路口。所有数据流量都要经过它,它负责调度、路由、一致性维护。
下面这张图展示了CMN在典型SoC中的位置:
1.5 CMN的核心组件
CMN不是一块铁板,它由多个组件构成。我挑几个最重要的说:
| 组件 | 全称 | 功能 |
|---|---|---|
| RN-F | Request Node - Full | 完全一致性请求节点,CPU集群通过它接入CMN |
| RN-I | Request Node - I/O | I/O一致性请求节点,PCIe等外设通过它接入 |
| HN-F | Home Node - Full | 全功能归属节点,负责目录维护和snoop过滤 |
| SN-F | Subordinate Node - Full | 从属节点,连接DDR控制器等从设备 |
| XP | Crosspoint | 交叉点,负责数据包的路由和转发 |
个人经验: 配置CMN时,HN-F的数量和位置很关键。我习惯把HN-F放在靠近DDR控制器的位置,这样可以减少数据路径的跳数。曾经有个项目,HN-F放得太远,导致内存访问延迟增加了30%。
1.6 一致性协议:MESI的变种
CMN使用的一致性协议是MESI协议的变种,叫做MOESI。多了一个O(Owned)状态。
为什么会这样?
MESI协议里,如果多个CPU共享一份数据,其中一个CPU要修改,必须先把其他CPU的cache line invalidate掉。这个过程会产生大量的snoop广播。
MOESI协议增加了Owned状态:
- 拥有Owned状态的CPU可以直接响应其他CPU的读请求
- 不需要每次都去内存拿数据
- 减少了内存访问次数,降低了延迟
我在项目中遇到过一个问题:某个加速器频繁读写共享数据,导致CMN的snoop traffic暴涨。后来把加速器配置成RN-I(I/O一致性节点),只做简单的监听,不做完整的一致性维护,问题就解决了。
1.7 为什么选择CMN而不是总线?
传统的总线架构(如AXI总线)有什么问题?
- 带宽瓶颈:所有设备共享一条总线,带宽有限
- 延迟不可控:设备越多,仲裁越复杂,延迟越大
- 一致性难做:总线没有内置的一致性协议,需要软件维护
CMN采用网格拓扑,每个节点都有独立的路径。数据可以从CPU直接走到DDR,不需要经过其他设备。这就好比:
- 总线 = 单车道公路,所有车挤在一起
- CMN = 城市路网,每个路口都有立交桥
关键区别: CMN的带宽是可扩展的。增加一个CPU集群,只需要增加一个RN-F节点和相应的网格链路。总线架构增加一个主设备,所有设备的带宽都会被稀释。
1.8 实际项目中的CMN配置
拿我最近参与的一个手机SoC项目举例:
- 8核CPU:1个X4超大核 + 3个A720大核 + 4个A520小核
- GPU:Immortalis-G720,10核
- NPU:自研架构,4核
- DDR:LPDDR5X,4通道
CMN配置如下:
- 4个RN-F:CPU集群分两组,每组一个RN-F
- 2个RN-I:GPU和NPU各一个
- 4个HN-F:每个DDR通道对应一个
- 8个XP:组成4x4的网格
这个配置下,CPU到DDR的延迟控制在40ns以内,带宽达到200GB/s以上。嗯,这个数据是我亲自用PMU测出来的。
1.9 小结
CMN是当代高性能SoC的数据中枢。它解决了三个核心问题:
- 互联:让所有主设备能高效通信
- 一致性:保证所有设备看到的数据是统一的
- 可扩展:增加设备不影响已有设备的性能
我个人觉得,理解CMN的关键不在于记住那些组件名称,而在于理解数据是怎么流动的,以及一致性是怎么维护的。后面的章节,我会一步步拆解这些细节。
学习建议: 刚开始接触CMN时,不要试图一次性搞懂所有细节。先画一张SoC的框图,标出CMN的位置和主要连接。然后问自己三个问题:数据从哪里来?到哪里去?怎么保证不出错?想清楚这三个问题,你就入门了。
公众号:蓝海资料掘金营,微信deep3321