软硬件融合:超大规模云计算架构创新之路
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 软硬件划分

指令是软件和硬件交互的媒介。软硬件划分其实就是确定指令复杂度的过程。根据指令复杂度划分出五个典型的计算平台:CPU、协处理器、GPU、FPGA和ASIC,它们的指令复杂度依次增大,也依次从软件平台转向硬件平台。

2.2.1 三个维度

我们可以列举如下形象示例。

·团队A的每个工人可以在单位时间内加工5个零件,团队B的每个工人可以在单位时间内加工8个零件。

·团队A的单位时间是3分钟,一小时拥有20个单位时间;团队B的单位时间是5分钟,一小时拥有12个单位时间。

·团队A有10个人,团队B有20个人。

·在一小时内,团队A可以完成1000个零件的加工,团队B可以完成1920个零件的加工。

需要通过以下三个维度衡量一个处理器的性能。

·指令复杂度。类比于上述示例中单位时间内加工的零件数量,指令复杂度指的是单个指令计算量的密度。

·运行速度,即运行频率。类比于上述示例中一小时内的单位时间数量,运行频率指的是1秒时钟周期的数量。

·并行度。类比于上述示例中团队的成员数量,并行度指的是多个并行处理。

1.指令复杂度

CPU和GPU是硬件,基于CPU和GPU运行的程序是软件。相对于DSP(数字信号处理器)、GPU等,我们一般也称CPU为通用处理器。CPU(不考虑协处理器)支持的指令称为通用指令,包括整形计算类、浮点类、数据传输类、控制类等指令。相比于通用指令,一些复杂指令(复杂指令需要复杂的硬件逻辑来处理)需要使用专用的硬件处理单元,比如,SIMD(Single Instruction Multiple Data,单指令流多数据流)类和MIMD(MultipleInstruction Multiple Data,多指令多数据流)类指令需要运行于GPU。

对硬件加速单元(Accelerator,从设计架构的角度来看,就是ASIC,见表2.2中的相关描述)来说,指令是对算法的一次处理。例如,对于2.1.3节介绍的DES算法,其设计指令为一次64bit DES计算。CPU对DES的一次处理需要上百条指令,而DES硬件加速器对DES的一次处理只需要1条指令,可见DES硬件加速器指令的复杂度远大于CPU指令的复杂度。

指令复杂度和编程灵活性是两个互反的指标:指令越简单,编程灵活性越高软件灵活性真好;指令越复杂,性能越强,受到的限制越多,软件灵活性越差。

我们在通过定制硬件加速器的方式来获得性能提升的同时,会失去软件应有的灵活性。

2.运行频率

运行频率越高,计算速度越快。若不考虑其他因素的制约,则计算速度和运行频率为正比关系。而运行频率受电路中关键路径(延迟最大路径)的约束,二者为反比关系:关键路径越短,运行频率越高。

运行频率与电路逻辑的关系如图2.1所示。运行频率受关键路径制约,而关键路径与如下两个因素有关。

·关键路径所包含门的数量:从前一级寄存器到后一级寄存器之间的最长路径所包含的逻辑门的数量。

·单个逻辑门的延迟时间。逻辑门的延迟时间与半导体生产工艺有关,在一般情况下,半导体工艺尺寸越小,单个逻辑门的延迟时间越短。

图2.1 运行频率与电路逻辑的关系

逻辑门的延迟时间越短,或者两级寄存器之间的逻辑门数量越少,运行频率越高,计算速度也就越快。要想缩短逻辑门延迟时间,就需要采用更先进的工艺;要想减少两级寄存器之间逻辑门的数量,就需要采用更多级的流水,因为每一级流水所做的事情越少,所需要的逻辑门也就越少。

3.并行度

并行设计在硬件逻辑设计中很常见。以下是一些常见的并行度设计项目。

·指令流水线。指令流水线是一种时间并行机制,在同一时刻有多条指令处于流水线的不同阶段,相当于多条指令并行处理。

·指令多发射(Multiple Issue)。指令多发射是种空间并行机制一条流水线从指令缓冲区一次发送到译码阶段就有多条指令,在执行阶段也是多条指令并行。

·超线程(Hyper-Thread)。在一个处理器核内部,多组不同的指令流处理分时共享处理器核内部的各种硬件资源,以实现更佳的资源利用率并提升整体性能。

·多总线。多总线设计可以进一步增加处理器的数据处理带宽。

·多核技术。通过一些内部互连总线把多个处理器核集成到一块芯片上,以此来提升综合性能。

·多处理器芯片。受限于芯片工艺、功耗水平、设计架构,单芯片内的多核互连不能无限制增加,也可以通过一些芯片互连技术把多个CPU芯片连成一个NUMA系统。当前比较常见的是2~8个CPU芯片互连的架构。

·总线。对并行总线来说,增加数据线的宽度可以显著增加总线的带宽,并行总线一般用于芯片内部逻辑通信。对于串行总线,以PCIe为例,相比于并行总线PCI,PCIe不仅可以快速提升频率,还可以通过将很多组串行总线进行组合来提升传输性能,串行总线一般用于芯片间数据通信。

·异构计算单元。CPU、GPU、xPU及各种硬件加速器可以组成异构多处理单元,共同协作完成工作任务,CPU主要承担控制和数据交互的角色。

·多服务器集群。大型互联网系统需要成百上千的服务器,包括业务处理、网络处理、存储和数据库处理等不同功能的服务器,这些服务器共同组成性能强大且运行稳定的系统对外提供服务。

不同方向、不同层次的并行技术都可以提升硬件系统的性能。如果我们把不同复杂度的单位处理都当作指令,那么我们就可以通过IPC(InstructionPer Cycle)来评价并行度。对一个CPU核来说,IPC代表的是每个周期执行的指令数量;对一个硬件加速模块来说,IPC代表的是一个周期所能进行单位处理的数量。

2.2.2 综合分析

我们通过指令复杂度、运行频率、并行度三个维度对CPU、协处理器、GPU、FPGA和ASIC五种硬件平台进行定性分析(受不同硬件平台、型号、架构实现和工艺的影响,很难对每个维度给出定量的分析数据),具体如表2.4所示。

表2.4 五种硬件平台性能定性分析

由图2.2可知,不同硬件平台具有不同的灵活性和性能。

·CPU:通用指令的处理器,指令最简单,具有最高的灵活性,但具有最差的性能。通常所说的某个任务或算法运行在软件,即指用编程实现任务或算法,并将它们运行于CPU。

·协处理器:现代处理器通常都会支持一些扩展指令集,如英特尔的AVX及ARM的NEON等。这些扩展指令集的计算在扩展的执行模块中进行,一般把这些处理扩展指令集的执行模块称为协处理器。相比CPU,协处理器的灵活性稍差,但在一些特定应用场景能够提升性能。例如,把Intel Xeon的AVX-512扩展指令集用于机器学习推理场景,可以获得比使用CPU明显的性能提升。

·GPU:图形处理单元,采用并行架构设计,内部有上千个计算单元,可以并行执行上千个线程。GPU 具有比较折中的灵活性和性能。由于图形计算都是以向量计算为主的,因此GPU非常擅长对类SIMD/MIMD指令的处理。NVIDIA提供的CUDA计算框架降低了GPU软件开发的门槛,并且能够充分利用GPU的计算性能。

·FPGA:一般实现特定的任务或算法加速器设计。从设计架构的角度来看,FPGA和ASIC是一致的,二者的主要区别在于,FPGA付出的代价是运行频率降低和硬件成本增加,但获得了硬件可编程的灵活性。

·ASIC:实现特定的任务和算法。ASIC与FPGA的区别是,其硬件电路是不可更改的。与FPGA相比,ASIC的优势是可以获得更高的运行频率和更强劲的性能。ASIC是这五个硬件平台中灵活性最差的,只能用于特定应用场景。

图2.2 CPU、协处理器、GPU、FPGA、ASIC的对比分析

从设计角度来看,FPGA和ASIC都可以实现基于特定任务或算法处理的硬件加速模块,也就是我们通常所说的硬件加速器。

纯硬件没有意义,即使是硬件加速单元,也离不开软件的参与,至少都需要软件驱动来初始化和配置模块,以此来控制模块的运行。DSA在ASIC基础上做了一定程度的“妥协”回调,也就是说,DSA在ASIC针对特定应用场景的基础上定义了少量指令,以此来提升ASIC的灵活性。DSA仍然属于ASIC的范畴,作为ASIC的特例或升级。我们会在7.4节详细介绍DSA,以及基于DSA的异构加速。

2.2.3 平台选择

由2.1.3节SHA-256在不同平台上的性能可知,平台选择具有如下规律。

·CPU通用软件平台。每个新的应用最早通常都是基于软件实现的:一是因为软件实现所需要的代价较小,可以快速实现想法;二是因为CPU灵活性很好,在不考虑性能的情况下几乎可以处理任何应用场景的任务。

·协处理器扩展指令加速平台。随着技术的演进,对平台性能提出了一些要求,这个时候,可以针对一些比较消耗CPU资源的程序进行一定的编程和编译优化。

·GPU向量及并行加速平台。随着技术的进一步演进,当我们能从算法中寻找到更多的并行性时,我们就可以找一些专用的处理器(如GPU、DSP、NPU等),通过特定的并行优化,以及支持向量(SIMD)、多指令并行(MIMD/VLIW)等复杂指令编译优化的方式,深度优化平台性能。

·FPGA硬件可编程加速平台。随着技术不断成熟,应用的规模越来越大,也越来越消耗资源。这个时候,我们值得花费更多的精力,提炼出复杂度非常高或可以当作非常复杂指令的算法,通过硬件逻辑实现平台加速,再通过FPGA硬件可编程的方式快速落地。

·ASIC 定制加速平台。随着技术更加成熟、稳定,当应用规模足够庞大时,就非常有必要为此应用场景定制开发ASIC,来达到最优的性能、最低的成本、最小的功耗。

当需要面向一个新领域开发的时候,要快速实现,或者应用的场景不够确定,需要硬件平台有足够的适应性,这些情况使用CPU比较合适。当需要极致的效率,并且成本、功耗敏感,规模足够庞大时,选择定制开发ASIC会更合适一些。如果既需要有一定的灵活性,又要保证一定的性能加速,并且应用有足够的并行度,那么使用GPU更合适一些。