2. EPYC处理器架构深度解析

理解EPYC的架构,是设计企业服务器集群节点的起点。因为集群节点的CPU选型、内存容量规划、PCIe设备布局、NUMA亲和性策略,最终都受制于处理器内部的分层结构。本节从Zen微架构演进讲起,逐层拆解Chiplet封装、CCD/CCX/IOD的组成关系,再落到内存控制器与PCIe通道的分布规律,最后说明这些结构如何直接决定集群节点的设计边界。

一、Zen微架构演进:从Zen到Zen 5

EPYC的每一代都建立在对应的Zen核心之上。Zen 1(2017)是AMD重返服务器市场的起点,单核IPC相比上一代推土机架构大幅提升,并首次引入SMT同步多线程。Zen 2(2019)是关键转折:引入Chiplet设计,把计算核心与I/O分离,同时把L3缓存容量翻倍,IPC提升约15%。Zen 3(2021)改变了CCX内部结构,把8个核心与32MB L3缓存放在同一个共享域内,消除了跨CCX访问L3的延迟,IPC再提升约19%。Zen 4(2022)支持AVX-512、DDR5和PCIe 5.0,单核性能与能效继续提升。Zen 5(2024)进一步加宽前端与执行单元,并针对AI与向量负载优化。

对集群设计而言,代际差异不只是“快慢”,而是决定了节点能承载的负载类型:Zen 3之后单CCX 8核共享L3,使8核以内的进程组能获得稳定的缓存命中;Zen 4/5的AVX-512与DDR5则直接影响HPC和内存密集型任务的节点配置。

二、Chiplet设计:计算与I/O的解耦

Chiplet是EPYC架构的核心思想。传统单片式设计把CPU核心、内存控制器、PCIe控制器全部做在一颗大芯片上,良率随面积增大而下降。EPYC把功能拆成两类小芯片:负责计算的CCD(Core Chiplet Die)和负责I/O的IOD(I/O Die)。CCD用先进制程(如5nm)制造,IOD用成熟制程(如6nm或7nm)制造,各自按最优成本与良率生产,再通过封装内的互连总线拼接成一颗完整的处理器。

这种解耦带来两个直接后果:一是核心数可以灵活扩展,通过堆叠不同数量的CCD得到不同SKU;二是I/O能力集中由IOD提供,所有内存和PCIe通道都从IOD引出,CCD本身不直接连接内存。理解这一点,是理解后面NUMA与延迟差异的前提。

EPYC Chiplet 封装结构:CCD / CCX / IOD 与内存、PCIe 引出关系 处理器封装(Socket SP5 / SP6) CCD 0(5nm) CCX 0 8 × Zen 核心 32MB 共享 L3 (Zen 3 起单 CCX 8 核) CCD 1(5nm) CCX 1 8 × Zen 核心 32MB 共享 L3 (可扩展至 12 CCD) … CCD 2 ~ N IOD(6nm) 内存控制器 × 12 通道 DDR5 PCIe 5.0 × 128 通道 Infinity Fabric DDR5 DIMM 通道 12 通道 / 每通道 1 DIMM PCIe 5.0 设备 GPU / NVMe / 网卡 计算小芯片 CCD I/O 小芯片 IOD 内存通道 PCIe 通道

三、CCD、CCX与IOD的层级关系

把上面的结构再拆细一层:一颗CCD内部包含一个或多个CCX(Core Complex),CCX是共享L3缓存的核心簇。Zen 3之前,一个CCX是4核共享16MB L3;Zen 3及以后,一个CCX扩展到8核共享32MB L3。因此,在Zen 3/4/5的EPYC上,一个CCD通常就是一个CCX(8核+32MB L3),CCD与CCX在数量上基本一一对应。

IOD则是所有CCD的公共出口。它内部集成内存控制器、PCIe控制器、Infinity Fabric交换网络以及安全处理器(PSP)。CCD通过Infinity Fabric挂到IOD上,任何跨CCD的通信、任何对内存的访问,都必须经过IOD。这就解释了为什么EPYC存在“同CCX内延迟最低、跨CCD延迟更高”的层级差异——延迟不是均匀的,而是由物理拓扑决定的。

四、内存控制器与PCIe通道分布

以当前主流的EPYC 9004/9005(SP5平台)为例,IOD提供12个DDR5内存通道,支持每通道1个DIMM(1DPC),典型配置为12×64GB=768GB,若使用更高容量RDIMM可到3TB以上。12个通道被划分为若干NUMA域:在NPS1模式下,整颗CPU呈现为单一NUMA节点;NPS4模式下则划分为4个NUMA节点,每个节点对应3个内存通道。NPS设置直接改变内存访问延迟与带宽分布,是集群节点调优的重要参数。

PCIe方面,SP5平台提供128条PCIe 5.0通道,通常分配为:128条用于通用I/O(GPU、NVMe、网卡),另有部分通道用于CPU间互连(Socket-to-Socket,如双路配置)。这些通道全部从IOD引出,因此PCIe设备的物理位置与内存通道的NUMA归属存在对应关系——插在某组PCIe插槽上的GPU,其最近的内存节点是固定的。集群节点做GPU直连或NVMe直连时,必须按这个对应关系规划设备与内存的绑定。

五、对集群节点设计的实际影响

这些结构落到集群节点设计上,主要体现在四个方面。

第一,NUMA亲和性。单路EPYC在NPS4下呈现4个NUMA节点,进程若跨节点访问内存,延迟可增加数十纳秒。集群调度器(如Slurm、Kubernetes)需要感知NUMA拓扑,把进程绑定到与其内存同域的CPU核心上。例如在Slurm中可用--cpu-bind=cores --mem-bind=local,让任务优先使用本地内存。

第二,内存容量与通道规划。12通道意味着满配12条DIMM才能获得完整带宽。若只插6条,带宽减半。集群节点若面向内存带宽敏感型负载(如CFD、内存数据库),应按通道对称插满,而不是只追求总容量。

第三,PCIe设备布局。GPU服务器节点中,8块GPU通常通过PCIe Switch或直接分配到不同IOD分区。由于PCIe通道从IOD引出,GPU与最近NUMA节点的对应关系决定了GPU Direct RDMA和NVLink之外的PCIe路径效率。规划时应把GPU、NVMe、网卡按NUMA域分组,避免跨域流量。

第四,CCX边界与缓存局部性。对于8核以内的任务,尽量让进程组落在同一个CCX内,共享32MB L3;超过8核的任务则不可避免跨CCX,此时应关注IOD互连带宽是否成为瓶颈。集群作业提交时,可通过numactl --cpunodebind或cgroup cpuset把作业限制在单个CCX对应的核心集合内。

在双路EPYC节点中,两颗CPU通过Infinity Fabric互连,跨Socket访问内存的延迟显著高于本地。集群设计时应尽量让单个任务在单Socket内完成;若必须跨Socket,应评估互连带宽与延迟是否满足SLA。

总结来看,EPYC的Chiplet分层结构决定了集群节点不是一块“均匀的计算资源”,而是一个有层级、有远近、有带宽差异的拓扑体。节点设计的关键,就是让任务的数据流、内存流和I/O流尽量落在同一层级内,减少跨CCD、跨NUMA、跨Socket的访问。理解CCD/CCX/IOD的物理关系,是后续做节点选型、NUMA调优和PCIe布局的基础。