了解设备

在之前的文章中,我们已经学习了 CUDA 的启动配置,学习了 thread、block 和 grid 的概念。现在我们再从 GPU 设备的角度来看看。

图 1 是 GPU 架构的大致布局。图中我们可以看到每个 GPC(Graphics Processing Clusters) 包含多个 TPC(Texture Processing Clusters),每个 TPC 包含一个光栅引擎和多个 SM(Streaming Multiprocessors)。

图中还能看到 RT Core (Ray Tracing Cores),是用于光线追踪计算的单元;L2 Cache,二级缓冲;Memory Controller,内存控制器,负责管理 GPU 的显存访问;High-Speed Hub,高速集线器,负责各个组件之间的数据传输;NVLink,负责多 GPU 之间的数据交换。

图1 GPU 架构

我们重点看一下 SM,如图 2 所示,它是 CUDA 架构中的一个核心组件。内部具体组件和流程如下:

1. SM 从指令缓存中获取指令。

2. 接着 warp 调度器将指令调度和派发给 CUDA 核心、LD/ST 单元或 SFU 单元。

3. 执行阶段。CUDA 核心执行基本的算术运算;LD/ST 单元进行内存访问;SFU 单元执行复杂的数学运算。

通过 Interconnect Network,数据可以在不同单元之间传输,如从 LD/ST 单元到寄存器文件,从寄存器文件到 CUDA 核心。

共享内存和 L1 缓存可以加速数据访问,减少延迟。

图2 流处理器

计算机体系结构

计算机体系结构根据弗林分类法,有 SISD、SIMD、MISD 和 MIMD。

SISD

SISD,全称为单指令单数据流(Single Instruction Single Data)。它是最传统的计算模型,在任意时刻,处理器只能从指令存储器中获取和执行一条指令。

像 Intel 80386 就是一个典型的 SISD 处理器。

SIMD

SIMD,全称为单指令多数据流(Single Instruction Multiple Data)。它是一种并行计算模型,一条指令可以同时对多个数据进行相同的操作。多个数据元素是并行处理的。

像 Intel 的 SSE 和 AVX 是广泛应用的 SIMD 指令集。

MISD

MISD,全称为多指令单数据流(Multiple Instruction Single Data)。它在实际应用中并不常见,是多个处理器同时对同一数据流执行不同的指令。

MISD 一般用于航天等高安全性领域的容错计算。通过不同处理器执行不同的算法,对同一数据进行处理,结果相互校验。可以确保系统的可靠性。

MIMD

MIMD,全称为多指令多数据流(Multiple Instruction Multiple Data)。它指多个处理器可以同时执行不同的指令流,并操作不同的数据流。

像目前广泛应用的多核处理器就是 MIMD 模型的典型实例。

CUDA 的 SIMT

CUDA 的核心体系结构是 SIMT(Single Instruction Multiple Threads),即单指令多线程。它允许多个线程同时执行相同的指令,每个线程处理不同的数据。

SIMT 和 SIMD 有类似的地方,都是单指令流,且是并行计算。但 SIMT 强调了线程的概念,每个线程都有自己的独立执行单元。不仅可以处理不同的数据,还允许不同的线程有不同的控制流路径。这使得 SIMT 比 SIMD 更加灵活。

最后,我们可以建立图 3 所示的大致映射概念。

软件上的抽象模型是:线程是最基本的执行单元。线程块由多个线程组成。网格由多个线程块组成。

对应的具体硬件实现:每个线程在 CUDA 核心上运行。线程块中的线程,在同一个 SM 内执行。网格中的线程块分布在多个 SM 上。

图3 抽象到具体