GPU
在 GPU 出现之前,对于各种绘制计算机图形所需的运算,包括顶点设置、光影、像素操作等,都是由 CPU 配合特定软件实现的
图形处理器(Graphic Processing Unit,GPU)本质上是一组图形函数的集合,专门用于处理绘制计算机图形所需的运算,而这些函数由硬件实现,因此,GPU 从某种意义上讲就是为了在图形处理过程中充当主角而出现的
近年来,GPU 最成功的一个应用就是深度学习领域,基于 GPU 的并行计算已经成为训练深度学习模型的标配
GPU 的运算类型
适合 GPU 运算的运算类型有以下六种:
- 大量的轻量级运算:大量数据或同一数据多次调用同一公式或计算过程,公式本身并不复杂,只是执行的次数较多
- 高度并行:各数据间运算互不影响,耦合度较低
- 计算密集型:少量的 IO 读取与大量的计算
- 控制简单:逻辑简单的运算
- 多阶段执行:运算程序可分解为多个小程序或者同一程序可分多个阶段执行
- 浮点型运算:浮点数参与的运算
异构计算架构
GPU 并不是一个独立运行的计算平台,其需要与 CPU 协同工作,可以看成是 CPU 的协处理器,因此当在谈及 GPU 并行计算时,其实是指基于 CPU+GPU 的异构计算架构,GPU 与 CPU 通过 PCIe 总线连接在一起来协同工作,CPU 所在位置称为为主机(host)端,而 GPU 所在位置称为设备(device)端
CPU 上的线程是重量级的,上下文切换开销大,但是 GPU 由于的核心远多于 CPU,其线程是轻量级的,因此,基于 CPU+GPU 的异构计算平台可以优势互补,CPU 负责处理逻辑复杂的串行程序,而 GPU 重点处理数据密集型的并行计算程序,从而发挥最大功效
CUDA
统一计算设备架构(Compute Unified Device Architecture,CUDA)是一种由 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题,其包含 CUDA 指令集架构以及 GPU 内部的并行计算引擎
同时,CUDA 提供了 GPU 编程的简易接口,基于 CUDA 编程可以构建基于 GPU 计算的应用程序,支持 C/C++,Python,Fortran 等编程语言
简单来说,CUDA 是建立在 NVIDIA 的 GPUs 上的一个通用并行计算平台和编程模型,基于 CUDA 编程可以利用 GPUs 的并行计算引擎来更加高效地解决比较复杂的计算难题
CUDA 编程模型
CUDA 编程模型是一个异构模型,需要 CPU 和 GPU 协同工作
在 CUDA 中,host 端和 device 端是两个极为重要的概念,host 端指代 CPU 及其内存,device 端指代 GPU 及其显存,一个 CUDA 程序中既包含 host 程序,又包含 device 程序,它们分别在 CPU 和 GPU 上运行
同时,host 端与 device 端之间可以进行通信,从而实现两者间的数据拷贝
对于 CUDA 程序,其在 host 端与 device 端的执行流程如下:
- 分配 host 端内存,并进行数据初始化
- 分配 device 端内存,并从 host 端将数据拷贝到 device 端上
- 调用 CUDA 的核函数在 device 端上完成指定的运算
- 将 device 端上的运算结果拷贝到 host 端上
- 释放 device 端和 host 端上分配的内存