公众号记得加星标⭐️,第一时间看推送不会错过。

我(指代本文作者,下同)喜欢计算机体系结构的原因之一就是人们不断进行创新。过去50年来,我们一直在使用类似的计算机体系结构。GPU带来了一些不同的东西,此外还有ASIC、DSP以及像VLIW(超长指令字)这样的体系结构,它们都试图以不同的方式提升性能,但都存在各种各样的局限性。

有些限制更具教育意义而非实用性,但有些限制可以通过提高能效或内存带宽等方式来增强性能。此外,虽然我们有 x86、Arm 和 RISC-V 等指令集架构 (ISA),但如今业界充斥着各种各样的 ISA,它们大致都划分在非常具体的领域。正因如此,我们才会看到大量软件栈和其他资源沿着这些 ISA 路径发展。

所以,当一家公司对我说:“我们正在做一些不同的事情,这将加速很多事情的进展”,我通常会反问:“那拿出证据来。你们获得了什么数据?你们究竟在加速什么?”

NextSilicon 是一家采取截然不同策略的公司。在他们最新推出的Maverick 2 处理器发布前夕,我采访了他们的 CEO 。即便我并非业内人士,但从那次发布会上我了解到,这家公司里确实有很多聪明人。我喜欢和聪明人交流,因为他们有时会讲一些有趣的故事,但他们也能告诉我们事情的本质——以及他们当下的想法。

于是,NextSilicon 的架构副总裁 Ilan Tayari 登场了。在 Supercomputing 25 大会上,我与他进行了深入交流,探讨了他们的新架构,以及他们为何认为该架构能够解决现代高性能计算(包括 HPC 和 AI)面临的问题。

打开网易新闻 查看精彩图片

Ian Cutress:带我回到七年前,你作为联合创始人,正在考虑做一些与众不同的事情的时候。

Ilan Tayari:我的背景主要是软件开发。我是一名软件工程师,但我的“罪过”之一是我曾在Mellanox公司工作过。在Mellanox,我必须深入了解硬件特性和硬件架构。我学到的关于硬件的知识之一是,流水线化是提高运行速度的关键。正是在那时,我萌生了将应用程序也进行流水线化处理的想法。

CPU 和 GPU 都基于您提到的冯·诺依曼架构,这个架构已经有八十年的历史了,绝非什么新技术。所有这些 CPU 和 GPU 的工作原理都相同。当您在这些架构上运行软件时,实际上是将 C/C++ 代码编译。编译器(您可以在 LLVM 中看到实际应用)使用一种中间表示形式,即图。该图表示操作之间的依赖关系。然后,编译器将该图序列化为指令流。计算机核心中的芯片会重构该图。它必须重构依赖关系,并确定哪些操作依赖于其他操作,哪些操作不依赖于其他操作,以便重新排序。

Ian:它是逐行执行的吗?

IIan:是的,但远不止如此。处理器会先于你的程序运行,获取更多指令,并弄清楚哪些指令之间存在依赖关系。它可以同时发出多个待处理的内存操作和多个算术逻辑单元(ALU)操作,而顺序并非按照你编写指令的顺序。

Ian:但这岂不是意味着它速度更快吗!

IIan:没错,正是如此。它掩盖了对核心延迟的敏感性。那么,如果能完全摆脱这些呢?直接使用图(中间表示),然后制造硬件来执行它。这样就能得到一个流水线式的程序,而无需重建图的开销。既然可以直接通过流水线绕过转换,为什么还要进行降维和提升呢?这样效率更高。它的性能至少不逊色,甚至可能更高,因为它不会出现顺序错误,而且效率更高,因为它无需处理指令。

Ian:我来唱个反调,说说我编写和运行代码的时候,我并不一定关心或看到下游发生了什么,但我知道它背后有一个底层指令集架构(ISA)。你说你在运行一个图,那你肯定也把这个图转换成了某种更底层的ISA,才能在芯片上运行吧?

IIan:说到指令集架构(ISA),这个词有很多含义。人们会想到像x86、RISC-V或Arm这样的指令集,每种类型的指令都有某种编码,并且它们以流的形式传递。但是,编译后的中间表示是由逻辑上排列成图的操作组成的,你不需要将其序列化成指令流。

我指的是可以通过配置不同元件直接运行计算图的硬件。假设你有一个执行加法运算的元件,一个执行移位运算的元件,当然还有执行内存访问的元件。你只需要将它们连接起来即可。一旦连接完成,就不需要来回传输指令。没有指令流,没有指令读取,也没有指令重排序。

Ian:我想从理论上理解一下,当你编译并最终得到汇编级别的指令时,它实际上就是一个线性指令向量,指令会逐条加载。没错,指令之间可能存在依赖关系,这些依赖关系会被自动解决。你刚才说的更多的是从图表的角度出发;你几乎可以把它转换成指令流的二维表示。

IIan:当然。

Ian:只要你清楚各个指令之间的关联位置。我觉得你的一张图表就说明了这一点。虽然我参加了简报会,也尝试和你们一起理解一些解释,但我可能终于明白了!

IIan:还有一点需要说明,CPU核心,任何指令集核心,甚至GPU,都会遍历指令流并重建指令图,而且它在这方面做得很好。但在任何给定时刻,它只会执行少数几条指令,而不是你的整个程序,也不是你的整个内部循环。

Ian:即使核心宽度为 10,我们也只能说 IPC(每周期指令数)为 2、2.5 或 3。

IIan:没错。你的内循环可能是一个复杂的公式。如果你在高性能计算(HPC)领域,它可能是一个包含众多组件和大量计算的科学公式。这远不止两条指令、五条指令,甚至十条指令。当你在运行该图的硬件上运行时,你可以利用流水线将大量线程、大量上下文信息以及迭代空间中的大量迭代次数传递给它,在图的不同阶段和位置执行。这样,每个算术逻辑单元(ALU)实际上都会在每个周期执行。所以现在不是两次或十次指令周期通信(IPC),而是每个周期执行整个循环。

Ian:这就是数据流发挥作用的地方。

IIan:没错。只有通过数据流才能做到这一点。

Ian:我想到的一点是,在 Maverick 2 发布会上,你曾大力强调核心的很多资源都用于处理内存,包括地址转换、地址查找以及所有相关的缓存。但在示意图中,你又说我们的架构不需要这么大的内存管理单元 (MMU)。然而,你仍然需要引导带宽。你能解释一下这是如何实现的吗?

IIan:这里面有很多秘诀,其中一项我们已经申请了专利,那就是预留站和调度器。它接收来自内存或先前指令的数据,并将其流水线化到数据流图中。此外,我们的系统中也有一个内存管理单元(MMU),但与需要处理整个程序的CPU MMU不同,我们的MMU有所不同。单个CPU MMU需要处理程序中所有的内存访问,它使用转换后备缓冲区(TLB)。

在数据流图中,当你将内存访问分散到芯片的各个位置时,每个内存管理单元 (MMU) 只需处理一小部分内存访问——比如 10 次甚至更少,像两到四次。因此,程序中某个特定的内存访问指令的内存访问模式与整个程序的内存访问模式截然不同。相比于优化 CPU 中的 MMU,这种内存访问模式的优化潜力要大得多。

Ian:所以这意味着对于我们想要运行的现代代码,无论是高性能计算(我知道这款芯片的目标应用领域)还是机器学习,我们仍然可以获得流式传输。我之所以说“流式传输”,是因为这是一个非常常见的基准测试,但最终从中获得的带宽优势是什么呢?

IIan:当然。再想想数据流水线。每一条内存访问指令都是流水线的一部分。所以,你的代码中同一个元素可能会同时产生很多未完成的内存访问请求。它们之所以是独立的,是因为它们运行在不同的线程中,所以可以同时处于未完成状态。流向DRAM或缓存的未完成内存访问数量远高于CPU和GPU。它高出一个数量级。

Ian:你还会遇到虚假共享之类的问题吗?

IIan:嗯,这取决于你如何进行内存分配。简单的分配方式会导致伪共享,这是显而易见的。但我们硬件的一个特点是,我们不会在编译时尝试分析和处理伪共享,因为这是一个非常棘手的问题。以前没有人能做到这一点。我们的做法是收集遥测数据,然后在运行时调整和更改内存分配。例如,你可能已经将内存页或内存块分配到某个位置,然后在运行时,我们发现存在伪共享,并将它们重新分配到其他位置。这就是我们使用内存管理单元 (MMU) 的原因,因为它允许我们保留虚拟地址,同时更改物理地址。

Ian:当我想到经典的CPU架构时,你会发现它有预取和解码阶段,而许多现代架构在解码和重命名之后还有µOp缓存。考虑到架构的特性,因为你要编译图,所以这些步骤根本就不需要执行,对吗?

IIan:是的,我们没有指令提取单元,也没有指令缓存。我们不需要这些。我们也没有乱序执行引擎或指令重排序缓冲区。我们不需要这些。

Ian:展望未来提升性能的途径,有哪些途径是你可以利用的?因为如果我看一下现代的CPU核心,他们可能会说我们拥有更大的TLB、更多的预取单元、更好的页面遍历器、更多的ALU、更多的分支单元、更多的加载存储等等。

IIan:东西太多了!但是术语和CPU的术语差别太大了。

我们有特定的模块,它们负责实现流水线的部分功能。我们需要找到合适的平衡点,例如整数单元的数量、内存访问端口的数量、这些端口与内存的比例、线程容量,以及如何吸收延迟,最终实现流水线的全吞吐量。这些参数都有一定的自由度,我们可以进行调整和定制。

我可以告诉大家,我们做了大量工作,分析高性能计算领域常用的内核,最终找到了一种适用于所有场景的混合方案。当然,你不可能面面俱到,这要求太高了!但我们找到了一种很好的组合,它能够让我们以极高的性能,满负荷运行各种应用程序。关键在于超越竞争对手,而且不是仅仅领先几个百分点,而是领先一个数量级。

Ian:打个比方,如果我们拿一个现代 CPU 核心,专门设计用于天气预报,你可能会改变一些比例,但这会降低其他方面的性能。

IIan:当然。我举个例子。我们同时生成多个配置。我们生成一个配置,再生成另一个,可能几十个,甚至几百个,然后替换它们。配置之间的切换是硬件加速的。这是我们多年来积累的经验。

具体来说,天气模拟程序包含数百个不同的内核,涉及数百种不同的物理机制,例如尘埃、压力、温度,以及垂直和水平方向的各种运动。生成如此多的不同配置并高效地在它们之间切换是一项挑战。相比之下,例如分子动力学模拟,它只有少数几个内核,而且经常需要重复执行某个循环。不同的应用场景面临着不同的挑战。

Ian:这是发布会上提出的一个问题——当我们查看其他数据流架构时,它们通常会定义数据流并将其内置到二进制文件中。当程序运行时,它只是将数据流布局到芯片上,运行它,然后循环执行。

你们说过可以在内核运行时配置数据流。

其他芯片存在的切换开销——如果要称之为开销或延迟的话——在NextSilicon芯片上是否足够低?

IIan:没错,正是如此。但还要注意的是,我们并非以微秒级的速度动态生成配置。我们根据遥测数据,每隔几秒生成一次新配置。每次生成配置时,我们都会生成一组配置,这些配置可以在应用程序运行时以微秒级甚至纳秒级的速度动态重新配置。因此,这里存在两个不同的粒度层级。

Ian:你们的首席执行官埃拉德·拉兹非常兴奋地表示,这是关键创新之一。

IIan:是的,没错。正如你所知,这是 Maverick 2。这意味着之前肯定存在 Maverick 1!我们从中吸取了很多经验。其中一点就是,开销非常重要。例如,如果内核运行时间为 100 微秒,而切换内核的开销为 100 毫秒,那就行不通了。我们必须大幅降低开销。我们也正是这样做的。我们添加了必要的硬件加速,以将这些开销降至最低。未来我们计划进一步优化这方面。

Ian:但我想,如果你用精心编写的代码进行恶意攻击,你可以让它看起来像是非常糟糕的事情。但任何其他普通的内核也是如此。

IIan:你也可以对CPU这样做!

Ian:是啊,相信我,我对CPU这么做过。我对GPU也这么做过!

Ian:请你谈谈为什么选择高性能计算(HPC)作为目标。因为现在我们正处于人工智能和机器学习的热潮中。我工作并报道过很多相关领域的公司,他们做的几乎都是卷积神经网络(CNN)、深度神经网络(DNN)或Transformer模型的组合。我很想听听你对Maverick 2为何以高性能计算为目标的看法。

IIan:别误会!我们并没有忽视人工智能。从财务角度来看,高性能计算(HPC)是一个非常小的细分市场,而人工智能市场比它大三到四个数量级。人工智能市场规模达数万亿美元,而高性能计算市场只有几十亿美元。我们出于多方面原因,有战略性地选择了进军高性能计算领域。

其中一个原因是,它规模足够大,能够推动技术发展到成熟阶段。它拥有最成熟的客户和参与者,他们能够积极配合并吸收所有这些信息。他们不仅愿意学习,还愿意投入时间和精力进行优化,解决出现的漏洞,应对错误的架构,并提供对下一代芯片有用的反馈。因此,从这个意义上讲,他们非常有帮助。他们几乎不仅仅是客户,而是开发过程中的合作伙伴,而你在人工智能市场中根本找不到这样的合作伙伴。

Ian:我对高性能计算市场的批评是,鉴于我们身处超级计算领域,我们都热爱高性能计算市场,那就是他们有时下单速度非常慢。有时,系统最终会被那些读了三年、五年甚至七年课程却最终毕业的学生使用。

IIan:这就是为什么我们在高性能计算市场会选择规模最大、最顶尖的计算中心。您可能知道,我们与桑迪亚国家实验室合作。他们是美国最大的国家实验室。他们见识过所有可能出现的平台,能够为我们提供切实可行的反馈。例如:“应用程序正在这样做”、“应用程序正在那样做”、“用户最关心的是什么”、“用户期望的易用性是什么样的”、“如果达不到这样的性能,就会被淘汰”。

我们看到的一些现象。

首先是STREAM基准测试。这个测试非常简单,它只是表明我们能够利用HBM带宽。

然后你会看到像 GUPS(每秒千兆更新次数)这样的指标,它是一种随机内存访问。这展示了当缓存完全失效时会发生什么,因为 GUPS 总是缓存未命中。它不会进行向量化,不会合并内存,也不会做任何类似的操作。即使在 GUPS 模式下,我们也能充分利用 HBM 内存。我们获得的 GUPS 性能数据在其他任何平台上都是前所未闻的。

GUPS 只是一个专门针对特定场景的合成微基准测试,对吧?虽然它是合成的,但国防领域乃至高性能计算领域的许多应用程序都表现出类似的特性。它们都存在一些不规律的情况,例如内存访问分散、工作负载稀疏等等。这是我们拥有的其他平台所不具备的巨大优势。

Ian:所以你预计大多数情况下都会受到计算资源的限制吗?

IIan:实际上恰恰相反。我认为计算性能如此之高,以至于我们能够将通常受计算限制的工作负载转化为受内存限制的工作负载,并使其性能达到极限。许多平台都有其性能极限,你可以看到峰值和内存带宽,但它们无法达到极限。而我们的系统和架构能够最大限度地发挥其性能,并达到极限。

Ian:你有没有收到这方面的反馈,让他们重新考虑内部代码的结构,从而改变这种模式,改变他们在屋顶线上的位置?

IIan:关于代码更改——我们明确的目标是无需任何代码更改。

但一旦你完成了这些步骤,并且你的投资组合通过加速技术运行起来,你就会产生强烈的欲望。你会找到一些想要投资的优秀应用。有很多方法可以优化你的代码,使其运行得更快。我们提供的工具之一就是识别性能瓶颈和拖慢应用速度的因素,并推荐你可以对源代码进行的更改。这些更改恰好也适用于其他平台。因此,如果你以这种方式重构代码,就能获得更佳的 CPU 性能。

Ian:大家可能熟悉英特尔VTune和类似的软件——你指的是类似的东西吗?

IIan:它是一个性能分析工具。可以说它和VTune很不一样,因为它们的架构不同,但如果说的是用户流程,那它们就比较相似了。

Ian:回到 Maverick 2 的优化问题,我理解通过分析代码,也就是对代码进行插桩,硬件会将更多资源分配给并行部分而不是串行部分。我看到市场上有人讨论,即使写出很烂的代码,它也能正常运行。或者类似地,如果代码需要调整,我该如何针对底层架构进行优化?因为这与针对 CPU 和 GPU 的编程思路截然不同。

IIan:我们不做自动并行。并行不是凭空发明的。你仍然需要聪明地编写代码,仍然需要在程序中明确地表达并行性。不一定非得用向量,可以是任何东西——用 Kokkos、CUDA 等等。你需要在程序中明确地表达并行性。你不能写出糟糕的代码还指望它能运行。它能运行,但性能不会好。

所以你不能编写串行代码并期望它能被向量化。这行不通。

但是,一旦你以并行方式编写代码,我们就可以扩展芯片中的并行性和并发性。

Ian:所以你必须用GPU的SIMD模型那样编写吗?

IIan:你可以编写 SIMD 代码,也可以编写 OpenMP 代码——你可以编写 Kokkos 代码,也可以编写 CUDA 代码。任何在源代码层面表达并行性的代码都会编译成中间表示,我们就能理解其中的并行性。然后我们再根据这个中间表示进行后续操作。

Ian:你们也宣传“自带代码”模式。那么这是否意味着它支持 CUDA?它是否支持其他 GPU 编程语言?鉴于英伟达对其他使用 CUDA 代码的人的态度,你们在这方面遇到过什么问题吗?

IIan:还没。我们走着瞧。我认为“CUDA护城河”是个问题,但我们会想办法克服它。其中一个方法是使用HIP。其他厂商已经这么做了,很多代码都从CUDA重写到HIP,以绕过这个护城河。我们还有一些妙招!这其中也涉及到一些法律问题,所以我这次采访就不细说了,但我们相信我们能做到。

Ian:说到机器学习,我知道你们正在计划开发一款更专注于机器学习的未来芯片。你们如何看待你们架构在这个市场上的应用?因为面向高性能计算(HPC)是一回事,高性能计算需要处理所有数据和世界上最复杂的代码,而面向那些可能极其规律或更可预测的应用则是另一回事。我们之前讨论过如何通过改变自由度来优化。你们能否设计一款专门针对Transformer或CNN的芯片?

IIan:首先要说的是,数据流架构效率更高。你可以说它比CPU或GPU更高效,即使是专为人工智能设计的CPU或GPU。然而,如果有人想制造一款专门用于LLM(逻辑层级模型)或推理的芯片——甚至可以更进一步,只支持FP4,完全放弃FP64——无论如何,它都会比我们的芯片更高效,因为你把所有的硅都投入到了一个特定的应用场景中。

如果我们有更多的资源和时间,我们会着手研发一款比其他竞争对手更高效的芯片,利用数据流技术解决市场上很大一部分用户的特定问题。但这并非我们想要的方向。所以我们避免了在这方面投入资源。相反,我们研发了一款高性能计算芯片。我们正在研究如何利用这款芯片实现人工智能,以及如何开发一款适用于人工智能的产品。

Ian:但目的是否至少要保持 FP64 的性能?

IIan:是的,我们是一家以高性能计算(HPC)为核心的公司。现在人们对高性能计算+人工智能(HPC+AI)的工作负载非常感兴趣。例如,人们正在使用高性能计算模拟来训练人工智能。

Ian:我经常发现,在这种场合,与一些人进行这样的对话非常困难,因为他们不愿意接受事情就是这样发生的。

IIan:这正在发生!如果你正在寻找能够运行这类工作负载的系统,那么你必须同时运行GPU或AI加速器以及HPC加速器。新一代的GPU并不适合这种需求。而我们的芯片在这个市场拥有非常大的潜力。

Ian:这个行业的一个趋势是芯片封装尺寸越来越大。芯片组的出现意味着更多的硅片,最终带来更强的计算能力和更强大的性能。我注意到 Maverick 2 采用了这种芯片组架构。这种芯片间的边界划分有什么特殊之处吗?或者在运行时需要考虑哪些因素?

IIan:哦,对。那我们先从基本原理说起。你说芯片越来越大,这似乎是事实。但你有没有想过为什么?为什么人们想要更大的芯片?当然,把所有数据都集成在硅片上速度更快,但原因远不止于此。把芯片连接起来速度更快,因为这样可以降低延迟,提高带宽。

但是,当你进行横向扩展,构建系统,并以横向扩展的方式设计应用和系统时,这可能就不是主要因素了。人们追求的是密度。他们希望在相同的机架中放置更多的芯片,而不是仅仅占用更多的空间,而这最终会影响到功耗、运营成本和其他因素。

我们对此并不陌生。正如您所说,我们的芯片正朝着这个方向发展。我们着眼于未来几代产品,进一步提升连接性,使相邻芯片能够相互通信,从而扩展工作负载,甚至像人工智能这样的应用,可以通过将庞大的模型分片到不同的芯片上运行。即使在今天,您也可以使用 Mellanox 网卡和 RDMA 实现这一点,但您需要的是更集成化的方案。这才是未来的发展方向。

Ian:在高性能计算领域,MPI通常是首选方案。在多芯片应用中,你们是否针对MPI做了什么特别的处理?

IIan:所以在桑迪亚国家实验室的Spectra系统中,我们使用Infiniband RDMA进行MPI操作,有点像GPUDirect,加速器直接驱动网卡,无需CPU参与。但我们还有更多妙招。

Ian:等等,那块硅片里还有什么秘密武器吗?

IIan:两个都行!

*免责声明:本文由作者原创。文章内容系作者个人观点,半导体行业观察转载仅为了传达一种不同的观点,不代表半导体行业观察对该观点赞同或支持,如果有任何异议,欢迎联系半导体行业观察。

今天是《半导体行业观察》为您分享的第4310期内容,欢迎关注。

加星标⭐️第一时间看推送

打开网易新闻 查看精彩图片

打开网易新闻 查看精彩图片

求推荐

打开网易新闻 查看精彩图片