第二章 CMN拓扑结构:Mesh网络拓扑、HN-F/HN-I/SN-F节点详解、XP点与路由

好,咱们进入正题。CMN这个东西,说白了就是ARM给多核芯片搭的一个“立交桥”。你想想看,十几个甚至几十个核要同时访问内存,没有一套好的拓扑结构,那不得堵死?今天我就把CMN的骨架给你拆开看看。

2.1 Mesh网络拓扑——为什么是网格?

CMN用的是二维Mesh网络。什么叫Mesh?就是横着竖着拉一堆线,交叉点放路由节点。每个节点只跟上下左右四个邻居通信。

我刚开始接触CMN时,第一反应是:为什么不用环形总线?后来在项目中踩过坑才明白——Mesh的扩展性太好了。你加一个CPU簇,只需要在Mesh边上多挂一排节点就行,带宽几乎线性增长。

核心优势:

  • 局部性:两个核离得近,数据走几步就到了,延迟低
  • 可扩展:从4核到128核,Mesh规模跟着变,架构不用大改
  • 带宽高:多条路径可以同时传数据,不像总线那样抢来抢去

但Mesh也有代价。我记得第一次调一个16核的片子,发现跨芯片两端的通信延迟高得离谱。后来一查,数据包在Mesh里绕了七八跳。嗯,这就是Mesh的“跳数”问题——距离越远,延迟越大。

下面这张图是我手绘的Mesh拓扑示意,你感受一下:

CMN Mesh网络拓扑示意 XP XP XP XP XP XP HN-F HN-I SN-F XP XP XP XP XP XP XP XP XP XP XP XP点 HN-F HN-I SN-F

2.2 HN-F / HN-I / SN-F 节点详解

Mesh里跑的不是裸数据,而是各种“节点”。每个节点各司其职。我按自己的理解给你捋一遍:

2.2.1 HN-F(Home Node - Fully Coherent)

HN-F是缓存一致性的大管家。它管着一块内存地址范围,所有对这个地址范围的访问,都得经过它来协调。

说白了,HN-F就是“仲裁员”。两个核同时写同一个地址,谁先谁后?HN-F说了算。它维护着目录信息,知道每个缓存行在哪个核手里,是脏的还是干净的。

我的经验:调试缓存一致性bug是最头疼的。有一次发现两个核读同一个变量,结果值不一样。查了三天,最后发现是HN-F的目录表项被踩了。从那以后,我每次流片前都会跑一遍一致性压力测试。

HN-F的关键参数:

参数 说明 典型值
目录深度 能跟踪多少个缓存行 4K-64K entry
监听端口数 同时处理多少个监听请求 4-8
延迟 从收到请求到发出响应 10-20 cycle

2.2.2 HN-I(Home Node - I/O Coherent)

HN-I跟HN-F有点像,但它是管I/O设备的。比如网卡、GPU、SSD这些设备要访问内存,就得通过HN-I。

为什么I/O要单独搞一个节点?因为I/O设备的访问模式跟CPU不一样。CPU有缓存,I/O设备通常没有。HN-I不需要维护完整的缓存一致性协议,它只需要保证I/O访问的正确顺序。

我记得有一次调一个PCIe网卡,数据总是丢包。最后发现是HN-I的写缓冲满了,网卡发完数据以为写完了,实际上还在缓冲里排队。嗯,这个坑后来成了我们团队的经典案例。

2.2.3 SN-F(Slave Node - Fully Coherent)

SN-F是连接内存控制器的节点。它负责把Mesh里的请求转发到DDR控制器,再把数据拿回来。

SN-F不参与一致性协议,它就是个“翻译官”。把Mesh协议翻译成内存控制器能懂的协议。但别小看它,SN-F的调度策略直接影响内存带宽利用率。

注意:SN-F的buffer深度要跟内存控制器的队列深度匹配。我曾经见过一个设计,SN-F的buffer只有4个entry,但DDR控制器有32个队列。结果SN-F成了瓶颈,内存带宽利用率不到50%。

2.3 XP点与路由

XP点,全称是Crosspoint。它是Mesh网络里的“路由器”。每个XP点有5个端口——东、南、西、北四个方向,加上一个本地端口连到CPU簇或I/O设备。

XP点的路由算法很简单:先X方向走,再Y方向走。这叫“维序路由”。为什么这么设计?因为不会产生死锁。你想想看,如果允许随便拐弯,两个包可能互相堵死。

我建议你在调试时重点关注XP点的拥塞情况。怎么查?看XP点的计数器:

// 伪代码:读取XP点状态寄存器
uint32_t xp_status = read_reg(XP_BASE + 0x100);
uint32_t stall_cycles = (xp_status >> 8) & 0xFF;  // 停顿周期数
uint32_t buffer_occupancy = xp_status & 0xFF;     // 缓冲占用率

if (stall_cycles > 100) {
    printf("XP点拥塞严重!检查路由路径\n");
}

我曾经在一个128核的芯片上,发现某个XP点的停顿周期数高达500。一查,原来是那个点连接了四个CPU簇,流量太大了。后来我们调整了地址映射,把部分流量分散到相邻的XP点,问题就解决了。

2.4 路由路径选择——实际项目中的考量

路由不是随便选的。我总结了几条原则:

  • 就近原则:CPU尽量访问离它近的内存控制器。这需要你在系统初始化时配置好地址映射表。
  • 负载均衡:别让某个XP点或HN-F成为热点。我习惯用性能计数器监控每个节点的流量。
  • 延迟敏感:实时任务的数据路径要尽量短。比如音频DMA,我会把它放在离SN-F最近的位置。

避坑指南:我曾经遇到过一个性能问题——跑AI推理时,带宽死活上不去。查了半个月,最后发现是路由配置错了。两个CPU簇的地址映射到了同一个SN-F上,另一个SN-F闲着没事干。改完配置,带宽直接翻倍。

好了,CMN的拓扑结构就讲到这里。Mesh网络、三种节点、XP路由,这些是理解CMN的基础。下一节我们会深入CHI协议,看看数据包在Mesh里到底是怎么跑的。


公众号:蓝海资料掘金营,微信deep3321