以服务于中国广大创业者为己任,立志于做最好的创业网站。

标签云创业博客联系我们

导航菜单

计算机软件工程师考试报考条件,全国计算机硬件工程师证考试时间

  

  在人工智能兴起的这几年,在高通的SoC中,苹果、三星、麒麟、联发科和谷歌   

  

  事实上,人们经常看到像“TPU、IPU、NPU”这样的名字。这些“XPU”有什么区别?真的有这么多不同的架构吗?还是厂商的概念营销?   

  

  要回答这个问题,半工程   

  

  收集了行业内的大量意见,整理成文件。原始链接:https://semiengineering.com/what-is-an-.   

  

  xpu .我们对此进行了精简和汇编,但文章的内容仍然非常硬核。做好心理准备。我们现在就走!   

  

     

  

  袁爱塔   

  

  从CPU及其开发模式来看,这些“XPU”大多不是真正的处理器。机器学习加速器是处理器的一种,但是它们有各种处理部件要加速。他们更像   

  

  GPU是特殊工作负载的加速器,有很多类型。   

  

  处理器的本质可以总结为三点,最后回到指令集架构(ISA):首先定义做什么,然后是I/O和内存(支持ISA   

  

  以及它试图完成的任务)。未来,我们会看到比过去两三年更多的创新和变化。   

  

  许多新架构不是单个处理器,而是不同类型处理器或可编程引擎的组合,它们存在于同一个SoC中。   

  

  或者在同一个系统中,将软件任务分配给不同的硬件或灵活的可编程引擎。所有这些处理器可以共享一个公共的   

  

  API,但执行域不同。在这个层次上,确实有各种不同类型的架构。   

  

  但现实是“XPU”的名字大多是营销,这些名字和缩写同时指代两件事:一是解释处理器的架构,比如   

  

  SIMD(单指令多数据),而另一个定义它正在寻址的应用程序段。因此,它不仅可以用来定义处理器架构,还可以用作品牌名称,如张量处理单元(TPU)。毕竟,制造商正在命名他们的架构,而不是单个处理器。   

  

  #历史   

  

  四十年前,命名的问题要简单得多。首先,它是人们最熟悉的中央处理器   

  

  虽然它有很多进化版本,但基本上都是冯诺依曼架构和图灵的完整处理器。每一个都有不同的指令集来提高处理效率,它也是针对复杂的指令集(CISC)。   

  

  并对精简指令集计算机优缺点进行了广泛的讨论。   

  

  后来RISC-V的出现给ISA带来了很大的关注。ISA为定义的任务定义了处理器的优化程度,人们可以检查ISA并开始计算周期。例如,如果一个   

  

  ISA有原生指令,运行在1GHz,所以我们可以将其与另一个ISA处理器进行比较,后者可能需要两条指令来完成相同的功能,但频率是   

  

  1.5GHz,孰强孰弱显而易见。   

  

     

  

  封装CPU的方式有很多种,有时候IO或者内存放在同一个封装里,后两种叫做MCU。当调制解调器流行时,数字信号处理器(DSP)   

  

  它们的不同之处在于,它们使用哈佛架构将指令总线和数据总线分开,其中一些还使用SIMD架构来提高数据处理效率。   

  

  指令和数据的分离是为了提高吞吐量(尽管它确实限制了自编程等边缘编程)。一般这里的边界条件不是计算,而是I/O。   

  

  或者记忆。该行业的重点已经从提高计算能力转移到确保有足够的数据来保持计算和性能。   

  

  当单个处理器的性能无法再提高时,请将多个处理器连接在一起。他们还通常使用共享内存来保持每个处理器和整个处理器集群的图灵完整。程序的任何部分在哪个核心上执行都没有关系,反正结果是一样的。   

  

  下一个重大发展是图形处理单元(GPU)的出现。GPU打破了常规,因为每个处理单元或流水线都有自己的内存,不能在处理单元之外寻址。因为内存大小有限,只能执行那些可以放入内存的任务,所以对任务本身有限制。   

  

  对于某些类型的任务,GPU非常强大,但它们的流水线非常长,这导致了延迟和不确定性。这些流水线允许GPU单元连续处理数据,但如果刷新流水线,效率会大大降低。   

  

  图形处理器和后来的通用图形处理器   

  

  定义了编程范例和软件堆栈,使它们比以前的加速器更容易使用。多年来,一些工作已经专业化,其中一些被用来运行连续的程序。   

  

  CPU,一种专注于图像显示,将我们带入高度并行世界的图形处理器,使用许多小的处理单元来执行任务(包括当前的机器学习任务)。   

  

  有没有什么架构规则可以用来解释所有的新架构?是的,也许片上网络(NoC)是一个合适的定义。过去,处理器阵列通常通过内存或固定网络拓扑(网状或环形)连接   

),而

  

NoC 让分布式异构处理器能以更灵活的方式进行通信。而将来,它们还可以在不使用内存的情况下进行通信。

  

现在的 NoC 是针对数据的,而未来的 NoC 也能发命令和通知等数据,可以扩展到那些加速器间不只是交互数据的领域。加速器阵列或集群的通信需求可能与 CPU

  

或标准 SoC 的通信需求不同,但 NoC 并不会将设计者限制在一个子集里,他们能通过满足不同加速器的特殊通信需求来优化和提高性能。

  

# 执行架构

  

另一种区分处理器的方式,是看它们对特定运行环境进行的优化。例如,云端和微型物联网设备上可能可以跑相同的软件,但在不同环境中使用的架构是完全不同的,它们对性能、功耗、成本、极端条件下的运行能力等要求都是不同的。

  

  

这可能是因为对低延迟的需求,或者是因为功耗的原因,一些原来针对云计算的软件,现在被逐渐放到设备端侧运行。虽然是不同的硬件架构,但大家自然希望拥有完全相同的软件栈,以便软件能够在两种场合跑起来。云端需要提供灵活性,因为它会跑不同类型的应用程序,而且用户众多。这要求服务器硬件又要有针对应用的优化,又要能提供不同的规模。

  

而机器学习任务也有自己的要求,在使用神经网络和机器学习构建系统时,你需要使用软件框架和通用软件栈,让网络编程并映射到硬件,然后你可以从 PPA

  

的角度让软件适配不同的硬件。这推动了“让不同类型的处理和处理器适应各种硬件”的需求。

  

这些需求是由应用定义的。举个例子,就像一家公司设计了一个用于图形操作的处理器,他们优化和加速图形跟踪,并执行诸如图形重新排之类的操作,还有其他像矩阵乘法之类的加速机器学习的蛮力部分。

  

而内存访问对于每个架构来说都是一个特殊的问题,因为当你构建加速器时,最重要的目标是让它尽量长时间保持满载,你必须将尽可能多的数据传送到

  

ALU,让它尽可能多地吞吐数据。

  

它们有许多共同之处,它们都有本地内存,有片上网络来进行通信,每个执行算法的处理器都在处理一小块数据,这些操作都由运行在 CPU 上的操作系统调度。

  

对于硬件设计人员,棘手之处在于任务预测。尽管在某些层面上会有类似的操作类型,但人们正在研究不同层面上差异。为了处理神经网络,需要几种类型的处理能力。这意味着你需要对神经网络的一部分进行某种方式的处理,然后在另一层又可能需要另一种处理操作,而且数据移动和数据量也是逐层变化的。

  

你需要为处理管线构建一整套不同的加速器,而理解和分析算法并定义优化过程,是涉及到完整体系结构的任务。就像对于基因组测序,你可能需要进行某些处理,但你不能用单一类型的加速器来加速所有东西。CPU负责管理执行流水线,对其进行设置、执行

  

DMA、进行决策。

  

当中可能涉及到分区执行的问题。没有任何一种处理器可以针对每种任务进行优化――FPGA、CPU、GPU、DSP都做不到。芯片设计商可以创建一系列包含所有这些处理器的芯片,但客户应用端的难点在于,他们要自己确定系统的各个部分要在哪些处理器上运行,是在

  

CPU 上?在 FPGA 上?还是在 GPU 上?

  

但无论如何,里面总是需要有 CPU 的,CPU 要负责执行程序的不规则部分,CPU

  

的通用性有自己的优势。但反过来,如果是专门的数据结构或数学运算,CPU就不行了。毕竟 CPU 是通用处理器,它没有针对任何东西进行优化,没有特别擅长的项目。

  

# 抽象层的改变

  

以前,硬件/软件边界由 ISA

  

定义,并且该内存是连续可寻址的。而涉及到多处理器时,一般内存定义也是也是一致的。但是可以想象,在数据流引擎中,一致性并不那么重要,因为数据会从一个加速器直接传到另一个加速器。

  

  

Speedster 7t FPGA结构图

  

如果你对数据集进行分区,那一致性会成为障碍,你需要对照和更新数据,并会占用额外的运算周期。所以我们需要,也必须考虑不同的内存结构,毕竟可用的内存就那么点。或许可以访问相邻的内存,但也会很快耗尽,然后无法及时访问。所以必须在设计中加以理解,而且是要在理解架构的情况下去设计它。

  

我们还需要更高级别的抽象层。有些框架可以将已知网络映射或编译到目标硬件上,例如在一组低级内核或

  

API,它们将在软件堆栈中使用,并最终由神经网络的映射器使用。在底层,你可能在用不同类型的硬件,这由你想要实现的目标来决定。反正就是用不同的硬件,不同的

  

PPA ,实现了相同的功能。

  

而这会给编译器带来很大的压力。主要的问题是你未来要如何对加速器进行编程?你是否搞了个像初代 GPU

  

那样串在一起的硬连线引擎?或者你是否构建了具有自己指令集的小型可编程引擎?现在你必须单独对这些东西进行编程,并将这些引擎中的每一个都与数据流连接起来,然后执行任务。

  

一个处理器拥有整个指令集的某个子集,另一个处理器拥有一个不同的子集,它们都将共享控制流的某些重叠部分,编译器得了解它的库并进行映射。

  

# 结论

  

  

Google 的 TPU

  

其实处理器的架构并没有改变,它们仍然遵守过去 40

  

年来一直遵循的规则。变的是芯片的构造方式,它们现在包含大量异构处理器,这些芯片根据各自的任务,对内存和通信进行优化。每个芯片都对处理器性能、优化目标、所需的数据吞吐量以及数据流做出了不同的选择。

  

每个硬件供应商都希望将自己的芯片与其他芯片区分开来,品牌推广比谈论内部技术细节要容易得多。厂商给自己的芯片起了“XPU”的名字,并将它与特定类型的应用联系起来,但“XPU”并不是关于某个特定硬件架构的名字。

  

就像 Google 把自己开发的专用集成电路(ASIC)叫做 TPU(Tensor Processing Unit)张量处理单元/处理器,但实际上 TPU

  

指代的,并非特定的硬件架构。