1

我正在阅读答案并且存在冲突的想法:在此链接https://www.3dgep.com/cuda-thread-execution-model/中,两个经纱(64 个线程)可以在 SM(32 CUDA核心)。所以,我知道扭曲上的线程被分割并在 16 个 CUDA 核心上处理。这个想法对我来说很有意义,因为每个 CUDA 内核都有 1 个 32bitALU。

然而,在其他链接中,他们声称 1 个 CUDA 核心能够处理 32 个并发线程(与 warp 大小相同)(https://cvw.cac.cornell.edu/GPU/simt_warp)。因此,1 个 CUDA 扭曲只能由一个 CUDA 核心处理。这也是有道理的,因为同一个经线上的所有线程都使用同一个 PC 计数器。

所以,我的问题是如何将 CUDA 扭曲与 CUDA 核心映射?

4

1 回答 1

8

在 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 单元。鉴于此,我们可以立即确定:

  1. CUDA“核心”真的不像 CPU 核心。
  2. 一个 CUDA“核心”将只参与相对少量指令类型的指令处理,包括 SP 浮点加法、乘法和乘法加法。任何其他指令类型都需要不同类型的功能单元来处理该指令。并且仅仅因为一个 SM 包含,例如 128 个 CUDA 核心(即 SP 单元),并不意味着它还包含 128 个 DP 单元,或 128 个 LD/ST 单元,或特定数量的任何其他功能单元类型。SM 中功能单元的数量可以而且确实因功能单元类型而异。不同的 GPU 架构(Maxwell、Pascal、Volta)和架构内的不同计算能力,可能具有这些功能单元类型的不同组合或数量。
于 2020-06-02T20:31:43.260 回答