GPU 的核心优势
图形处理单元(GPU)在同等价格和功耗下,比 CPU 提供更高的指令吞吐量和内存带宽。许多应用利用这些特性,在 GPU 上运行速度远超 CPU。虽然 FPGA 等计算设备也很节能,但编程灵活性远不如 GPU。
'图形'一词源于二十年前 GPU 刚诞生时的定位——专门加速图形渲染。随着市场对实时高清 3D 图形需求的激增,它已演变为通用处理器,能处理多种工作负载。
CPU 与 GPU 的设计目标不同。CPU 旨在快速执行一系列操作(线程),并行执行几十个线程;而 GPU 则设计为并行执行成千上万个线程,通过分摊单线程性能换取更大的吞吐量。
GPU 专为高度并行计算设计,更多晶体管用于数据处理而非缓存和流控。下图展示了 CPU 和 GPU 的芯片资源分布差异。

将更多晶体管用于浮点计算等数据处理对高度并行有益。GPU 通过计算隐藏内存访问延迟,而非依赖昂贵的大型缓存和复杂流控。通常应用混合了并行和顺序部分,因此系统常采用 CPU+GPU 混合设计以最大化性能。
CUDA:通用并行计算平台
2006 年 11 月,NVIDIA 推出 CUDA,这是一个通用的并行计算平台和编程模型,利用 NVIDIA GPU 中的并行计算引擎解决复杂计算问题。
CUDA 配备软件环境,允许使用 C++ 作为高级语言。此外还支持 FORTRAN、DirectCompute、OpenACC 等语言或 API。

可扩展编程模型
多核 CPU 和众核 GPU 的出现意味着主流处理器已是并行系统。挑战在于开发能透明扩展并行性的软件,就像 3D 图形应用自动适配不同核心数量的 GPU 一样。
CUDA 并行编程模型旨在克服此挑战,让熟悉 C 等标准语言的程序员轻松上手。其核心是三个关键抽象概念:线程组层次结构、共享内存和屏障同步,通过最小化的语言扩展暴露给程序员。
这些抽象提供了精细的数据并行性和线程并行性,嵌套在粗粒度的数据并行性和任务并行性中。指导程序员将问题分割成可由线程块独立解决的子问题,再细分成由块内线程协同解决的部分。
这种分解保留了语言表达性,同时具备自动可扩展性。每个线程块可按任意顺序调度到 GPU 的任何可用多处理器上。编译后的 CUDA 程序可在任意数量多处理器上执行,运行时系统只需知道物理多处理器数量即可。
这种模型让 GPU 架构能通过扩展多处理器和内存分区覆盖广泛市场:从 GeForce 游戏显卡到 Quadro、Tesla 等专业计算产品。

注意:GPU 围绕一组流多处理器(SMs)构建。多线程程序被划分为独立执行的线程块,拥有更多多处理器的 GPU 会自动缩短执行程序的时间。

