2.3 软硬件协作
2.2.3节讲了平台选择,但一般来说,除了CPU通用软件平台,其他平台通常都不是图灵完备的,需要和CPU一起协作来完成工作任务的处理。在本书中,我们约定如下。
·如果一个任务由CPU执行,那么我们可以称之为软件执行。
·如果一个任务或任务的一部分由协处理器、GPU、FPGA或ASIC执行,那么我们可以统称之为硬件加速执行。
·如果一个任务至少分为两个部分,一部分在CPU的软件中执行;另一部分在协处理器、GPU、FPGA或ASIC硬件中执行,并且这两个部分之间需要相互通信和协作,那么我们可以称此任务是软硬件协作完成的。
2.3.1 多平台混合架构
根据不同的层次,多平台混合架构(以下简称多平台)可以简单地分成如下三类。
·芯片级多平台,即在SoC(System on Chip,片上系统)芯片内部,不同架构处理器之间的协作。
·板级多平台,即在服务器主板及扩展板卡组成的SoB(System on Board,板级系统)上,不同架构处理芯片之间的协作。
·网络级多平台,即在多个不同架构服务器通过网络组成的SoN(System on Network,网络系统)上,不同服务器之间的协作。
1.SoC
智能手机使用电池供电,同时需要提供足够强大的性能,如此苛刻的应用条件,使得智能手机处理器通常都选用集成度非常高的SoC,它是典型的芯片级多平台。下面以高通骁龙810处理器为例对SoC进行简单介绍。如图2.3所示,高通骁龙810处理器主要包括如下模块。
·定位(Location):支持GPS、格洛纳斯、北斗、伽利略等导航系统。
·GPU(Adreno 430 GPU):支持OpenGL ES 2.0/3.1、OpenCL 1.2完整版、内容安全等功能。
·显示处理(Display Processing):支持4K、Miracast无线投影、图像增强等。
·基带(Modem):第四代产品,支持Cat6 LTE,最高3×20 MHz CA。
·USB 3.0.
·双路ISP(Dual ISPs):摄像头最高55MP、12GPix/s带宽。
·ARM Cortex系列A57及A53通用CPU(ARM Cortex-A57&Cortex-A53 CPUs):主要用于运行Android等智能手机操作系统及App。
·内存控制器(Memory):支持LPDDR4。
·专用DSP(Hexagon DSP):超低功耗传感器引擎。
·多媒体处理引擎(Multimedia Processing):支持4K编解码、骁龙语音激活、手势、工作室访问安全等功能。
图2.3 高通骁龙810处理器布局图
2.SoB
单个计算平台规模足够庞大,难以作为一个模块被SoC单芯片集成,而要独占整个SoC芯片的晶体管资源。因此,相比于SoC,SoB通常用于较大规模的计算场景。
CPU连接GPU的混合架构如图2.4所示,它属于典型的用于机器学习场景的GPU服务器主板拓扑结构,是一种典型的SoB。在此混合架构中,通过主板连接了2个通用CPU和8个GPU加速卡。2个CPU通过UPI/QPI相连;每个CPU均通过2条PCIe总线连接2个PCIe Switch(交换机);每个PCIeSwitch均连接2个GPU;另外,GPU间还通过NVLink总线相互连接。
图2.4 CPU连接GPU的混合架构
在该混合架构中,数据可以在两个CPU(的内存)、任意两个相连GPU(的内存)之间,以及通过PCIe Switch相连的CPU(的内存)和GPU(的内存)之间传输,通过CPU和GPU的相互协作,来完成既定的工作任务。
3.SON
网络级多平台(也称异构服务器的网络集群)通过网络连接众多的服务器,适用于大规模互联网应用的协同计算场景。
英特尔的机架级计算架构的资源解构如图2.5所示。英特尔的机架级计算(Rack Scale Compute,RSC)架构提供了一整套计算节点动态组织的解决方案:支持通过PCIe连接各个不同的平台(存储也可以理解成一个计算平台,同样的架构,存储的位置也可以由其他加速器平台代替);在架构不变的情况下,也可以通过网络来连接各个计算平台,来支持更大规模的资源解构。由于互联网系统通常要面对数以百万计的访问量,因此可以把整个系统解构到多台服务器,把数量众多的通用计算节点、存储节点、加速器节点等计算平台通过网络连接,从而组成一个相互协作的服务器集群。
图2.5 英特尔的机架级计算架构的资源解构
2.3.2 软硬件平台的协作
以基于CPU+GPU的异构计算架构为例来对软硬件平台的协作进行介绍。CUDA是NVIDIA创建的并行计算平台和应用程序编程接口(API)模型。CUDA允许软件开发人员使用具有支持CUDA功能的GPU进行通用处理。CUDA平台是一个软件层,可直接访问GPU的虚拟指令集和并行计算元素,以执行计算内核。
如图2.6所示,CPU视角的CUDA处理流程如下。
·CPU顺序执行任务,结束后把数据保存在CPU的内存中。
·将待处理的数据从CPU内存复制到GPU内存(图2.6中的①处理)。
·CPU指示GPU工作,配置并启动CUDA内核(图2.6中的②处理)。
·多个CUDA内核并行执行,处理准备好的数据(图2.6中的③处理)。
·处理完成后,将处理结果复制到CPU内存(图2.6中的④处理)。
·CPU把处理结果进行进一步处理,并继续做后续的工作。
图2.6 CPU视角的CUDA处理流程
说明:在GPU工作期间,CPU处于空闲状况,也可以把这段时间利用起来,用于处理其他工作任务。
如图2.7所示,我们按照在软件运行的部分任务和在硬件运行的部分任务之间的关系把软硬件协作分为如下两类。
·平行的软硬件协作。例如,CUDA线程间通信或服务器/客户端的交互,虽然双方可能有主动(Master)和从动(Slave)的区别,但本质上是相互平等的通信或交互。
·垂直的软硬件协作。如,分层的网络协议栈或很多大规模分层系统的上下层之间的服务调用,下层封装技术实现细节并为上层调用提供接口。
图2.7 平行和垂直的软硬件协作
平行模式和垂直模式本质上是一样的,一方面,双方各自完成自己的工作;另一方面,双方通过交互达到交换数据和信息的目的,最终实现软硬件平台间的工作协作。平行模式和垂直模式的区别主要在于逻辑上的调用关系,垂直模式主要是基于下一层提供的服务来完成本层的功能,并上一层提供服务;而水平模式则是两者相互调用、协作。
2.3.3 软硬件平台的交互
软件平台和硬件平台之间的协作一方面是双方各自完成自己的工作,更重要的一方面则是通过交互来实现相互间的协作。我们通过一个简单的交互模型来理解软硬件平台之间的交互。
软硬件交互模型如图2.8所示。
图2.8 软硬件交互模型
其中,软件负责如下三部分工作。
·硬件的控制:包括硬件的配置、运行控制等。
·软件数据处理:当我们讲软硬件协作的时候,意味着软件不仅要参与控制面的处理,也要参与数据面的处理。如果软件处理在前,则需要软件完成处理后按照软硬件之间的约定把数据在内存准备好;如果硬件处理在前,则等待硬件处理完成并按照约定把数据写入内存中后,再由软件处理。
·数据交互处理:如果数据从软件传到硬件,则需要软件先把数据准备好,然后通过操作寄存器或发送指令的方式通知硬件处理,硬件把数据搬运到硬件之后,告知软件释放内存;如果数据从硬件传到软件,则需要软件预先提供内存位置,然后硬件把数据写到预定的内存中并通过中断等方式告知软件,软件处理数据并释放内存。
硬件主要负责如下两部分工作。
·硬件数据的输入和输出:负责跟软件交互,把数据从内存搬运到硬件内部缓冲(数据输入),等待处理;或者把处理后的结果从内部缓冲搬运到内存(数据输出)。
·硬件的数据处理:硬件数据在内部缓冲准备好后,硬件把数据加载到硬件内部的处理引擎进行相应的处理,并把结果写到内部缓冲。