title: CUDA 线程层次结构是什么?

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

线程层次结构是 CUDA 编程模型 的关键抽象概念,与 内存层次结构 并列。它从单个线程到整个 GPU 设备,跨多个级别组织并行程序的执行。

最底层是单个 线程。与 CPU 上的执行线程类似,每个 CUDA 线程 执行一系列指令。执行算术和逻辑指令的硬件资源称为 核心 或有时称为 "管道"。线程由 线程束调度器 选择执行。

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

在最高层,多个 线程块 被组织成一个跨越整个 GPU 的 线程块网格线程块 在协调和通信方面受到严格限制。网格内的块彼此并发执行,没有保证的执行顺序。CUDA 程序 必须编写成任何块的交错执行都是有效的,从完全串行到完全并行。这意味着 线程块 不能,例如,通过屏障进行同步。与 线程 类似,每个 线程块 都有一个唯一的、基于索引的标识符,以支持基于数组索引的工作分配。

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