3.12. CUDA 线程层次结构是什么?

CUDA 编程模型 的线程层次结构从单个 线程线程块 再到 线程块网格(左侧),映射到硬件上则从 CUDA 核心流式多处理器 再到整个 GPU(右侧)。改编自 NVIDIA 的 CUDA Refresher: The CUDA Programming Model 和 NVIDIA CUDA C++ Programming Guide 中的图表。

线程层次结构是 CUDA 编程模型 的核心抽象概念之一,与 内存层次结构 并列。它通过多个层级组织并行程序的执行,从单个线程一直扩展到整个GPU设备。

层次结构中最底层是单个 线程。与 CPU 上的执行线程类似,每个 CUDA 线程 执行一系列指令 (a stream of instructions) 。负责执行算术和逻辑指令的硬件资源称为 核心 或有时称为 “流水线”。线程由 线程束调度器 选择执行。

中间层级由 线程块 组成,在 PTXSASS 中也称为 协作线程数组。每个 线程 在其所属的 线程块 中都有唯一标识符。这些标识符基于索引,便于根据输入或输出数组的索引为线程分配任务。一个块内的所有线程会被同时调度到同一个 流式多处理器 (SM) 上。它们可以通过 共享内存 进行协调,并通过屏障进行同步。

在最高层,由多个 线程块 被组织成一个跨越整个 GPU 的 线程块网格线程块 在协调和通信方面受到严格限制。网格内的块以并发方式执行,没有固定的执行顺序。CUDA 程序 必须确保块的任何执行顺序(从完全串行到完全并行)都是有效的。这意味着 线程块 之间不能通过屏障同步。与 线程 类似,每个 线程块 都有一个唯一的、基于索引的标识符,以支持基于数组索引的分配任务。

这种层次结构直接映射到 GPU 硬件线程 在单个 核心 上执行, 线程块 被调度到 SM 上, 而 网格 则利用设备上所有可用的 SM