CUDA(Compute Unified Device Architecture,统一计算设备架构)是由 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题。 它包含了 CUDA 指令集架构(ISA)以及 GPU 内部的并行计算引擎。CUDA 是一个全新的软硬件架构,可以将 GPU 视为一个并行数据计算的设备,对所进行的计算进行分配和管理,无需将其映射到图形 API。
目前 CUDA 除了可以用C语言开发,CUDA 还支持其它语言,包括 FORTRAN 以及C++, 此外,CUDA 支持 Java、Python 等各类语言的接口。从体系结构的组成来说,CUDA 包含了三个部分:开发库(Libraries)、运行期环境(Runtime)和驱动(Driver),如下图所示:
开发库是基于 CUDA 技术所提供的应用开发库。CUDA 包含两个重要的标准数学运算库——CUFFT(离散快速傅立叶变换)和 CUBLAS(离散基本线性计算)。这两个数学运算库所解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。
运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。基于 CUDA 开发的程序代码在实际执行中分为两种,一种是运行在 CPU 上的宿主代码(Host Code),一种是运行在GPU上的设备代码(Device Code)。不同类型的代码由于其运行的物理位置不同,能够访问到的资源不同,因此对应的运行期组件也分为公共组件、宿主组件和设备组件三个部分,基本上囊括了所有在 GPGPU 开发中所需要的功能和能够使用到的资源接口,开发人员可以通过运行期环境的编程接口实现各种类型的计算。CUDA 提供运行期环境是通过驱动来实现各种功能的。
CUDA 支持 Windows、Linux、MacOS 三种主流操作系统,支持 CUDA C 语言和 OpenCL 及 CUDA Fortran 语言。无论使用何种语言或接口,指令最终都会被驱动程序转换成 PTX(Parallel Thread Execution,并行线程执行,CUDA架构中的指令集,类似于汇编语言)代码,交由显示核心计算。
CUDA最主要的包含两个方面: ISA指令集架构与硬件计算引擎;实际上是硬件和指令集。见下图中的绿色部分,CUDA 架构的组件组成是:
(1) NVIDIA GPU中的并行计算引擎;
(2) 对硬件初始化、配置的OS内核级支持;
(3) 用户模式的驱动,为开发者提供设备级的API;
(4) 用于并行计算kernel和函数的PTX 指令集架构(ISA,Instruction set architecture)
注:kernel是指为GPU设备编译的一个函数。也就是一个编译好的、在GPU上并行运行的计算函数。Kernel在GPU上以多个线程的方式被执行。
运行在GPU上的CUDA并行计算函数称为kernel(内核函数)。一个完整的CUDA程序是由一系列的设备端kernel函数并行部分和主机端的串行处理部分共同组成的。这些处理步骤会按照程序中相应语句的顺序依次执行,满足顺序一致性。