Skip to main content

CUDA编程概述

1. 概述

CUDA是英伟达开发的一种并行计算平台和编程模型,它通过利用GPU的强大算力,能够显著提升计算性能。它允许开发者使用C、C++和Fortran等语言加速计算密集型应用程序,在深度学习、科学计算和高性能计算(HPC)等领域得到了广泛应用。

2. 使用GPU的优势

图形处理单元(GPU)在相近的价格和功耗范围内,能提供比CPU高得多的指令吞吐量和内存带宽。许多应用程序借助这些强大性能,在GPU上运行比在CPU上更快(参见“GPU应用程序”)。其他计算设备,如现场可编程门阵列(FPGA),虽然能效也很高,但编程灵活性远不及GPU。

GPU和CPU的性能差异源于它们不同的设计目标。CPU旨在尽可能快速地执行一系列操作(称为线程),并能并行执行几十条这样的线程;而GPU则设计为擅长并行执行数千条线程(通过分摊较慢的单线程性能来实现更高的吞吐量)。

GPU专门针对高度并行计算进行了优化,因此在设计上,更多的晶体管用于数据处理,而非数据缓存和流控制。图1展示了CPU和GPU芯片资源分配的示例示意图。

图1:GPU将更多晶体管用于数据处理

将更多晶体管用于数据处理,例如浮点运算,对高度并行计算很有好处;GPU可以通过计算来隐藏内存访问延迟,而不是依靠大容量数据缓存和复杂的流控制来避免较长的内存访问延迟,这两者在晶体管使用上代价都很高。

一般来说,应用程序既有并行部分,也有顺序执行部分,因此系统设计中会同时采用GPU和CPU,以实现整体性能的最大化。具有高度并行性的应用程序可以利用GPU这种大规模并行的特性,从而获得比在CPU上更高的性能。

之所以有“图形”这个限定词,是因为二十年前GPU最初诞生时,它被设计为专门加速图形渲染的处理器。在对实时、高清3D图形无尽的市场需求推动下,它已演变为一种通用处理器,可用于比图形渲染多得多的工作负载。

3. 通用并行计算平台和编程模型

2006年11月,英伟达推出了CUDA®,这是一种通用并行计算平台和编程模型,它利用英伟达GPU中的并行计算引擎,以比CPU更高效的方式解决许多复杂的计算问题。

CUDA附带了一个软件环境,允许开发者将C++作为高级编程语言使用。如图2所示,它还支持其他语言、应用程序编程接口或基于指令的方法,如Fortran、DirectCompute、OpenACC。

图2:GPU计算应用程序。CUDA旨在支持各种语言和应用程序编程接口

4. 可扩展的编程模型

多核CPU和众核GPU的出现意味着主流处理器芯片如今已成为并行系统。面临的挑战是开发应用软件,使其能够透明地扩展并行性,以利用不断增加的处理器核心数量,就像3D图形应用程序能透明地将其并行性扩展到具有数量差异很大的核心众多的GPU上一样。

CUDA并行编程模型旨在克服这一挑战,同时对于熟悉C等标准编程语言的程序员来说,学习曲线也较为平缓。

其核心是三个关键抽象概念——线程组层次结构、共享内存和屏障同步——它们作为最少数量的语言扩展,简单地呈现给程序员。

这些抽象概念在粗粒度数据并行和任务并行中嵌套提供细粒度数据并行和线程并行。它们引导程序员将问题分解为粗粒度的子问题,这些子问题可以由线程块并行独立解决,并且每个子问题进一步细分为更小的部分,这些部分可以由块内的所有线程并行协作解决。

这种分解既通过允许线程在解决每个子问题时进行协作来保持语言的表达能力,同时又实现了自动可扩展性。实际上,每个线程块可以以任意顺序、并发或顺序地调度到GPU内任何可用的多处理器上,因此编译后的CUDA程序可以在任意数量的多处理器上执行,如图3所示,只有运行时系统需要知道物理多处理器的数量。

这种可扩展的编程模型使GPU架构只需通过扩展多处理器和内存分区的数量,就能覆盖广泛的市场范围:从面向高性能爱好者的GeForce GPU以及专业的Quadro和Tesla计算产品,到各种价格亲民的主流GeForce GPU(所有支持CUDA的GPU列表,请参见 支持CUDA的GPU)。

图3:自动可扩展性

注意:GPU围绕着一组流式多处理器(SM)构建(更多详细信息,请参见 Nvidia各个型号GPU的架构和内存模型)。多线程程序被划分为相互独立执行的线程块,因此,拥有更多多处理器的GPU将自动比多处理器较少的GPU更快地执行程序。

5. CPU+GPU异构计算模型

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

图3:基于CPU+GPU的异构计算

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

图5:基于CPU+GPU的异构计算应用执行逻辑