近些日子,隔三差五就会有新处理器架构的发布,然后我们常会见到几个缩写字母TPU、IPU、NPU…… 但我们真正能区分它们是什么?真的有那么多独特的处理器架构吗?
2018年,John L. Hennessy和David A. Patterson发表了题为“计算机架构的新黄金时代”的图灵演讲。他们集中讨论的是CPU及其演变方式,但这只是整个方程式的一小部分。Arteris IP的研究员和系统架构师Michael Frank说:“CPU从本质上来讲,这些东西大多数并不是真正意义上的处理器。它们更像是一个GPU,一个用于特殊工作负载的加速器,而且它们内部有相当多的多样性。机器学习(ML)是一类处理器,你可以把它们都称为ML加速器,但它们所加速的处理部分有很大的不同。”
Xilinx的营销总监Manuel Uhm说:“一个处理器的本质可以归结为三点。归根结底,它确实是回到了指令集架构(ISA)。这定义了你要做什么。然后你有I/O和内存,它们支持ISA和它要完成的任务。这将是一个非常有趣的时代,因为我们将看到比过去二、三十年来更多的创新和变化。”
许多新的架构都不是单一的处理器。Cadence的技术和战略营销总监Pierre-Xavier Thomas说:“我们看到的是不同类型的处理器或可编程引擎的组合。它们在同一个SoC或同一个系统中,软件任务被分派到不同的硬件或灵活的可编程引擎。所有的处理器可能共享一个通用的API,但执行领域将是不同的。所以你会看到具有不同特征的不同类型的处理。”
事实是,大部分的命名都只不过是营销手段而已。Imperas的CEO Simon Davidmann说:“最关键的是,人们使用这些名字和首字母缩写有两个不同的目的。一个是用于解释处理器的架构,如SIMD(Single Instruction Multiple Data)。
另一个是定义它所处理的应用段。因此,它既可以定义处理器架构,也可以定义一个品牌名称,如Google的TPU(Tensor Processing Unit)。他们在给自己的异构或同构架构命名,而不是单一的处理器。”
补一下历史课
40年前,事情要简单得多。当时的CPU虽然有许多变种,但基本上都是冯诺伊曼架构、图灵完备的处理器。每种处理器都有不同的指令集,使它们在执行某些任务时更有效率,关于复杂指令集(CISC)与精简指令集(RISC)的相对优势有很多讨论。
RISC-V的出现使人们对ISA产生了极大的关注。Xilinx的Uhm说:“人们想了解ISA,因为正是ISA定义了处理器对一个确定任务的优化程度。他们可以查看ISA,然后开始计算周期。如果一个ISA有一条本地指令,并以1GHz的速度运行,那么我可以将其与另一个处理器ISA进行比较,后者的相同功能可能需要两条指令,但处理器以1.5GHz运行。哪一个能让我走得更远?他们为重要的功能做了计算。”
CPU有很多封装方式,有时将IO或内存放在同一个封装中,称为MCU。
当调制解调器成为时尚时,DSP出现了。它们之所以不同,因为它们使用哈佛架构。这将指令总线与数据总线分开。其中一些还实现了SIMD架构,提高了数据处理效率。
指令和数据的分离是为了提高吞吐率,尽管它限制了一些可以进行的边缘编程,如自写程序。Uhm说:“通常情况下,边界条件不是计算,而是越来越多的I/O或内存。业界从提升计算能力,转而确保有足够的数据来保持计算能力并维持性能。”
当单个处理器不再变得更快,多个处理器被连接在一起,通常共享内存,并保持每个处理器和总的处理器集群保持图灵完备的概念。一个程序的任何部分在哪个核上执行并不重要,其结果是一样的。
下一个重大发展是GPU,它打破了这个模式,因为每个处理元素或管道都有自己的内存,不能在处理器之外寻址。由于内存是有限的,这意味着它不能执行任何任意的处理任务,只能执行那些能适合所提供的内存空间的任务。
Uhm指出:“对于某些类型的功能来说,GPU是非常强大的处理器,但它们有极长的管道。这些管道使GPU单元不断地压缩数据,但在某些时候,如果你必须冲刷管道,那就是一个巨大的打击。系统中存在大量的延迟和非确定性。”
虽然已经定义了许多其他加速器,但GPU以及后来的通用GPU(GPGPU)定义了一种编程范式和软件堆栈,使它们比过去的加速器更容易接近。Imperas的Davidmann说:“多年来,某些工作已经被专门化了。以前有CPU,用于顺序程序。还有GPU,它专注于屏幕上的数据操作,把我们引入了一个高度并行的世界。任务是使用许多小的处理元件来执行的。而现在有了ML任务。”
还有什么其他的构造规则要被打破,可以解释所有的新架构?在过去,处理器阵列通常通过内存连接,或固定的网络拓扑结构,如网状或环状。最近出现的是加入了NoC(Network on Chip),使分布式的异构处理器能够以更灵活的方式进行通信。在未来,它们也可能在不使用内存的情况下实现通信。
Arteris的Frank说:“在这一点上,NoC只携带数据。在未来,NoC可以扩展到其他领域,加速器之间的通信超越了数据。它可以发送命令,可以发送通知,等等。加速器阵列或加速器海洋的通信需求可能与CPU或标准SoC等的通信需求不同。但芯片上的网络并不局限于一个子集。你可以通过支持加速器的特殊通信需求来优化和提高性能。”
执行架构区分处理器的一种方式是为特定的操作环境进行优化。例如,软件可能在云端运行,但你也可能在一个微小的物联网设备上执行相同的软件。执行架构会非常不同,在性能、功耗、成本或在极端条件下的运行能力方面实现不同的操作点。
Cadence的Thomas说:“有些应用是针对云的,而现在我们把它们带到了边缘。这可能是因为延迟的要求,或者是能量或功耗的要求,这就需要一个不同的架构。你可能希望有完全相同的软件堆栈,能够在两个地方运行。云端需要提供灵活性,因为它将接收不同类型的应用,并且必须能够聚集大量用户。这就要求服务器上的硬件具有特定的应用能力,但一刀切的做法并不适合所有应用。”
ML增加了它自己的要求。Thomas补充说:“当用神经网络和ML构建智能系统时,你需要对新的网络进行编程,并将其映射到硬件上,使用软件框架和通用软件堆栈。然后你可以从PPA的角度将软件应用调整到合适的硬件。这推动了对不同类型的处理和处理器的需求,以便能够在硬件层解决这些需求。”
这些需求是由应用定义的。Frank说:“一家公司创造了一个用于图形操作的处理器。他们优化并加速了如何跟踪图形,并进行图形的重新排序等操作。还有一些公司主要加速ML的蛮力部分,也就是矩阵乘法。内存访问对每个架构来说都是一个特殊的问题,因为当你构建一个加速器时,最重要的目标是让它保持忙碌。你必须让ALU获得尽可能多的数据。”
这些应用有许多共同点。Davidmann说:“它们都有一些本地内存,它们在芯片上有一个网络来进行通信,每个处理器执行一个软件算法,都在对一小块数据进行处理。这些工作由一个在更传统的CPU上运行的操作系统来安排。”
对硬件设计者来说,棘手的地方在于预测它将执行哪些任务。Thomas说:“虽然在一些层中会有类似的操作类型,但人们正在关注各层中的差异化。为了能够处理神经网络需要几种类型的处理能力,这意味着你需要能够以某种方式处理神经网络的一个部分,然后可能需要另一种类型的操作来处理另一层。数据移动和数据量也在一层一层地变化。”
这种差异化可以超出数据移动的范围。Frank说:“对于基因组测序,你需要做特定的处理。但你不能用单一类型的加速器来加速一切。你必须为管道建立一套完整的不同的加速器。CPU成为监护执行流程的守护者。它设置事情,做DMA,提供中间的决策过程。理解和分析算法并定义如何优化它们的处理是一项完整的架构任务。”
这个过程的一部分需要进行分区。Uhm说:“没有一种处理器类型是为每一个处理器任务而优化的,FPGA、CPU、GPU、DSP都不行。我们创造了一系列包含所有这些的设备,但客户方面的困难是,他们必须提供智能,以确定这整个系统的哪些部分要针对处理器,或针对可编程逻辑,或针对AI引擎。每个人都希望有一个自动魔法工具,一个可以立即决定把这个放在CPU上,把那个放在FPGA上,把那个放在GPU上的工具。这种工具目前并不存在。”
尽管如此,CPU始终会有一个角色。Frank说:”CPU需要执行程序的不规则部分。CPU的一般可编程性有其优势。只是如果你有专门的数据结构或数学运算,它就不能很好地工作。CPU是一个通用处理器,它没有为任何东西进行优化。它什么都不擅长。”
改变抽象性
在过去,硬件/软件的边界是由ISA定义的,而且内存是可连续寻址的。当存在多个处理器时,它们通常是内存一致的。
Frank说:“一致性是一种契约。它是代理之间的契约,‘我向你保证,我将永远向你提供最新的数据’。平等同行之间的一致性是非常重要的,不会消失。但你可以想象,在一个数据流引擎中,一致性就不那么重要了,因为你传输的是在边缘移动的数据,直接从一个加速器到另一个。如果你对数据集进行分割,一致性就会受到影响,因为它会花费你额外的周期。你必须要查找东西。你必须提供更新的信息。”
这就需要不同的内存架构。Uhm说:“你必须考虑内存结构,因为你只有这么多紧密耦合的内存。你可以访问相邻的内存,但你很快就会耗尽相邻的内存。设计中必须理解这一点。随着工具的成熟,更多东西将开始由工具来理解。今天,它是由人类的智慧完成的,通过理解架构并应用它。”
还需要更高层次的抽象。Thomas说:“有一些框架可以将已知的网络映射或编译到目标硬件上。你有一套低级内核,或API,将在软件堆栈中使用,然后最终由神经网络的映射器使用。在这之下,你可能有不同类型的硬件,这取决于你想实现的目标,取决于你的产品细节。它实现了相同的功能,但不是用相同的硬件,也不是基于相同的PPA权衡。”
这给那些编译器带来了很大的压力。Frank问道:“主要的问题是你在未来如何对加速器进行编程?你会实现像第一代GPU那样将硬连线引擎串在一起?或者你建立了有自己的指令集的小型可编程引擎?而现在你必须对这些东西进行单独编程,并将这些引擎中的每一个,执行任务的引擎用数据流连接起来。一个处理器有总指令集的一些子集,另一个有不同的子集,它们都将共享控制流的一些重叠部分。你可能有一些有稍微不同的加速能力。编译器,或了解它的库,会相应地进行映射。”
结论
处理器架构并没有改变。它们仍然遵守过去40年中存在的相同选择。正在改变的是芯片的构造方式。它们现在包含大量的异构处理器,这些处理器的内存和通信都是为应用任务的一个子集而优化的。每个芯片都对处理器的能力和它们被优化的内容、所需的数据吞吐量以及通常会看到的数据流做出了不同的选择。
每个硬件供应商都想把自己的芯片与其他的芯片区分开来,但是通过品牌效应来做到这一点要比谈论内部的技术细节容易得多。因此,他们都号称是什么第一、最快、最大,并将其与特定类型的应用问题挂钩。这些三个字母的缩写已经成为应用任务的名称,但它们并没有定义硬件架构。
[参考文章]
What is a XPU — Brain Bailey