一、CMN概述:从总线到网络的演进
大家好,我是老张。做芯片架构十几年了,今天咱们聊聊CMN。
CMN,全称Coherent Mesh Network。翻译过来就是「一致性网格网络」。名字挺长,但核心就三个字——一致性。
说白了,它就是ARM体系里用来解决多核、多芯片之间数据同步问题的互联方案。你想想看,一个SoC里十几个核,每个核都有自己的Cache。如果核A改了某个数据,核B怎么知道?这就是CMN要干的事。
1.1 CMN的起源:为什么会有这个东西?
早年间,ARM的互联方案叫AMBA总线。AMBA 3时代,大家用AHB、APB。到了AMBA 4,引入了ACE协议,开始支持一致性。但总线结构有个硬伤——带宽瓶颈。
我记得2015年做过一个16核的服务器芯片。用ACE总线,结果跑到8核以上,总线就堵死了。数据包排队,延迟飙升。那叫一个头疼。
后来ARM推出了AMBA 5 CHI协议,同时带来了CMN这个物理拓扑。CMN把总线换成了网格(Mesh)结构。每个节点只跟邻居通信,数据走最短路径。这样一来,带宽不再是瓶颈。
核心变化:从「共享总线」到「点对点网格」。总线是单车道,网格是立交桥。
1.2 CMN在ARM架构中的地位
在ARM的生态里,CMN是基础设施级的存在。它连接着CPU、GPU、DSP、内存控制器、PCIe控制器……所有需要共享数据的主模块。
我习惯把ARM SoC分成三层:
- 计算层:CPU、GPU、NPU等
- 互联层:CMN(负责数据搬运和一致性)
- 存储层:DDR、HBM、L3 Cache等
CMN就是中间那层。没有它,上层计算单元就是孤岛。你想想看,一个8核CPU,如果核0改了数据,核7还在用旧数据,那程序跑出来全是错的。
个人经验:我在做某款AI芯片时,一开始没重视CMN的配置。结果NPU和CPU之间数据不同步,推理结果时对时错。查了三天,最后发现是CMN的snoop filter没配好。嗯,从那以后,我每次做架构都先把CMN的配置表画清楚。
1.3 CMN与ACE/AXI协议的关系
这里容易搞混。我简单梳理一下:
| 协议/组件 | 作用 | 关系 |
|---|---|---|
| AXI | 点对点数据传输协议 | CMN内部节点间用AXI/CHI通信 |
| ACE | 带一致性的AXI扩展 | CMN对外接口兼容ACE |
| CHI | AMBA 5新协议,更高性能 | CMN-600及以上版本原生支持 |
| CMN | 物理拓扑+一致性管理 | 承载上述协议的硬件实现 |
说白了,AXI是路,ACE是交通规则,CMN是立交桥。它们不是替代关系,而是不同层次的东西。
我曾经遇到一个客户,问「CMN和ACE哪个好?」。这就像问「高速公路和交通规则哪个好」一样,没法比。CMN用ACE协议,也可以用CHI协议。CMN-600之后,我建议直接用CHI,延迟更低,带宽更高。
1.4 CMN的核心组件
一个典型的CMN系统包含这些角色:
- RN(Request Node):请求节点,比如CPU核、GPU。它发出读写请求。
- HN(Home Node):归属节点,负责管理某段内存地址的一致性。每个地址范围对应一个HN。
- SN(Slave Node):从节点,比如DDR控制器、PCIe控制器。它响应请求。
- MN(Miscellaneous Node):杂项节点,处理中断、调试等。
这些节点通过Mesh互联连接。每个节点只跟上下左右四个邻居通信。数据包在网格里一跳一跳地走。
避坑指南:我曾经在配置HN数量时犯过错误。HN太少,单个HN负载过高,延迟飙升。HN太多,snoop广播开销大。经验值是:每个HN管理的内存范围不超过4MB,对于DDR场景,HN数量 = 总内存 / 4MB。当然,具体要看你的访存模式。
1.5 一张图看懂CMN
下面我画了一张CMN的拓扑结构图。你看完就明白了:
你看,RN在上层发起请求,HN在中间做一致性管理,SN在下层响应。MN处理杂项事务。所有节点通过Mesh网格互联,数据可以横向或纵向传输。
1.6 小结
CMN不是什么神秘的东西。它就是ARM为了解决多核一致性而设计的互联架构。从ACE总线到CMN网格,本质上是从共享到分布的转变。
我个人觉得,理解CMN的关键就三点:
- 它是个网络,不是总线。节点间点对点通信。
- 它管一致性,保证所有核看到的数据是一样的。
- 它用CHI/ACE协议,但协议和拓扑是两回事。
嗯,这一章就到这里。下一章咱们聊聊CMN的地址映射和路由机制——说白了就是数据包在网格里怎么走。
公众号:蓝海资料掘金营,微信deep3321