在任何芯片设计中,天使和魔鬼都在细节之中。AMD 过去对皓龙处理器(Opteron)做出的一些架构选择让它备受煎熬,关于代码如何利用硬件的假设并没有按计划实现。老款皓龙处理器(Opteron)处理器最初的设计非常出色,但公司似乎有意避免在后续产品上犯同样的错误,比如第二代霄龙(Epyc)服务器芯片。

 

 

时间和客户将会告诉我们答案,但这一衍生产品的优势在于,它采用了经过大幅改进的多芯片设计,核心采用了更先进的蚀刻工艺,似乎正以它在最需要的时候想要的东西,准确地打入服务器市场。这对霄龙(Epyc)芯片的发展来说是个好的开始,它将取代英特尔目前和未来的至强(Xeon)芯片。

 

我们一直渴望了解新的“罗马”霄龙(Epyc)服务器芯片的架构细节,我们在上周的发布会上介绍了基本的概况、速度、插槽、功率和定价。现在,让我们和 Mike Clark 一起深入了解罗马处理器的架构细节,Mike Clark 是 Zen 核架构的研发主力,同时也是 AMD 的企业院士(Corporate Fellow)。从很多方面来说,拥有 Zen 2 核和混合处理多芯片模块设计的罗马处理器(Rome),是 AMD 两年前就希望能够布局的领域。相比之下,罗马处理器(Rome)现在越来越好,这一切都始于晶圆代工合作伙伴台积电在处理器核及其相关 L1 和 L2 缓存区域采用了 7nm 先进的的蚀刻工艺。

 

Clark 苦笑着说:"能在工艺技术领域处于领先地位是件好事。"他补充称,英特尔和 AMD 将在未来几年实现跨越式发展,因此这一胜利不会是永久性的,即便这是不可否认的,也是战略性的胜利。“这个 7nm 工艺带来了显著的改进。有趣的是,它使我们的晶体管密度提高了 2 倍,但是关于主频,实际上与台积电 TSMC 和及工具人员做了大量工作。通常,当你使用一项新技术时,主频会下降,你会失去 Vmax,需要一些时间才能使主频恢复到原来的水平。但是我们能够和他们一起创造一个非常好的 7nm 的主频并且保持同样的功率。当然,如果你从另一个角度来看晶体管,你可以在同样的性能水平上获得一半的功率。”

 

每个时钟或 IPC 指令也是罗马处理器(Rome)架构的重要组成部分。从几年前最后一次 Opterons 芯片使用的“Excavator”核心到“Naples”霄龙(Epyc)芯片使用的 Zen 1 核,AMD 能够在固定时钟的基础上将 IPC 增加 50%,这是一个巨大的飞跃。类似于 ARM 的“Ares” Neoverse 设计。ARM 实际上预计 IPC 将增加 60%,但公平地说,Excavator Opterons 和 Cortex-A72 芯片一开始在 IPC 方面都不是很强大——至少与英特尔的 Xeon 核无法相提并论。现在,AMD 和 ARM 正在迎头赶上,随着 Zen 2 内核在罗马处理器(Rome)上的使用,AMD 又增加了 15%的 IPC。英特尔新一代 IPC 的改进幅度在 5%到 10%之间,大约是平均水平的一半。

 

 

Clark 说,当 IPC 上升时,芯片架构师通常要付出更高的功耗的代价,但是 Zen 2 核设计的目标是使其与 Naples 的 Zen 1 相比保持功率持平。事实证明,罗马处理器的工程师为此施加了压力,并且能够将核的功耗降低 10%,超过了通过微缩工艺从 Naples 的 14 纳米到用于 Zen 2 的 7 纳米的功耗。实现这一目标的主要方法之一是将核心中的操作缓存加倍,这有助于降低功耗并提高性能。

 

事实上,AMD 实际上把每个 Zen 2 核上的 L1 指令缓存从 64 KB 缩小到了 32 KB,并把晶体管的区域还给了 op 和分支预测单元,还用其中的一些增加了第三个地址生成单元。将 L1 数据与指令缓存(均为 32kb)的关联度提高一倍,达到 8 路,AMD 将浮点数据路径宽度加倍,然后将 L1 缓存带宽加倍,以跟上它的速度。(Clark 说,一个 64 KB 的 8 路关联 L1 缓存将占用太多的功率,而对于 64 核,这将是一个大问题。)L3 的缓存在每个小芯片(Chiplets)上加倍,达到 16MB/ pop,并且在封装上有两倍多的 chiplets,是 L3 缓存容量(256MB)的四倍,相当于 Naples 处理器的容量。它并不是把所有的东西都翻倍,但随着核数和 chiplet 翻倍,试图达到更好的平衡。这包括分支预测、指令获取和指令解码单元,如下图所示:

 

 

“我们喜欢能同时提高功率和性能,”Clark 解释道。“经常地走在正确的道路上是很重要的,因为最糟糕的功耗使用就是执行那些你正要扔掉的指令。”在我们动态地发现我们做错了之后,我们并没有扔掉进程。这肯定会在前端消耗更多的功耗,但在后端会带来好处。”

 

这就引出了 Zen 2 核心中的整数和浮点指令单元。

 

 

在整数方面,算术逻辑单元(ALU)计数在 4 处保持相同,但是 Zen 2 内核中的地址生成单元(AGU)计数增加了 1,总数为 3。ALUs 和 AGUs 的调度程序都得到了改进,寄存器文件和重新排序缓冲区的大小也得到了提高。并且针对 ALUs 和 AGUs,控制同时多线程(SMT)的算法的公平性也进行了调整,以处理 Zen 1 的设计中不平衡。

 

 

当然,英特尔四年前在“Knights Landing”Xeon Phi 处理器中实现了一个非常优雅的 512 位宽 AVX-512 矢量单元,并带来了它的一个变量 - 有人会说一个不太优雅的变量,因为它更难以由于它的实施方式而保持供给 - 对于“Skylake”Xeon SP 处理器而言,使用当前的“Cascade Lake”Xeon SP 芯片基本保持不变,除了能够在机器学习推理工作负载中消耗一半精度的指令之外。

 

Clark 表示 AMD 正在考虑在未来的霄龙(Epyc)芯片中使用 512 位向量,但此时并不相信只添加更宽的向量是消耗晶体管预算的最佳方法。首先,Clark 补充说仍有很多浮点例程不能与 512 位并行 - 有时甚至不能达到 256 位或 128 位 - 因此,在 Epyc 行中,在向量引擎上移动到 512 位是有意义的。我们认为,AMD 可能会成为一个快速的追随者,做类似于 DLBoost 机器学习推理指令的事情。也许该功能已经在框架中,等待在将来某个软件堆栈准备就绪时激活。

 

在 Zen 1 内核中,它有一对 128 位向量,执行 AVX-256 指令需要两个操作,但是 Zen 2 可以在一个时钟中运行 AVX-256 指令;这显然需要更少的能量。双精度乘法在 Zen 1 上花费了四个周期,而在 Zen 2 上只花费了三个周期,这提高了浮点单元的吞吐量和功率效率。(上面引用的 IPC 图用于整数指令,而不是浮点指令。)

 

至于为 Zen 2 内核供电的高速缓存,支持高速缓存的所有结构都更大,并提供更高的吞吐量,从而推动 IPC:

 

 

下面是 Zen 2 的 CPU 复杂度和缓存层次结构:

 

 

增加每个核心中的 L2 缓存和核心上的 L3 缓存是实现 Zen 2 核心中潜在 IPC 的关键,因为正如 Clark 正确地说的那样:“减少内存延迟的最佳方法是一开始就不去那里。“

 

加上这一切,你将 8 个 CPU 复合体以及 I / O 和内存集线器 - 总共 9 个芯片 - 放到封装上,制成一个顶级的罗马 Epyc。较低的仓库 SKU 在封装上具有较少的核心小芯片,有时在每个裸片上激活的核心较少,这就产生了罗马 Epyc 7002 系列芯片的广度,正如我们上周详述的那样。

 

这是拆除 Naples 和罗马的 MCMs,显然它们的结构非常不同:

 

 

使用 PCI-Express 的第二代 Infinity Fabric 变体进行了一些重要更改,这些变体分别用于将 Naples 和罗马插座中的小芯片相互链接。Naples 小芯片可以在一个时钟内对 Infinity Fabric 进行 16 字节读取和 16 字节写入 - 精细打印中的 FCLK 是结构时钟的缩写 - 而罗马芯片中的 Infinity Fabric 可以读取 32 字节和 16 每个结构时钟的字节写入。

 

虽然罗马芯片插入与 Naples 芯片相同的插槽,但元件在插座内部捆绑在一起的方式却截然不同。内存控制器从 CPU 复杂小芯片上移到中央集线器上,在 14 纳米工艺中蚀刻,其运行速度比在 7 纳米时更好,因为 I / O 和内存必须将信号从封装中推出并进入主板 DRAM 和 PCI-Express 外围设备插入的地方。这个集线器芯片共有 8 个 DDR4 内存控制器,总数与 Naples 综合体相同; 每个通道都支持一个 DIMM,每个控制器有两个通道,但罗马内存运行速度稍快 --3.2 GHz 对 2.67 GHz - 因此填充所有内存插槽时,每个插槽最大可产生 410 GB / 秒的峰值内存带宽。这比 Cascade Lake Xeon SP 处理器高 45%,该处理器有 6 个内存控制器,总运行频率为 282 GB / 秒,运行频率为 2.93 GHz,比 Naples 运行 2.67 GHz 的 340 GB / 秒高出 21% DRAM。(这些是双插槽服务器的评级。)

 

罗马 Epycs 的真正重大变化,以及将对许多不同工作负载的性能产生有益影响的变化,就是 NUMA 域在芯片中的创建方式以及 NUMA 跳数的减少 - 下图中的距离 - 这是从处理器复合体的一部分移动到另一部分所需的。看一看:

 

 

这基本上是一个 NUMA 服务器,该中心集线器是一个芯片组,使用非统一的内存访问技术将 chiplets(在这个类比中是插槽)连接到一个婴儿共享内存系统中,从而将缓存和主内存捆绑在一起。

 

使用 Naples 芯片,从任何一个裸片到另一个裸片有三种不同的距离,这就是内存挂起。有一个跳到两个相邻的芯片,有时两个跳到对角线对面,三个到第二个插座中的芯片在双插槽设置中。现在,有两个 NUMA 域,只有两个不同的距离。它是从一个小芯片通过中央集线器到连接到任何处理器的内存的一跳,然后另一个跳过 Infinity Fabric 到第二个中央集线器以及挂起它的内存。为了进一步简化问题,只有两个 NUMA 域 - 每个罗马复合体一个。这应该使 Windows Server 和 Linux 在单插槽和双插槽系统上运行得更好,Clark 说,对于 Naples 而言,Windows Server 在实施 NUMA 方面比 Linux 更麻烦。对罗马 NUMA 架构的这些变化的结果是,性能应该更好,更均匀,并且需要更广泛的工作负载才能启动。I / O 和内存控制器集线器芯片还实现了用于将外围设备连接到系统的 PCI-Express 4.0 通道,在双插槽服务器的情况下,将一对罗马计算复合体相互捆绑在一起。

 

 

与 Naples 芯片一样,每个罗马芯片都有 128 个 PCI-Express 通道,可以通过多种不同方式进行配置,如下图所示:

 

与 Naples 一样,PCI 总线的一半用于实现两个插座之间的 NUMA 链路,因此单插槽和双插槽罗马只有 128 个 PCI-Express 通道用于外围设备。罗马的网卡有两倍的带宽,实际上可以驱动 100 Gb / 秒和 200 Gb / 秒的适配器,而 PCI-Express 3.0 在使用前者方面遇到了麻烦,而在普通的 x8 插槽中则不能用后者。这些通道可以单独使用,通常组合成一对(x2)用于存储设备,可能为罗马系统中的 56 个 NVM-Express 驱动器和高速网络接口卡留出空间。

 

从技术上讲,Naples 芯片有一个单独的 x1 通道,与 Infinity Fabric 控件分开。由于存在中央集线器,因此 x1 通道也可用于其他流量。这意味着单插槽罗马服务器技术上有 129 个 PCI-Express 4.0 通道,而双插槽罗马服务器有 130 个通道。英特尔至强可以缩小到 x4 通道; 据 Clark 说,他们不能做 x2 或 x1 车道。我们以前没有听过这个。

 

最后,Zen 2 核心有一些架构扩展,这里概述了这些扩展,并没有被反馈到 Naples 芯片的 Zen 1 核心:

 

 

接下来,我们将看看 AMD 如何将 Rome Epycs 与 Xeon 竞争对手相抗衡,以及英特尔对 Rome 芯片最初和长期的反应。