计算机最重要的处理器就是中央处理单元(Central Processing Unit,CPU),它是计算机的控制核心。CPU需要很强的通用性来处理各种不同的数据类型,同时在大量的逻辑判断中包含了大量的分支跳转和中断处理,使得CPU的内部结构异常复杂,不适用于快速计算。为了能够更加高效率地执行计算任务,工程师们研发了专门的处理器,即图形处理器(Graphics Processing Unit,GPU),这是当下最主流的计算芯片,下面简单对其进行介绍。
GPU是用于处理图形信号的单芯片处理器,在独立显卡中,一般位于PCB(印刷电路板)的中心。GPU是专为图像处理设计的处理器,它的存储系统实际上是二维的分段存储空间,包括区段号(从中读取图像)和二维地址(图像中的 X 、 Y 坐标)。GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑,并且省去了缓存。
图1.16 GeForce256显卡
第一款真正意义上的显卡GeForce256(见图1.16)由NVIDIA于1999年推出,其具有完整的顶点变换、光照计算、参数设置及渲染四种3D计算引擎,极大地加快了计算机3D程序的运行速度,减轻了CPU的负担。
尽管GeForce256中的固定管线能实现完整的3D图形计算,但其处理算法固定,弊端日渐凸显,因此人们开始考虑一种可编程的GPU。于是,NVIDIA推出了GeForce3,ATI推出了Radeon8500,这就是第二代GPU。从1999年到2002年,GPU都是以这种独立的可编程架构设计发展的。但此时的GPU编程能力有限,直到2003年第三代GPU被推出后,这一问题才得到改善。特别是2006年NVIDIA与ATI分别推出了CUDA(Computer Unified Device Architecture,统一计算架构)编程环境和CTM(Close To Metal)编程环境,使得GPU通用计算编程的复杂性大幅度降低。
GPU的发展历程可以从并行体系结构的角度划分为以下三个时代。
(1)固定功能架构时代。这个时代是1995—2000年,期间各硬件单元形成一条图形处理流水线,每个流水线功能固定,硬化了一些给定的函数,其计算模型是流式计算(Stream Computing)。GPU卸去了CPU的计算负担,聚焦于图形绘制功能,促进了图形学的发展。
(2)分离渲染架构时代。这个时代是2001—2005年,此时GPU用可编程的顶点渲染器(Vertex Shader)替换了与变换和光照相关的固定单元,用可编程的像素渲染器(Pixel Shader)替换了纹理采样与混合相关的固定单元。这两部分是实现图形特效最密集的部分,使用渲染器大大加强了图形处理的灵活性与表现力。
但是,分离渲染架构有不均衡的渲染负担缺陷,如图1.17所示。
图1.17 分离渲染架构中不均衡的渲染负担
图1.17(a)中,图片有比较复杂的几何结构,但颜色并不丰富,因此与几何结构渲染相关的顶点渲染器远比与颜色相关的像素渲染器负担重;而图1.17(b)中则相反,与颜色纹理渲染相关的像素渲染器远比与几何结构渲染相关的顶点渲染器负担重,因此需要更先进的架构来提高硬件使用效率。
(3)统一渲染架构时代。从2006年开始到现在,GPU技术一直处于统一渲染架构时代。在这一时代,GPU首次提供几何渲染程序(Geometry Shader Program)功能,并动态调度统一的渲染硬件来执行顶点、几何和像素程序,在体系结构上不再是流水线的形式,而呈现并行机的特征。
统一渲染架构可以自适应调整渲染负担,从而解决分离渲染架构中不均衡的渲染负担的问题,如图1.18所示。
图1.18 统一渲染架构解决不均衡的渲染负担问题
在图1.18(a)中,可以给顶点渲染器更多计算资源;而在图1.18(b)中,可以给像素渲染器更多计算资源。
如今GPU厂商们开始从硬件和API上对GPU提供专门的支持,且推出专门做通用计算的GPU(如AMD FireStream和NVIDIA Tesla)。GPU的服务对象也从以图形为主发展为图形和高性能计算并重。
我们知道,GPU有着高速的浮点运算能力,那么其计算能力到底有多强呢?CPU的浮点运算能力一般在10 GFLOPs(每秒可进行10亿次浮点运算)以下,而目前的TITAN V峰值浮点性能(特指深度学习)为110 TFLOPs,可以看出GPU的浮点运算能力远超CPU。
GPU特殊的硬件架构突出了其对CPU的优势:拥有高带宽的独立显存;浮点运算性能高;几何处理能力强;适合处理并行计算任务;适合进行重复计算;适合图像或视频处理任务;能够大幅度降低系统成本。
GPU非常适合做并行计算和密集型计算,随着NVIDIA等企业GPU产品线的成熟,面向个人和企业的GPU相继面世,并快速迭代。
虽然GPU的运算能力远远强于CPU,但并不能以这个作为唯一指标来比较,我们把CPU称为Compute-bound Computation Platforms,对于这类设备来说,算力是它们的瓶颈;而GPU被称为Memory-bound Computation Platforms,对于这类设备来说,内存数据的移动等是它们的瓶颈。在硬件平台上运行模型时,不仅包括模型推理计算,还包括输入/输出数据的处理,因此运行效率并不只依赖算力,第2章会介绍更多与性能相关的指标。