当前位置: 首页 > 科技观察

特斯拉自研芯片架构的教训

时间:2023-03-19 13:19:59 科技观察

说特斯拉只对机器学习感兴趣一点也不为过。事实上,这家电动汽车制造商构建了一台名为Dojo的内部超级计算机,针对训练其机器学习模型进行了优化。与许多其他超级计算机不同,Dojo不使用现成的CPU和GPU,例如来自AMD、Intel或Nvidia的CPU和GPU。特斯拉根据他们的需求设计了自己的微架构,让他们做出更通用的架构无法做到的权衡。在本文中,我们将了解基于Tesla在HotChips上的演示的架构。模式没有单独的名称,因此为简单起见,以后每当我们提到Dojo时,我们都在谈论模式。方块图在高层次上,Dojo是一个8宽内核,带有四个SMT,以保守的2GHz运行,具有CPU风格的管道,这使得它比GPU更能容忍不同的算法和分支代码。Dojo的指令集在标量方面类似于RISC-V,但Tesla的工程师添加了一组自定义的矢量指令,专注于加速机器学习。TeslaDojo核心的简化框图Tesla将Dojo描述为“高吞吐量、通用CPU”。从性能的角度来看,这绝对有一定道理。但特斯拉为提高计算密度做出了牺牲,与我们熟悉的台式机、笔记本电脑和智能手机上的CPU相比,Dojo内核非常难用。在某些方面,Dojo核心的处理方式更像是IBMCell中的SPE,而不是传统的通用CPU核心。像Cell的SPE?IBMCell处理器于2000年代中期推出,具有八个“协同处理元件”或SPE,由一个功能齐全的CPU内核(“电源处理元件”或PPE:电源处理元件)控制。乍一看,Dojo与SPE有很多相似之处。Dojo和SPE都针对矢量处理进行了优化,并依赖于单独的主机处理器来进行工作分配。在Dojo或SPE上运行的代码不能直接访问系统内存。相反,应用程序应该主要在本地SRAM的一小部分中工作。此本地SRAM由软件管理,不能用作缓存。如果需要来自主存储器的数据,则必须使用DMA操作将其引入。最后,Dojo和Cell的SPE都缺乏对虚拟内存的支持。稍后我们将更详细地讨论这意味着什么,但简而言之,它使多任务处理变得非常困难。TeslaDojo和IBMCellSPEDojo之间的一个非常简单的比较在几个重要方面有所不同。由于Dojo在设计时并未考虑小型部署,因此主机处理器驻留在单独的主机系统上。这些主机系统有一个带接口处理器的PCIe卡,然后通过高速网络链接连接到Dojo芯片。相比之下,Cell的主处理器位于同一芯片上。这使得单独部署单个Cell芯片成为可能——这在Dojo中是不可能的。Dojo的1.25MB本地块是SRAM,它比只有256KBSRAM的CellSPE更大且带宽更高。Cell的256KBSRAM只有一个端口,每个周期可以提供128B。Dojo的SRAM有五个64B端口。当然,架构目标非常不同。Dojo是宽频和低频的,而CellSPE具有窄而深的流水线,专为高频而设计。Front-end:CPUComforts等下面从前端开始简单介绍一下Dojo的pipelines。有某种branchpredictor,因为Tesla的图显示BTB(branchtargetbuffer:分支目标缓冲区)。它可能不像我们在AMD、ARM和英特尔的高性能内核上看到的那样具有预测性,因为Dojo需要优先考虑在向量执行上花费芯片面积。但即使是基本的分支预测器也比没有预测器有了巨大的改进,在处理分支代码或更大的指令足迹时,Dojo的分支预测功能应该提供比GPU更好的性能。一旦分支预测器生成了下一个指令提取指针,Dojo就可以每个周期从“小”指令缓存中提取32个字节到每个线程的提取缓冲区中。这种指令缓存可能有助于降低本地SRAM的指令带宽压力,确保数据端可以在尽可能少的争用情况下访问SRAM。此外,指令缓存不一致。如果新代码被加载到本地SRAM中,指令缓存必须在分支到该新代码之前被刷新。从Tesla的HotChips演示中,Dojo的解码器从获取缓冲区中可以处理来自两个线程的每个周期的八条指令。我对“每个周期两个线程”的含义有点困惑,因为具有SMT的CPU通常每个周期处理一个线程并在周期边界切换线程。也许Dojo将解码器分成两个集群,并选择两个线程在每个循环中为它们提供数据。这可以减少所采用分支的解码吞吐量损失。在解码时,某些指令(例如分支、谓词操作和立即加载(“列表解析”))可以在前端执行并从管道中删除。这有点像较新的x86CPU如何消除重命名器中的寄存器到寄存器副本。但是您没有听错——Dojo不会通过管道跟踪“已消除”的指令以维持有序退出。其他处理器跟踪一切以退出,因此它们可以在任何指令边界停止并保持恢复执行所需的所有状态。这种能力被称为“精确异常”,现代操作系统使用它来提供各种好东西,比如分页到磁盘,或者告诉你代码在哪里搞砸了。特斯拉不关心精确的异常。Dojo确实有一个调试模式,其中更多指令通过管道以提供“更精确”的异常,但没有像普通乱序CPU那样的有序退出逻辑。Dojo'sExecutionEngine看到宽前端后,看到一个只有两个ALU和两个AGU的4宽整数执行引擎可能会有点奇怪。但是这个漏斗形的流水线是有道理的,因为一些指令在前端被执行和丢弃。Dojo也不会进入对标量整数性能很重要的客户端系统。因此,整数端提供足够的吞吐量来处理控制流和地址生成,以保持向量和矩阵单元的馈送。Dojo的向量和矩阵执行端放在核心流水线中的标量执行引擎之后,有两条执行流水线。两条管道听起来可能并不多,但Dojo在这些管道后面有非常广泛的执行单元。一条流水线可以执行512位向量,而另一条流水线可以执行8x8x4矩阵乘法。因此,只要指令公开足够的显式并行性,Dojo就可以实现非常高的吞吐量——尤其是在使用矩阵单元时。特斯拉声称具有354个Dojo内核的芯片在2GHz时可以达到362BF16TFLOPS,这表明每个内核每个周期可以执行512BF16FLOPS。我们不确定Dojo是否完全失灵。但特斯拉确实表示,整数端可以远远领先于矢量端,这表明它可以执行过去一直停滞直到其中一个调度程序填满的指令。缺乏有序退休也表明了无序执行能力。通常,实现乱序执行会带来很多复杂性。这是因为CPU必须按顺序执行指令。来自AMD、ARM和Intel的高性能CPU使用大型重新排序缓冲区(和其他结构)来跟踪指令,以便它们的结果可以按程序顺序提交。这意味着如果一个程序做了一些愚蠢的事情,比如除以零,这些内核可以准确地显示出哪条指令出错了。此外,它们还可以显示CPU状态,反映故障发生前所有指令的操作,但故障后则不然。这意味着您可以修复导致指令错误的任何内容并恢复执行。Dojo放弃了这个功能。作为交换,Dojo避免了与通过其管道跟踪每条指令相关的功率和面积开销,以确保结果按程序顺序交付。SRAM访问通常,我们会在这里讨论缓存。但是Dojo不能直接访问系统内存,所以我们将讨论1.25MB的SRAM块。它每个周期可以处理两个512位负载,使其成为支持AVX-512的英特尔CPU的每周期带宽匹配。特斯拉表示,SRAM有五个512位端口(2个加载端口、1个存储端口和两个到电网停止端口)。但是标量端只有两个AGU,这可能意味着内核无法承受每个周期两个512位加载和一个512位存储。因为Dojo的本地SRAM块不是缓存,所以它不需要与数据一起存储的标志和状态位。SRAM前面也没有L1D缓存,因此它必须足够快以处理所有加载和存储指令而不会出现瓶颈,即使它的大小更接近L2缓存。不将SRAM作为缓存实施可能是特斯拉保持低延迟的方式。如果我们回顾很久以前的AMD的Hammer架构,我们可以看到在检测到L1D未命中后需要8个周期才能访问1MB的L2(总延迟为12个周期)。如果直接寻址1MB的SRAM而不是用作缓存,则可以删除三个阶段,从而将延迟降低到5个周期:幻灯片来自早期的HotChips演示文稿,显示了L2缓存访问中涉及的内容流水线阶段。如果L2不是缓存,则可以跳过的阶段用红色标记。考虑到数十年的工艺节点改进,以及比Athlon更低的时钟速度目标,很容易看出Tesla如何以类似L1的延迟访问L2大小的SRAM块。跳过L1缓存当然可以节省面积和功耗。为了进一步减少延迟、面积和核心复杂性,Dojo没有虚拟内存支持。因此,它没有TLB或页面遍历机制(pagewalkmechanisms)。现代操作系统利用虚拟内存为每个进程提供自己的内存视图。程序使用的内存地址并不直接访问物理内存地址,而是由CPU利用操作系统设置的分页结构转换成物理地址。这就是现代操作系统如何将程序彼此隔离,并防止一个行为不当的应用程序导致整个系统崩溃。虚拟内存也是您可以运行比物理内存中更多程序的方式。当实际内存用完时,操作系统取消页面映射,将其写入磁盘,并为您的程序提供所需的内存。当其他坏程序试图访问该内存时,CPU试图将虚拟地址转换为物理地址,但发现转换不存在。CPU抛出页面错误异常,操作系统通过将逐出的页面读回物理内存并填充页表条目来处理该异常。这在Dojo上是不可能的。核心的4路SMT功能更多是关于向单个应用程序公开显式并行性,而不是提高多任务处理性能。例如,一个线程可以执行矢量计算,而另一个线程将数据从系统内存异步加载到SRAM(通过DMA)。为了进一步简化设计,Dojo可以只用21个地址位对SRAM进行寻址,从而简化了Dojo的AGU和寻址总线。这些权衡可能允许特斯拉以足够低的延迟访问此SRAM,以避免在其前面实施单独的L1数据缓存。内存访问当谈到系统内存时,Dojo芯片并没有直接连接到内存。相反,它们连接到配备HBM的接口处理器。这些接口处理器还负责与主机系统通信。具有25个独立芯片的Dojotile可以访问160GB的HBM内存Tesla表示他们可以从每个芯片的边缘跨tile边界传输900GB/s,这转化为以4.5TB/s设备的链路带宽访问接口处理,并且它的HBM。因为访问HBM需要经过单独的芯片,所以访问延迟会非常高。小了,怎么办呢?Dojo是一个8宽内核,至少具有一些OoO执行能力、不错的向量吞吐量和一个矩阵乘法单元。但即使有1.25MB的本地SRAM,它最终还是一个非常小的内核。相比之下,富士通的A64FX在同一工艺节点上占用的面积是其两倍多。处理器设计就是做出正确的权衡。特斯拉希望通过将大量内核封装到芯片上来最大化机器学习的吞吐量,因此单个内核必须很小。为了实现其区域效率,Dojo使用了一些熟悉的技术。它以保守的2GHz运行。较低的时钟电路往往占用较少的面积。它可能有一个基本的分支预测器和一个小的指令缓存。如果程序是代码密集型或有很多分支,这可能会牺牲一些性能。但特斯拉还通过删除运行内部工作负载不需要的功能来进一步减少功耗和面积使用。它们不执行数据端缓存,不支持虚拟内存,也不支持精确异常。结果是处理器核心提供了现代CPU核心的性能灵活性,同时在许多方面不如英特尔8086对用户和程序员友好。除了核心之外,Tesla还通过设计Dojo芯片来大规模节省芯片面积专门用于部署。物理实现缩小,Dojo内核在一个非常大的645平方毫米芯片上实现,称为D1。与我们熟悉的其他芯片不同,单个Dojo芯片不能自给自足。它没有DDR或PCIe控制器。die边缘周围有IO接口,允许die与相邻die通信,延迟约为100ns。要访问系统内存,DojoD1芯片必须与带有板载HBM的接口处理器通信。该接口处理器又通过PCIe连接到主机系统(接口处理器安装在PCIe卡上)。理论上,一个最小的功能性Dojo部署将涉及一个Dojo芯片、一个接口处理器卡和一个主机系统。但特斯拉在模块中部署了Dojo芯片,每个模块包含25个芯片,以提供规模感。DojoD1die专为构建超级计算机而设计,仅此而已。这种专业化节省了更多的管芯面积。DojoD1不会在DDR和PCIe控制器上占用空间。除了在外部设计用于与相邻芯片接口的定制IO连接器外,大部分芯片都被大量的Dojo核心占据。相比之下,设计时考虑到更多部署灵活性的芯片在IO上花费了大量空间。AMD的Zen1“Zeppelin”芯片很好地证明了这一点。Zeppelin可以直接连接到DDR4内存、PCIe设备、SATA驱动器和USB设备-非常适合客户要求。在服务器中,IFOP接口让它可以与相邻的芯片进行通信。位于IFOP附近的大块SRAM可能是监听过滤器,有助于在高内核数设置中有效地保持高速缓存一致性。Dojo不尝试维护跨内核的缓存一致性,也不使用任何SRAM进行监听过滤。从AMD在ISSCC2021上的小芯片演示来看,AMD通过将大约44%的“齐柏林飞艇”裸片面积用于内核和缓存以外的逻辑来为这种灵活性买单。Dojo仅将28.9%的芯片面积用于SRAM和内核以外的东西。最后的话TeslaDojo超级计算机背后的微体系结构展示了如何实现非常高的计算密度,同时仍然保持CPU处理分支代码的能力。要到达那里,您需要放弃定义我们现代计算体验的大部分舒适设施。如果您可以假设围绕Dojo核心构建您的桌面,那么使用过MS-DOS的任何人都可能会觉得这种体验很熟悉。您不能同时运行多个应用程序。一个行为不当的应用程序可能会迫使您重新启动系统。如果您没有足够的RAM来运行程序,您可以完全忘记运行它(无需分页到磁盘)。但这些权衡在特斯拉的超级计算机中非常有意义。Tesla不需要Dojo核心来同时处理多个正在运行的应用程序,Dojo只需要在内部运行可信代码。所以,特斯拉并不关心虚拟内存支持。同样,在Dojo上运行的机器学习程序将在编写时考虑到该特定系统。您不会有一堆可能要求比可用内存更多的任意程序。这意味着您不需要精确的异常(和虚拟内存)来允许过度使用内存、内存压缩或在磁盘之间交换内存页面等技术。精确异常对于调试也很有用,但特斯拉通过单独的调试模式以更便宜的方式做到了这一点。可以肯定的是,特斯拉为实现高计算密度而采取的权衡措施在消费者或服务器CPU中是不可能的。但他们在行动中很有趣,我们必须感谢特斯拉花时间用HotChips来展示它。在过去的二十年中,进程节点的改进一直在放缓,导致单线程性能的进步变慢。在过去五年中,电源和冷却限制一直在降低多线程性能。但对更多计算能力的需求并没有放缓,因此公司正在转向更专业的硬件以跟上步伐。Tesla的Dojo超级计算机中的架构是一个很好的例子,它说明了如何权衡取舍以增加计算密度,以及当前的趋势如何有利于为吞吐量受限的应用程序引入专用硬件。