title: 什么是 CUDA 编程模型?

CUDA 代表 Compute Unified Device Architecture(计算统一设备架构)。根据上下文, "CUDA" 可以指代多个不同的事物:一个 高层设备架构, 用于该设计架构的并行编程模型,或是一个 软件平台, 它扩展了像 C 这样的高级语言以添加该编程模型。

CUDA 的愿景在 Lindholm 等人,2008 年 白皮书中进行了阐述。我们强烈推荐这篇论文,它是英伟达文档中许多主张、图表甚至特定措辞的原始来源。

在这里,我们重点介绍 CUDA 编程模型

计算统一设备架构 (CUDA) 编程模型是一种用于大规模并行处理器的编程模型。

根据 英伟达 CUDA C++ 编程指南, CUDA 编程模型中有三个关键抽象:

执行和存储器的层次结构及其到 设备硬件 的映射总结在下图中。

左图:CUDA 编程模型的抽象线程组和存储器层次结构。右图:实现这些抽象概念的匹配硬件。修改自英伟达的 CUDA Refresher: The CUDA Programming Model 和英伟达 CUDA C++ Programming Guide 中的图表。

这三个抽象概念共同鼓励以一种能够随着 GPU 设备并行执行资源的扩展而透明扩展的方式来表达程序。

说得更直接一些:这种编程模型可以防止程序员为英伟达的 CUDA 架构 GPU 编写那些在程序用户购买新的英伟达 GPU 时无法获得加速的程序。

例如,CUDA 程序中的每个 线程块 都可以紧密协调,但块之间的协调是有限的。这确保了线程块捕获了程序的可并行化组件,并且可以按任何顺序进行调度——用计算机体系结构的术语来说,程序员将这种并行性"暴露"给了编译器和硬件。当程序在拥有更多调度单元(具体来说,是更多的 流式多处理器 (Streaming Multiprocessor)) 的新 GPU 上执行时,更多的这些线程块可以并行执行。

一个包含八个线程块的 CUDA 程序在两个流式多处理器 (SM) 的 GPU 上分四个顺序步骤(波次)运行,但在拥有两倍数量 SM 的 GPU 上,步骤数减少一半。修改自 [CUDA 编程指南](https://docs.nvidia.com/cuda/cuda-c-programming-guide/

CUDA 编程模型的抽象概念通过扩展高级 CPU 编程语言(例如 C++ 的 CUDA C++ 扩展)提供给程序员。该编程模型在软件层面通过指令集架构 (并行线程执行,即 PTX) 和低级汇编语言 (流式汇编器,即 SASS) 来实现。例如,线程层次结构 中的 线程块 级别就是通过这些语言中的 协作线程阵列 (cooperative thread array) 来实现的。