从历史、产品、应用和平台这四个角度带你初步了解GPU

版权声明:本文为博主原创文章,转载请注明链接 https://blog.csdn.net/luroujuan/article/details/85881522

从历史、产品、应用和平台这四个角度带你初步了解GPU

GPU发展历史

GPU一开始只是为了图形加速,替CPU分担工作。其主要用于显示图像、视频的编解码与显示、游戏渲染等工作,起初并不支持编程。在1999年之前还没有GPU这一概念,只是称为图形加速卡,1999年8月,Nvidia公司推出了GeForce 256图形芯片,并提出了GPU概念。

随着GPU技术的发展,从2003年开始,Nvidia和ATI推出了可编程的GPU硬件设备,使开发人员根据需求灵活的控制图形渲染过程。同时,一些充满探索的程序员,开始借助于Direct3D和OpenGL将一些并行计算映射成图像渲染的过程,从而实现利用GPU加速程序的目的,这种开发方法被称为通用GPU编程(GPGPU)。但该方法开发难度大,开发人员需要懂得图像渲染知识和OpenGL编程知识。

2007年,Nvidia公司推出硬件设备GTX8800和GPU编程工具CUDA(Compute Unified Device Architecture,统一计算架构),自此开发人员可以利用类C语言进行并行程序开发,大大减低了GPU的开发难度。

2008年,OpenCL(Open Computing Language,开发计算语言)被推出,它是一套异构平台并行编程的标准,同CUDA一样也是一种并行编程的框架。利用该标准可以开发出跨平台的并行程序,不但可以在GPU上运行,还可以在CPU、DSP和FPGA上运行。OpenCL先由Apple公司设计,然后交由Khronos Group维护。

并行程序开发工具的推出,极大推进了开发人员利用GPU进行程序加速。随着并行加速需求的增加,GPU的发展越来越偏向于并行程序设计的方向,现在已有专门的GPU设备用于大规模的数据处理。例如,2012年Nvidia推出Kepler架构Tesla系列的GPU产品,专门用于高性能通用计算;2017年推出的Volta架构的Tesla V100,为深度学习专门设计了新的Tensor核心。

 GPU产品类型

目前GPU的主流生产厂商有三家:

Intel ——主要的集成(核心)显卡供应商

Nvidia——最大的显卡供应商,有集成显卡和独立显卡

AMD——第二大独立显卡供应商

Nvidia的GPU产品的系列比较多,下表展示了Nvidia显卡的主要系列。

开发人员专用显卡,Tesla K80、M6、P4、P100与V100对比如下:

嵌入式开发领域的Jetson TX2 模块(10W)与开发板

GPU应用形式

目前GPU相比于CPU,最大的优势在于核心的数量,以Intel Xeon处理器和Nvidia Tesla显卡为例,Intel(R) Xeon(R) E5-2630 v3拥有16个核心,理论上每秒浮点数计算量为307Gflops,NVIDIA Tesla K80的单个GPU用有2496个核心,理论上每秒浮点数计算量为4.1Tflops。可见GPU的浮点计算能力远高于GPU。

然而GPU并不能独立运行程序,GPU的程序运行依赖于CPU对其进行指令加载。目前来看,无论GPU运行速度有多快,都只是替CPU分担工作,它并不能取代CPU。所以在利用GPU加速计算时,都是GPU+CPU的组合架构。在这种架构中二者要分工明确,CPU主频高,更适合顺序处理任务,而GPU的核心多,擅长同时处理并行任务。

下图展示了CPU+GPU的组合架构。该架构下对于GPU加速而言,数据处理流程为:

  1. 数据从系统内存通过PCI-e总线传输到显存
  2. GPU处理显存数据
  3. 数据从显存再通过PCI-e总线传回到系统内存

在该架构中我们可以看出,PCI-e总线是连接CPU和GPU的重要桥梁,其传输速度会直接影响GPU性能的发挥,当总线传输带宽不能满足数据交换需求时,GPU需等待CPU端的数据,而无法全速运行。PCI-e总线速度跟插槽的通道数有关,常见的通道数为X8和X16,理论上PCI-e3.0 X16的最高传输速度上下行各为16GB/s,但在实际中并不能达到这个速度。

关于数据传输,上面只提到CPU与GPU之间的数据传输,其实GPU可以与其他GPU或第三方设备(直接数据采集、RAIO、FPGA)进行通信。这里提一项技术GPUDirect,该技术让GPU能够与PCI-e总线上的其它设备直接进行数据通信,而不必借助CPU复制数据,避免了额外的CPU处理时间。

在这里再提一项Nvidia推出的新技术NVLink,可以使GPU与CPU、GPU之间的数据传输速度最高达到150GB/s,但需要使用支持这项技术的CPU和GPU。

另外,有的GPU支持传输和计算重叠,既边传输边计算,这样传输时间可以被计算隐藏一部分,隐藏的比例与计算时间和传输时间的大小有关。

基于GPU核心多主频低和PCIe传输速度有限的特点,目前主要从以下三方面分析算法任务是否适合在GPU端实现:

1)计算量。GPU虽然核心多,但它的单个核心的时钟频率比较低,目前最高只有1.3GHz,而CPU可以达到3GHz。当任务的计算量太小时,GPU的处理速度可能比CPU慢。如果此时数据量又比较大,加上传输数据的时间,GPU端的运行时间要比CPU端长很多。因此,计算量小的程序应该尽量在CPU端实现。当然并不是所有计算量小的程序都不能在运行在GPU上,出于整体性能的考虑,有些计算量小的程序还必须在GPU端运行,这与数据传输有关系。比如,程序已经开始在GPU实现,在过程中遇到计算量小的函数,单从计算量上分析,该函数不应该在GPU上运行,但假如在CPU端实现,还需要将数据传给CPU,CPU处理完成还要将数据传回到GPU,数据传输的时间加上CPU的处理时间要比GPU的处理时间长,因此这种计算量小的函数依然应该在GPU端实现。

2)并行性。GPU的计算优势在于同一时间可以在同时运行上千个线程,如果算法的处理流程是串行的,那么就很难利用多核或多个线程去实现,这样的任务不适合在GPU端运行。但是如果这个串行算法被同时执行成百上千次,那么也可以考虑用GPU。

3)实时性。GPU的程序运行依赖于CPU通过PCIe总线进行驱动,其响应延迟要比CPU和DSP长,同时每一次处理的任务都涉及到数据来回传输,传输方面的最小开销都需要几十微秒,因此GPU不适合处理实时性要求很高的任务,比如微秒级别。

同时,在CPU+GPU的加速计算架构中,我们要清楚地认识到GPU执行的代码在整个项目中可能只占一小部分,因为并不是所有计算任务都能利用GPU实现加速。GPU适合对并行性的计算密集型任务进行加速。下图展示了GPU代码在项目中所占比重。

GPU开发平台

目前支持GPU编程的开发平台主要有两种CUDA和OpenCL。(当然还有OpenACC、ArrayFire,这里不做详细介绍)

CUDA(Compute Unified Device Architecture,统一计算架构)是Nvidia公司于2007年推出的GPU编程工具,它是一种架构,也是一种语言。作为一种架构,它包括硬件体系结构、软件体系结构以及CUDA程序如何映射到GPU上执行。作为一种语言,CUDA C以C/C++语法为基础,进行了一些扩展,对于熟悉C系列语言的开发人员来说,开发CUDA程序比较容易。目前CUDA只能在Nvidia显卡上运行,支持的操作系统有Windows、Linux、MacOs。使用CUDA的优势在于Nvidia对这一平台的大力维护,官方推出了很多库函数,方便开发人员进行代码移植,降低了开发难度。

OpenCL(Open Computing Language,开发计算语言)最早由Apple公司设计,现在由Khronos Group维护,它是异构平台并行编程的一套开放标准,也是一个编程框架。OpenCL的优势在于跨平台,同一份代码既可以在GPU上运行,也可以在CPU、DSP和FPGA上运行。但是OpenCL也有不足之处,虽然跨平台,因为不同硬件的实现形式不同,为了写出性能优异的代码,需要为不同平台做出相应的优化,而且目前有些硬件厂商对OpenCL的支持力度并不大,目前OpenCL可调用的库函数远没有CUDA丰富。

版权声明:本文为博主原创文章,转载请注明链接 https://blog.csdn.net/luroujuan/article/details/85881522

猜你喜欢

转载自blog.csdn.net/luroujuan/article/details/85881522