使用GPU的好处

在类似的价格和功率范围内,图形处理单元(GPU)提供的指令吞吐量和内存带宽比CPU高得多。许多应用程序利用这些更高的功能在GPU上比在CPU上运行得更快(请参阅GPU应用程序)。其他计算设备(如FPGA)也非常节能,但是编程灵活性比GPU小得多。由于GPU和CPU的设计目标不同,因此存在这种能力差异。尽管CPU被设计为擅长以最快的速度执行一系列操作,称为线程,并且可以并行执行数十个这些线程,但GPU被设计为擅长并行执行数千个线程(摊销降低单线程性能以实现更高的吞吐量)。GPU专用于高度并行计算,因此设计为使更多的晶体管专用于数据处理,而不是数据缓存和流控制。示意图1显示了CPU和GPU的芯片资源分配示例。

图1. GPU投入更多晶体管进行数据处理

CUDA C++ Programming Guide——简介_多处理器


将更多的晶体管投入到数据处理中,例如浮点计算,对于高度并行计算是有益的; GPU可以通过计算隐藏内存访问等待时间,而不是依靠大型数据缓存和复杂的流控制来避免长的内存访问等待时间,这两者在晶体管方面都是昂贵的。通常,应用程序包含并行部分和顺序部分的混合,因此系统设计时会混合使用GPU和CPU,以使整体性能最大化。 具有高度并行性的应用程序可以利用GPU的这种大规模并行性来获得比CPU更高的性能。

CUDA: A General-Purpose Parallel Computing Platform and Programming Model

NVIDIA®在2006年11月推出了通用并行计算平台和编程模型CUDA®,该模型利用NVIDIA GPU中的并行计算引擎以比在CPU上更有效的方式解决许多复杂的计算问题。CUDA带有一个软件环境,允许开发人员使用C ++作为高级编程语言。 如图2所示,支持其他语言,应用程序编程接口或基于指令的方法,例如FORTRAN,DirectCompute,OpenACC。

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

CUDA C++ Programming Guide——简介_cuda_02

A Scalable Programming Model

多核CPU和多核GPU的出现意味着主流处理器芯片现在是并行系统。挑战在于开发可透明地扩展其并行性以利用不断增加的处理器内核的应用程序软件,就像3D图形应用程序可透明地将其并行性扩展到具有大量内核数量的许多核GPU一样。CUDA并行编程模型旨在克服这一挑战,同时为熟悉标准编程语言(例如C)的程序员保持较低的学习曲线。

At its core are three key abstractions - a hierarchy of thread groups, shared memories, and barrier synchronization - that are simply exposed to the programmer as a minimal set of language extensions.它的核心是三个关键抽象-线程组,共享内存和屏障同步的层次结构-只是作为最少的语言扩展集向程序员公开。

这些抽象提供了细粒度的数据并行性和线程并行性,嵌套在粗粒度的数据并行性和任务并行性中。它们指导程序员将问题划分为可以由线程块并行独立解决的粗略子问题,并将每个子问题分解为可以由模块内的所有线程并行并行解决的细小问题。

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

这种可扩展的编程模型可通过简单地扩展多处理器和内存分区的数量来使GPU体系结构覆盖广泛的市场范围:从高性能发烧友GeForce GPU,专业的Quadro和Tesla计算产品到各种廉价的主流GeForce GPU(有关所有启用CUDA的GPU的列表,请参阅支持CUDA的GPU)。

CUDA C++ Programming Guide——简介_并行性_03


GPU是围绕流多处理器(SM)阵列构建的(有关更多详细信息,请参见硬件实现)。 多线程程序被划分为彼此独立执行的线程块,因此具有多处理器的GPU将比具有较少多处理器的GPU在更少的时间内自动执行程序。

翻译文档来源于:https://docs.nvidia.com/cuda/cuda-c-programming-guide/