3.1. 什么是 CUDA 编程模型?

CUDA 全称是 Compute Unified Device Architecture(统一计算设备架构)。
根据上下文的不同,”CUDA” 可以指代多个不同的概念: 一种 设备硬件架构,或是一种适用于该架构设计的 并行编程模型,或是一种扩展高级语言(如 C 语言)以支持该编程模型的 软件平台

CUDA 的愿景在 Lindholm 等人于 2008 年 发布的白皮书中有所阐述。我们强烈推荐阅读这份论文,它是 NVIDIA 文档中许多观点、图表乃至特定表述的原始出处。

本文,重点介绍 CUDA 编程模型

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

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

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

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

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

更具挑战性地说:这种编程模型可防止程序员为 NVIDIA CUDA 架构 GPU 编写的程序在用户购买新NVIDIA GPU 时无法获得加速的程序。

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

一个包含八个 线程块 的 CUDA 程序在两个 流式多处理器 (SM) 的 GPU 上分四个顺序步骤(波次)运行,但在拥有两倍数量 SM 的 GPU 上,只需一半步骤即可完成。修改自 CUDA 编程指南

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