在 CUDA GPU 内部,有称为 SM(流式多处理器)的计算单元。每个 SM 都有各种硬件资源(warp 调度程序、指令获取/解码、寄存器文件、执行/功能单元、共享内存、L1 缓存等),用于支持 CUDA 执行线程。
每当发出指令时,都会在经线范围内发出指令。因此,发布的任何指令都需要 32 个功能单元来执行该类型的指令。CUDA 低级指令 (SASS) 可以分为多个类别,并且有一个功能单元类型将处理该指令或该类别中的指令。例如,从内存加载指令(例如LD
)将由 LD/ST 单元(加载/存储)处理。这些指令处理单元有许多不同的种类。
一些额外的特殊类型的单位是 SP 和 DP 单位。SP 单元可以处理单精度浮点乘法、加法或乘法加法指令。DP 单元类似,只是它处理双精度浮点类型的指令。
因此,为了发出指令,warp-scheduler 最终将需要 32 个适合该指令类型的单元类型。对于单精度浮点乘法运算,在该周期内需要 32 个可用的 SP 单元来接收发出的指令。
其他类型的指令(最终)仍需要 32 个单元,但 SM 中可能没有 32 个给定类型的单元。当特定类型的单元少于 32 个时,warp 调度程序将跨多个时钟周期调度单个指令。例如,假设一个特定的 GPU SM 设计只有 4 个 DP 单元。然后,warp 调度器,当它有例如 DP 乘法操作/指令要发布时,将使用这 4 个单元共 8 个时钟周期(4x8=32),以便在考虑每个指令时为每个指令提供一个功能/执行单元-线程,经线范围。每个线程最终都需要一个功能单元。每个功能单元每个时钟可以为一个线程处理一条指令。为了处理经线范围内发出的指令,
CUDA 中的术语“核心”通常用于指代上述定义的 SP 单元。鉴于此,我们可以立即确定:
- CUDA“核心”真的不像 CPU 核心。
- 一个 CUDA“核心”将只参与相对少量指令类型的指令处理,包括 SP 浮点加法、乘法和乘法加法。任何其他指令类型都需要不同类型的功能单元来处理该指令。并且仅仅因为一个 SM 包含,例如 128 个 CUDA 核心(即 SP 单元),并不意味着它还包含 128 个 DP 单元,或 128 个 LD/ST 单元,或特定数量的任何其他功能单元类型。SM 中功能单元的数量可以而且确实因功能单元类型而异。不同的 GPU 架构(Maxwell、Pascal、Volta)和架构内的不同计算能力,可能具有这些功能单元类型的不同组合或数量。