x86-64 指令集为绝大多数 PC、游戏机和服务器提供支持。然而,x86 许可证持有者的数量一直很少,因此跟踪剩下的少数人很重要。在英特尔和AMD 为争夺性能桂冠而相互厮杀的同时,Centaur 的前东家威盛却悄悄瞄准了低功耗笔记本电脑和嵌入式市场。我们介绍了他们以前的几款芯片,例如威盛 Nano和兆芯陆家嘴。然而,自从1999 年取消当时新收购的 Cyrix 的 Jalapeno 核心以来,VIA 还没有尝试与 Intel 或 AMD 的高端设计正面交锋。 2019 年情况发生了变化,威盛再次将目光投向了更高的性能目标。跟随他们现已解散的子公司 Cyrix 的脚步,Centaur 团队宣布了一个名为“CNS”的 x86 内核。与 Nano 不同,CNS 以服务器应用程序为目标,并优先考虑具有高 IPC 和 AVX-512 支持的高性能。这使 CNS 处于一个非常有趣的位置。它不仅代表了威盛对低功耗市场战略的转变,而且作为第一个实施 AVX-512 的非英特尔微架构脱颖而出。 但去年年底,有消息称英特尔正在从威盛手中收购 Centaur 设计公司。这在整个科技界引起了轰动,因为 Centaur 是除英特尔和 AMD 之外唯一剩下的高性能 x86 设计公司。 不幸的是,这很可能扼杀了 CNS 的努力。然而,感谢Brutus以及我们出色的赞助人和支持者,我们设法获得了为数不多的 CHA 芯片样本之一。在本文中,我们将深入研究 CNS 微体系结构,看看如果它真的发布了会是什么样子。 概述和框图Centaur 的 CHA 芯片带有八个 CNS 内核以及一个称为 NCore 的机器学习加速器。为了提供这些组件,CHA 有一个 16 MB 的末级缓存和一个四通道 DDR4 内存控制器。所有这些都是在 194 mm 2芯片上实现的,采用台积电的 16 纳米工艺: 我们将专注于 CNS 核心,因为没有公开发布或我们可以找到的 NCore 驱动程序。从我们的测试来看,架构如下所示: 我们的 CNS 芯片运行频率为 2.2 GHz,当量产芯片的目标频率为 2.5 GHz 时,这对于工程样品芯片来说令人印象深刻。为了进行测试,它设置了四通道 DDR4-3200 内存。为了进行比较,我们在 Azure NC12 实例上运行了测试。它有一个禁用了 SMT 的 Xeon E5-2690 v3,似乎运行在 3 GHz。但是,我们不确定它具有什么样的内存。 前端:分支预测准确性
因为 Centaur 说 CNS 核心是 Haswell 类,所以我们将与之进行比较。CNS 的预测器可以识别相当长的模式,但通常达不到 Haswell 的能力。然而,CNS 似乎确实有足够的存储空间来存储分支历史记录。有 512 个分支,它可以保持出色的预测精度,重复历史长度可达 24 长。相反,一旦模式长度超过 16,Haswell 就会分崩离析。 CNS 的方向预测器比Nano 中的方向预测器强大得多。Centaur 自上次尝试进军 x86 市场以来取得了重大进展。但英特尔是一个拥有大量工程实力的巨头,对于一家小公司来说,要赶上他们并不容易。 间接分支预测间接分支可以跳转到不同的地方,给分支预测增加了一层难度。预测器必须跟踪所有这些目标,并在它们之间进行选择。在这里,我们只看间接预测器可以跟踪多少个目标。 对于其大小的核心,CNS 具有令人印象深刻的间接分支预测能力。我们看到处理了多达 1024 个间接目标而没有受到太多惩罚,有 256 个分支,每个分支有 4 个目标。Haswell 在跟踪有很多目标的几个分支时表现更好,但 CNS 在跟踪很多分支且每个分支有几个目标时表现更好。 呼叫/返回预测调用和返回对是间接分支的特例,因为返回通常返回到调用的来源。为了加速返回预测,Centaur 使用 7 条目返回堆栈。相比之下,Haswell 有 16 个条目的返回堆栈,而 Zen 有 31 个条目。CNS 的返回栈很小,在调用深度嵌套的代码中会受到影响。 前端:分支预测速度为了加快前端的分支处理,CNS 使用复杂的多级分支目标缓存。Haswell 和 CNS 都可以跟踪 128 个分支并在没有提取气泡的情况下处理它们。他们看起来也像是在超过 4096 个分支进行比赛后击中了 BTB 失误点球,但相似之处仅此而已。 在 16 个分支下,CNS 每个周期可以维持两个分支。因此,它加入了 Rocket Lake 和 Golden Cove 的 CPU 专属俱乐部,每个周期可以执行多个分支。Intel 可能通过在其微操作队列中展开循环来实现这一点,在 Intel 的文档中称为 LSD(循环流检测器)。Centaur 可能有类似的机制。否则,他们需要一个双端口指令缓存来实现如此出色的分支性能。 一旦我们越过 128 个分支进入主 BTB,Intel 和 Centaur 的方法就会再次出现分歧。CNS 似乎使用绑定到 L1 指令缓存的 BTB。一旦循环大小超过 32 KB,我们就会看到每个分支所用的循环数急剧增加。在 L1i 中,CNS 每三个周期可以做一个分支。换句话说,在采用的分支之后浪费了两个获取周期。也许这表明 CNS 的 L1i 有 3 个周期的潜伏期。Haswell 使用更现代的解耦 BTB,它可以跟踪 4096 个分支,而不管间距或 L1i 命中/未命中。Intel 的实现也更快,并且只在一个采用的分支之后浪费一个获取周期。 不过从角度来看,CNS 比 AMD 的 Zen 2 做得好很多,至少当两者以相似的时钟速度运行时是这样。Zen 2 可以使用 16 入口 L0 BTB 进行零气泡分支。但在那之后,当它从更大、更慢的 L1 和 L2 BTB 中获取分支目标时,它会受到严厉的惩罚。 前端:指令获取和解码MPR 的文章说 CNS 每个周期可以从 L1 指令缓存中获取 32 个字节。但是,我们只能针对 2 KB 的测试大小实现这一目标。CNS 的指令提取性能最终看起来有点像 Haswell 的,其中 32B/周期提取只能针对小代码大小从 uop 缓存中实现。 从 L2 开始,CNS 每个周期可以维持大约 16 字节的代码,这仍然足以维持 4 个 IPC,除非代码以向量指令为主。一旦指令溢出 L2,吞吐量就会急剧下降,但这是包括 Haswell 在内的许多设计的典型行为。 CNS 每个周期可以维持 5 个 NOP,只要它们处于不超过 24 条指令的紧密循环中。 MPR 的文章说 CNS 有一个预解码阶段,每个周期可以处理四个指令。预解码指令被放入一个指令队列中,该队列为主要的 4-wide 解码器提供数据。 对上述行为的一种可能解释是指令队列有 24 个条目,并且可以充当循环缓冲区。如果代码适合此循环缓冲区,它会绕过预解码限制并可以以 5 IPC 运行,只要主解码器可以融合一对指令。这与 Haswell 截然不同,后者的预解码阶段是 6 宽,循环缓冲区位于主要的 4 宽解码器后面。 与 Haswell 一样,CNS 可以将条件跳转与先前设置标志的指令融合在一起,包括算术运算。与我们研究过的其他 CPU 不同,它还可以将 NOP 与相邻指令融合。融合对在后端被跟踪为单个微操作。 重命名/分配阶段优化CNS 的重命名器可以识别操作何时总是生成零,例如当寄存器与自身进行异或运算或从自身中减去时。对于这些情况,它可以告诉调度程序它不需要等待输入,从而允许提取更多的 IPC。在这方面,它与哈斯韦尔不相上下。 与 Haswell 不同,CNS 似乎没有移动消除功能。从属寄存器到寄存器移动指令的链将在每个周期执行一个。 后端:乱序资源与任何现代高性能 CPU 一样,CNS 具有大缓冲区以支持乱序执行。寄存器文件、ROB 和内存排序队列等关键结构与 Haswell 的大致相当。甚至调度程序和分支顺序缓冲区也具有相似的大小。Centaur 的目标是通过这个内核达到 Haswell 级别的性能。
但 CNS 的主要功能是支持 AVX-512,所以让我们深入了解一下。它与 Skylake-X 的全功能 AVX-512 实现完全不同。相反,Centaur 仍然使用 256 位向量寄存器,并将 512 位指令拆分为两个微操作。这意味着 CNS 不会通过使用 AVX-512 获得吞吐量或重新排序能力。 它仍然可以受益于 AVX-512 的屏蔽功能,但这也存在问题。在 CNS 上,那些掩码寄存器和通用整数寄存器都竞争性地共享同一个重命名的寄存器文件。这不是很好,因为 CNS 没有特别大的整数寄存器池开始(它比 Haswell 的稍微小一点)。结合 512 位结果如何消耗两个向量寄存器,当使用 AVX-512 时,CNS 的重新排序能力可能会看到更低的限制。 后端:执行单元整数执行Centaur 并没有忽略 CNS 的整数单位。核心有四个 ALU 管道,如 Haswell,但专门的执行单元在更多 CNS 管道中重复。 与 Haswell 上的两个相比,CNS 的所有四个 ALU 管道都可以进行旋转和移位操作。PDEP 和 PEXT 等复杂的位操作操作可以在 CNS 上每个周期执行两次,而 Haswell 只有一个管道。Haswell 和 CNS 都可以进行具有 3 个周期延迟的整数乘法,但 CNS 有两个整数乘法器,而不是 Haswell 的一个。虽然两个 CPU 表面上都有四个 ALU 管道,但 CNS 的管道更灵活,并且可以实现更好的吞吐量,特别是对于利用专用指令的应用程序。 向量和浮点执行在向量执行方面,CNS 的设置看起来很像 Haswell,除了 CNS 使用单独的向量执行管道而不是让整数执行端口执行双重任务。向量整数执行单元分布在三个管道中,而 FP 操作有两个管道可供选择。同样,与 Haswell 相比,Centaur 不会吝啬,并且执行单元会在更多的管道中复制。 CNS 的浮点单元每个周期可以执行两个 256 位 FP 加法或乘法,延迟为 3 个周期。Haswell 的 FP 乘法延迟更糟,为 5 个周期。而且,Haswell 只能在 3 个周期延迟的情况下每个周期执行一次 FP 添加操作。有趣的是,您可以通过使用乘数为 1 的 FMA ops 在 Haswell 上匹配 CNS 的 FP 添加吞吐量,尽管延迟更高。融合乘加执行在两种架构中几乎相同,具有 2×256 位吞吐量和 5 个周期延迟。 Centaur 的向量整数执行能力也更强。所有三个管道都可以进行矢量整数加法,而只有两个 Haswell 可以。与标量整数端一样,CNS 的向量端有两个整数乘法器,而 Haswell 有一个。根据具体的乘法运算,Haswell 的性能可能会进一步下降。例如,pmulld(64 位元素的向量乘法)以半速率执行,延迟为 10 个周期。CNS 以每周期 ~1.68 的速度执行相同的操作,具有 3 个周期的延迟。 地址生成地址生成是 CNS 在执行单元前端的唯一弱点之一。CNS 有两个 AGU 管道,每个管道都能够处理负载或存储。Haswell 有三个 AGU,允许它在同一周期内执行两次加载和一次存储。 Centaur 仍然有一些小窍门。它可以通过执行单个 AVX-512 存储或两个 256 位 AVX 存储每个周期写入 64 个字节。这使它的存储带宽是 Haswell 的两倍。就最大 L1D 带宽而言,CNS 理论上可以达到每个周期 128 字节,读写比例为 1:1。我们无法在测试中达到这一点,但我们确实每个周期获得了 90 多个字节。这接近 Haswell 的 96 B/cycle 理论最大值。 实际上,Haswell 的三重 AGU 设置可能略有优势。大多数应用程序的负载远多于存储,而 Haswell 的额外存储 AGU 将减轻两个通用 AGU 的压力。不过,这种优势微乎其微。 内存排序和存储转发CNS 具有相当复杂的加载/存储单元。与威盛 Nano 和兆芯的陆家嘴不同,它可以推测性地在地址未知的商店之前执行加载。 Centaur 还具有强大的存储转发机制。负载完全包含在先前存储中的所有情况都以 7 个周期的延迟处理。如果它们是独立的并且都不跨越 64 字节缓存行边界,它还能够在每个周期完成两次加载和两次存储。在 Sunny Cove 和 Zen 3 之前,我们从英特尔或 AMD 看不到这一点。 但是,延迟有点高,尤其是在转发失败的情况下。如果加载仅与存储部分重叠,则延迟会跳到 21 个周期。如果负载跨越 64 字节缓存行,则存储转发延迟会增加一个周期。如果加载跨过高速缓存行边界并且存储转发失败,则会有 6 个周期的惩罚。 Haswell 似乎以四字节的粒度进行快速检查。如果加载和存储都访问相同的 4 字节对齐区域,它会进行更彻底的检查,从而导致半个周期的损失。即使没有重叠,这种轻微的惩罚也适用。Haswell 上成功的存储转发有 5.5 个周期的延迟,而失败的存储转发成本为 15。这两个延迟都低于 CNS,考虑到 Haswell 更高的时钟速度,这是相当令人印象深刻的。 如果负载跨过缓存行边界,Haswell 的存储转发需要额外的两个周期,并且存储转发失败的惩罚增加一个周期。 后端:缓存和内存访问
在大多数情况下,Centaur 的 CNS 比英特尔的 Haswell 具有更高的缓存延迟,即使后者在服务器平台中也是如此。部分原因是 Haswell 的运行频率为 3 GHz,而 CNS 的运行频率仅为 2.2 GHz。 但即使我们对时钟速度进行标准化,Centaur 仍然落后。由于有 5 个周期的延迟,Centaur 的 L1D 很慢。它的L2也比Haswell慢了一个周期。在 L3 区域,Centaur 在周期和绝对时间方面再次失利。当我们忘记记忆时,它只会带来轻微的胜利。 如果我们使用 2 MB 页面来避免地址转换惩罚,那么两个 CPU 的情况看起来会好一些,但情况基本相同。24 ns 的延迟对于仅服务于八个内核的环来说略低于标准。查看 L3 延迟的差异,我们还可以看到 L2 TLB 访问需要额外的八个周期。 在时钟周期方面,它并没有比 Haswell-E 高太多。但是 E5-2690 v3 有更多的缓存、更多的核心,并且运行在更高的时钟上。英特尔在扩展环形互连的同时控制延迟方面做得非常出色。 带宽CNS 的 L1D 每个周期可以执行 64 字节加载和 64 字节存储。即使使用读-修改-写或复制模式(提供 1:1 的加载-存储比率),我们也无法接近其理论带宽,但至少我们每个周期获得了超过 64 字节。 从 L1 到 L2 时,读取带宽几乎没有下降,保持在每个周期略低于 64 字节。 即使是 Intel 的最新内核也无法维持如此大的 L2 读取带宽。这是 Centaur 架构令人印象深刻的表现。但是,一旦我们到达 L3,带宽就会急剧下降。 加载所有八个内核后,我们看到 CHA 的 L1 数据高速缓存具有内存复制模式,速度超过 1.6 TB/s。使用读取模式的 L2 带宽最高,略低于 1.1 TB/s。L3 带宽达到约 325 GB/s。最后,我们从内存中获得略高于 55 GB/s 的速度,具有复制模式。 片上互连和系统架构Centaur 使用环形互连将内核与 L3 缓存和片外 IO 连接起来。每个环停止在每个方向上每个周期可以移动 64 个字节——是 Haswell 的两倍。 带宽缩放加载八个内核后,CNS 在所有八个内核中平均每个周期 97.4 字节,而 Haswell-E 每个周期获得 81.62 字节。CNS 的更宽环确实有助于提高带宽,但不足以抵消英特尔的时钟速度优势: 作为一个安慰奖,Centaur 基于环的 L3 能够在重负载下提供比 Ice Lake 基于网格的缓存更多的带宽。基于网格的互连在不消耗大量功率的情况下往往会出现时钟上升问题,从而导致高延迟和低带宽。冰湖也不例外。 CHA 有一个支持 DDR4-3200 的四通道内存控制器,但内存带宽并不太令人印象深刻。53 GB/s 远低于理论值 102.4 GB/s。接近理论带宽很难,因为 DRAM 带宽会因刷新周期和读/写周转而丢失。但是理论值的 52% 太低了。 Haswell-E 并没有做得更好。其第一代 DDR4 控制器在高速运行时存在问题。尽管如此,随着更多内核的加载,英特尔相对较旧的架构显示出更好的内存带宽扩展。一种想法是,CHA 并未针对 CPU 内存性能进行优化。Centaur 有一个大型 NPU,占据了很大一部分裸片面积,能够处理近 7 个 bfloat16 TFLOP。这可能需要大量内存带宽,尤其是在 CPU 内核同时处于活动状态的情况下。此外,四通道内存控制器可以允许更多的 DIMM 插槽,从而更容易安装大量内存,而无需非常昂贵的大容量模块。 锁和缓存一致性使用可能与 L3 切片相关的机制可以很好地处理缓存一致性。一个内核看到另一个内核写入所花费的时间取决于两个内核与缓存行所在的 L3 切片的距离: 锁定延迟还不错,特别是考虑到 CNS 的低时钟速度。Haswell-E 最终处于同一个球场。一方面,英特尔受益于更高的时钟。但另一方面,它使用双环设置来连接更多内核和更多缓存。跨互连的更多跃点通常会转化为更高的延迟。 蛤蜊的采取在真空中,CNS 的架构展示了 Centaur 设计团队取得的成就。CNS 比以前的任何 VIA 或 Centaur 架构都更广泛并且具有更多的重新排序能力。它还实现了一系列新的微体系结构功能,展示了小型 Centaur 团队的设计实力。负载可以在地址未知的商店前面吊起。存储转发非常健壮,其行为类似于 Sunny Cove 的行为。有一个大型、统一、多端口的调度程序。向量执行单元对于其大小的核心来说非常强大。多组架构寄存器(GPR 和 AVX-512 掩码)被别名为同一个物理寄存器文件,以提高面积效率。所有这些都是在一个非常紧凑的内核中完成的: 系统层面也有进步。Centaur 设计了一个现代环形互连,将内核与缓存和 IO 连接起来。该互连支持大型共享 L3,并使其带宽扩展以满足八个内核的需求。最后,CHA 芯片的四通道 DDR4 控制器和 44 条 PCIe 通道为其提供了比以往任何 Centaur 设计都更多的片外带宽。 但 CNS 并不存在于真空中。Haswell 级别的 IPC 很棒。不好的地方(对于 Centaur)是 Haswell 的时钟要高得多。英特尔还在几代人的时间里改进了他们的环形总线,让它支持更多的核心数量并扩展到更高的带宽,即使环形站之间的链路更窄。Centaur 的架构虽然雄心勃勃,但在与 Haswell 的对抗中会遇到困难。 更糟糕的是,Centaur 的 CHA 芯片在 2021 年仍未上市。这使其与英特尔基于 Icelake-SP 的 Xeons 和 AMD 基于 Zen 3 的 EPYC 芯片相抗衡。Centaur 是一家小公司,资源有限,落后一个流程节点。在纯粹的 CPU 与 CPU 之战中,他们毫无胜算。 但半人马知道这一点。这就是 NCore 的用武之地。它是一个强大的机器学习加速器,每秒能够进行 6.8 万亿次 bfloat16 操作。Centaur 希望将他们的 CNS 架构与 NCore 相结合,以创建具有独特竞争力的产品。Core for core,CNS 无法与 Skylake 或 Zen 2 相提并论,但它足以驱动 ML 加速器。就上下文而言,英特尔将 Snow Ridge 定位于 5G 基站(算作“边缘”)。Snow Ridge 拥有运行频率为 2.2 GHz 的 Tremont 内核。ARM 以 Neoverse E1 的边缘应用为目标。CNS 可以很好地对抗它们,尤其是在矢量化工作负载方面。 将 NCore 置于芯片上还可以减少延迟,并为其他 IO 留出空闲的 PCIe 通道。在边缘,这无疑是大量的网络带宽。如果您想要一台具有强大推理能力的服务器,但对 CPU 性能的要求更适中,并且没有外部 ML 加速器的空间或功率预算,那么 CNS 和 NCore 一起使用是有意义的。 我想那个市场从未实现过。或者即使是这样,也不足以拯救半人马座。然后,英特尔抢购了 Centaur 的设计团队,因为这些工程师非常擅长用有限的资源做很多事情。CNS 证明了这一点。 最后的话总之,虽然看到一家 CPU 设计公司倒闭令人难过,但 Centaur 不会与 AMD 或英特尔竞争。即使 Centaur 在 2017 年推出了带有 CNS 内核的系统,Intel 和 AMD 都有更多可扩展的系统,如 Skylake-X 和 Zen 1 EPYC,因为与 Skylake 相比,CNS 只能扩展到 2 个插槽,总共 16 个内核- X 的 8 个插槽最多 224 个内核,而 EPYC 的 2 个插槽最多 64 个内核。 然而,正如 Clam 所说,在 Centaur 计划发布的 2020 年,Centaur 或 CNS 核心的情况看起来都不太好。而在 2021 年底,Centaur 的情况看起来更加严峻,他们决定关闭商店,英特尔以 1.25 亿美元的价格收购。 现在,收购并不一定意味着 CNS 核心已经死了。所有这一切的通配符是兆信。兆芯在英特尔收购 Centaur 期间一直非常安静,但他们已经证明他们可以通过陆家嘴改进 Centaur 现有的设计。 2018 年,兆芯声称能够通过其 KX-7000 系列 CPU 赶上 AMD 当时相当新的 Zen 1 架构,我怀疑他们正计划使用 CNS 内核来实现这一目标。由于使用 ZX-200 作为南桥的原型板以及威盛于 2020 年 10 月将 IP 转让给兆芯,其中包括 CPU IP,因此该假设确实有可靠的证据支持它。现在,兆芯能否将 CNS 内核的时钟频率提高到现代台式机 CPU 为具有竞争力所需的 3.5+ GHz 又是另一回事了。 不管兆芯能否让 CNS 达到 3.5GHz,这一点都没有实际意义。现在不是 2019 年初,而是 2022 年初,所以这个假设的 3.5GHz CNS 将无法接近 AMD 或英特尔当前的架构,更不用说大约 6 到 9 个月后会出现什么了。 但回到英特尔对 Centaur 的收购,1.25 亿美元的问题是为什么?为什么英特尔要收购 Centaur 设计公司?坦率地说,我们不知道。Centaur 对英特尔甚至 AMD 都没有威胁。我能想到几个可能的原因:
不幸的是,英特尔收购 Centaur 的真正原因可能永远不会为人所知,因为英特尔对于他们吞并 Centaur 的原因守口如瓶。这很可能是一个大多数人不知道还存在的时代的终结。也许兆芯会接过Cyrix和Centaur的第三家高性能x86设计公司的衣钵,或者我们可能会沦为AMD和英特尔的两家高性能x86设计公司。我无法预测未来,但我所知道的是这篇文章到此结束。 如果您喜欢我们的文章和新闻,并且想支持我们的努力,那么如果您想以我们的方式花几块钱或者想与 Chips and Cheese 的工作人员交谈,请考虑前往我们的Patreon或我们的PayPal幕后人员随后考虑加入我们的Discord。 |
|