背景发展

        图形处理器GPU(Graphics Processing Unit),是一种专门在个人电脑、工作站、游戏机和移动设备上做图像和图形相关运算工作的微处理器。
        随着显卡的不断发展,GPU为显示图像做了许许多多的改进和优化,计算能力越来越强大。在并行计算的能力上,GPU已经远远超越了通用的CPU,如此强大的芯片如果只是作为显卡就太浪费了,因此NVIDIA推出CUDA,让显卡可以用于图像计算以外的目的。
        2006年,芯片公司NVIDIA(英伟达)发布了CUDA,CUDA是建立在英伟达GPU上的一个通用并行计算平台和编程模型,基于CUDA编程可以利用GPU的并行计算引擎来更加高效地解决比较复杂的计算难题。近年来,GPU最成功的一个应用就是深度学习领域,基于GPU的并行计算已经成为训练深度学习模型的标配。

基本原理

        中央处理器CPU(Central Processing Unit)是一块超大规模集成电路,是一台计算机的运算核心和控制核心,它的功能主要是解释计算机指令以及处理计算机软件中的数据。CPU作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。
        在冯诺依曼计算机模型中,计算机分为五个部分:运算器控制器存储器输入设备输出设备。CPU本质上就是运算器和控制器的结合体,其不但要实现多种多样的算术运算,也要实现各种复杂的逻辑运算和系统控制。相比较而言,GPU的主要任务为图像处理,面临的应用场景更多的是并行计算,因而同等价格和配置下,CPU有更强的算术运算,逻辑运算和系统控制的综合能力,GPU更加偏向于算术运算和并行运算。如果特定的计算任务有着大量的并行计算和算术运算,较少的逻辑控制,那么该任务在GPU上的表现要远远优异于同配置的CPU。

运算模型

        GPU并不是一个独立运行的计算平台,而需要与CPU协同工作,可以看成是CPU的协处理器,因此当我们在说GPU并行计算时,其实是指的基于CPU+GPU的异构计算架构。在异构计算架构中,GPU与CPU通过PCIe总线连接在一起来协同工作,CPU所在位置称为为主机端(host),而GPU所在位置称为设备端(device),如下图所示:

GPU编程本质 gpu编程模型_计算机视觉


        可以看到GPU包括更多的运算核心,其特别适合数据并行的计算密集型任务,如大型矩阵运算,而CPU的运算核心较少,但是其可以实现复杂的逻辑运算,因此其适合控制密集型任务。另外,CPU上的线程是重量级的,上下文切换开销大,但是GPU由于存在很多核心,其线程是轻量级的。因此,基于CPU+GPU的异构计算平台可以优势互补,CPU负责处理逻辑复杂的串行程序,而GPU重点处理数据密集型的并行计算程序,从而发挥最大功效。

        CUDA是NVIDIA公司所开发的GPU编程模型,它提供了GPU编程的简易接口,基于CUDA编程可以构建基于GPU计算的应用程序。CUDA提供了对其它编程语言的支持,如C/C++,Python,Fortran等语言。如果选择了C/C++语言,那么一般集成开发环境为Visual Studio;如果选择了Python语言,那么一般集成开发环境为PyCharm

并行计算

        并行计算,可以理解为同时进行多种计算,将一个大问题分解为若干个小问题,每个小问题利用不同的计算资源进行解决。并行计算中,有前后依赖关系的子问题形成一个串行链,顺序执行;没有依赖关系的子问题可在同一时间进行计算,并发执行。

并行计算主要关注点有两个方面:

  1. 任务并行化
  2. 数据并行化

举个例子:
        张三吃早饭,想吃包子和稀饭。那么加热包子和煮稀饭是两个子任务,数据是包子和大米,两个子任务分别消耗相应的数据,产生最终结果,一份热腾腾的早饭

环境要求

        Cuda计算模型的实现即为Cuda编程,它是GPU编程的一种类型,类似的GPU编程还有OpenGL编程。具体来说,Cuda主要是做并行计算的,而OpenGL主要应用于图像渲染。
        要进行Cuda编程,请确保安装了以下环境:

  1. 显卡驱动程序
  2. Cuda驱动程序
  3. Cuda工具程序
  4. VS C++集成开发环境