【执行架构】
另一种区分处理器的方式,是看它们对特定运行环境进行的优化。例如,云端和微型物联网设备上可能可以跑相同的软件,但在不同环境中使用的架构是完全不同的,它们对性能、功耗、成本、极端条件下的运行能力等要求都是不同的。
这可能是因为对低延迟的需求,或者是因为功耗的原因,一些原来针对云计算的软件,现在被逐渐放到设备端侧运行。虽然是不同的硬件架构,但大家自然希望拥有完全相同的软件栈,以便软件能够在两种场合跑起来。云端需要提供灵活性,因为它会跑不同类型的应用程序,而且用户众多。这要求服务器硬件又要有针对应用的优化,又要能提供不同的规模。
而机器学习任务也有自己的要求,在使用神经网络和机器学习构建系统时,你需要使用软件框架和通用软件栈,让网络编程并映射到硬件,然后你可以从 PPA 的角度让软件适配不同的硬件。这推动了“让不同类型的处理和处理器适应各种硬件”的需求。
这些需求是由应用定义的。举个例子,就像一家公司设计了一个用于图形操作的处理器,他们优化和加速图形跟踪,并执行诸如图形重新排之类的操作,还有其他像矩阵乘法之类的加速机器学习的蛮力部分。
而内存访问对于每个架构来说都是一个特殊的问题,因为当你构建加速器时,最重要的目标是让它尽量长时间保持满载,你必须将尽可能多的数据传送到 ALU,让它尽可能多地吞吐数据。
它们有许多共同之处,它们都有本地内存,有片上网络来进行通信,每个执行算法的处理器都在处理一小块数据,这些操作都由运行在 CPU 上的操作系统调度。
对于硬件设计人员,棘手之处在于任务预测。尽管在某些层面上会有类似的操作类型,但人们正在研究不同层面上差异。为了处理神经网络,需要几种类型的处理能力。这意味着你需要对神经网络的一部分进行某种方式的处理,然后在另一层又可能需要另一种处理操作,而且数据移动和数据量也是逐层变化的。
你需要为处理管线构建一整套不同的加速器,而理解和分析算法并定义优化过程,是涉及到完整体系结构的任务。就像对于基因组测序,你可能需要进行某些处理,但你不能用单一类型的加速器来加速所有东西。CPU负责管理执行流水线,对其进行设置、执行 DMA、进行决策。
当中可能涉及到分区执行的问题。没有任何一种处理器可以针对每种任务进行优化——FPGA、CPU、GPU、DSP都做不到。芯片设计商可以创建一系列包含所有这些处理器的芯片,但客户应用端的难点在于,他们要自己确定系统的各个部分要在哪些处理器上运行,是在 CPU 上?在 FPGA 上?还是在 GPU 上?
但无论如何,里面总是需要有 CPU 的,CPU 要负责执行程序的不规则部分,CPU 的通用性有自己的优势。但反过来,如果是专门的数据结构或数学运算,CPU就不行了。毕竟 CPU 是通用处理器,它没有针对任何东西进行优化,没有特别擅长的项目。