《基于CUDA的并行程序设计》学习笔记(二)
第2章 GPU概述
2.1 显卡、GPU和CUDA
在进入CUDA编程学习之前,我们需要先搞清楚几个概念:显卡、GPU和CUDA分别是什么。
2.1.1 显卡
显卡(Video card,Graphics card)全称显示接口卡,又称显示适配器。显卡接在电脑主板上,它将电脑的数字信号转换成模拟信号让显示器显示出来。显卡分为独立显卡和集成显卡两种。
2.1.2 GPU
GPU(Graphic Processing Unit)这个概念是由Nvidia公司于1999年提出的,GPU是显卡上的一块芯片(集成显卡和独立显卡上都有GPU)。最初GPU仅用来图形渲染,后来将其用于浮点运算。为了让GPU能进行浮点运算,最初是把浮点运算做一些处理,包装成图形渲染任务,然后交给GPU来做。这就是GPGPU(General Purpose GPU)的概念。不过这样做有一个缺点,就是你必须有一定的图形学知识,否则你不知道如何包装。
2.1.3 CUDA
为了让不懂图形学知识的人也能体验到GPU运算的强大,Nvidia公司又提出了CUDA的概念。 CUDA™是一种通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。 开发人员现在可以使用C语言来为CUDA™架构编写程序,从而可以更加方便的利用GPU强大的计算能力,而不是像以前那样先将计算任务包装成图形渲染任务,再交由GPU处理。
注:不是所有的GPU都支持CUDA
2.2 多核CPU和GPU的协同工作原理
下图为CPU和GPU的硬件连接方式。在CPU+GPU异构系统中,CPU作为主处理器(host),主要执行控制逻辑和事务处理等串行计算;而GPU作为协处理器(co-processor)或者设备(device),主要执行计算密度高、逻辑分支简单的大规模数据并行计算。CPU和GPU通过PCI-E总线相连,同时拥有各自的存储空间,分别是主存和显存。
从协同工作的角度来说,可以把应用程序中具有数据并行性且计算密集的部分任务交给GPU来处理,拥有较多流程控制和逻辑控制的部分任务交给CPU处理。
CPU+GPU异构系统中的执行一般可以分为三个步骤:第一步,将待处理的数据从主机端主存复制到设备端显存;第二步,调用GPU执行;第三步,将计算结果从设备端显存复制到主机端主存。如下图所示:
2.3 GPU并行与分布式对比
基于GPU的通用计算只是并行计算的一种方式。我们主要讨论GPU并行与集群分布式并行的区别。
分布式集群结构模型如下图所示。分布式集群系统是一种多指令流多数据流结构,组成分布式系统的各个计算节点都拥有独立的中央处理器和独立的存储器,能够在各自的数据流上执行各自的指令流。分布式集群系统各个节点间采用低成本的网络互联,每个节点上驻留完整的操作系统。分布式集群系统具有良好的系统扩展性,而且开发维护方便,是目前高性能计算领域广泛采用的体系结构。
在GPU中,流多处理器才能被称为真正的完整核心,整个可伸缩流处理器阵列可以被看成由多个流处理器组成的多单指令流多线程(multiple SIMT, MSIMT)系统。
在计算方式上,集群通常采用Master-Slave模式,Master将分割成小块的计算任务和数据分发到多个Slave上,Slave完成计算任务后将结果返回Master,Master把多个小块的计算结果合并。集群计算的重点是任务的分配和负载的均衡;GPU并行计算也可以看成Master-Slave模式,但这里的Master是CPU,而Slave是GPU,GPU的SIMT结构具有动态负载平衡的特性。
在通信方式上,集群主要使用现有商用网络如Internet进行并行计算。算法要考虑到数据在网络中的传输方式,避免通信瓶颈的干扰;而GPU并行计算的数据通信主要是指CPU内存和GPU全局存储器之间的通信,通过PCI-E接口完成,算法要合理地分配CPU和GPU的计算任务,尽量减少CPU和GPU之间的数据通信。
由于两种并行架构的硬件体系不同,导致能耗和通信带宽也不同。一般的分布式体系结构中,计算节点是通过专用的Infiniband路由器连接,点对点通信的带宽比较低。GPU通过PCI-E插槽连接主板传输速率较高,GPU内部存储器带宽也很大。
一般分布式的并行是粗粒度的并行,而GPU并行是细粒度的并行。当进行粗粒度的网络密集型并行运算时,采用集群并行,可以直接分解大规模任务,分解数据集合;当进行细粒度的计算密集型并行运算时,采用GPU通用计算并行,利用GPU轻量级线程创建和零开销的线程调度,有效地为细粒度并行化提供了支持。