GPU/CUDA 个内核是 SIMD 内核吗?

Are GPU/CUDA cores SIMD ones?

我们来nVidia Fermi Compute Architecture。它说:

The first Fermi based GPU, implemented with 3.0 billion transistors, features up to 512 CUDA cores. A CUDA core executes a floating point or integer instruction per clock for a thread. The 512 CUDA cores are organized in 16 SMs of 32 cores each.

[...]

Each CUDA processor has a fully pipelined integer arithmetic logic unit (ALU) and floating point unit (FPU).

[...]

In Fermi, the newly designed integer ALU supports full 32-bit precision for all instructions, consistent with standard programming language requirements. The integer ALU is also optimized to efficiently support 64-bit and extended precision operations. V

据我所知,但我不清楚的是,GPU 在所谓的 warps 中执行线程,每个 warp 由大约 32 个线程组成。每个扭曲只分配给一个核心(是真的吗?)。那么这是否意味着单个 SM 的 32 个内核中的每一个都是 SIMD 处理器,其中 单个指令 处理 32 个数据部分 ?如果是这样,那么为什么我们说 warp 中有 32 个线程,而不是单个 SIMD 线程?为什么内核有时被称为 标量处理器 ,而不是 矢量处理器

Each warp is assigned to only one core (is that true?).

不,这不是真的。 warp 是 32 个执行线程的逻辑组合。要从单个 warp 执行单个指令,warp 调度程序通常必须调度 32 个执行单元(或 "cores",尽管 "core" 的定义有些松散).

内核实际上是标量处理器,而不是向量处理器。 32 个内核(或执行单元)由 warp 调度程序编组以跨 32 个线程执行单个指令,这就是 "SIMT" 绰号的来源。

CUDA“核心”可以被认为是 SIMD 通道。

首先让我们回顾一下术语“CUDA 核心”是 nVIDIA 的营销用语。这些与 CPU 拥有核心的方式不同。同样,“CUDA 线程”与我们在 CPUs.

上知道的线程不同

相当于 GPU 上的 CPU 核心是 "symmetric multiprocessor":它有自己的指令 scheduler/dispatcher、自己的 L1 缓存、自己的共享内存等。它是CUDA 线程 blocks 而不是 warps 分配给 GPU 核心,即分配给流式多处理器。在 SM 中,warp 被选择为整个 warp 安排指令。从 CUDA 的角度来看,这些是 32 个独立的线程,它们是指令锁定的;但这实际上与说 warp 就像一个线程一样,它只执行 32 通道宽的 SIMD 指令。当然这不是一个完美的类比,但我觉得它很合理。 CPU SIMD 通道上你不完全/不总是有的东西是屏蔽哪些通道正在积极执行,其中非活动通道将不会影响活动通道的寄存器值设置,内存写入等等

我希望这可以帮助您直观地理解事物。