我正在阅读答案,并且存在冲突的想法: 在此链接 https://www.3dgep.com/cuda-thread-execution-model/中,两个扭曲(64 个线程(可以在 SM(32 个 CUDA 内核(上同时运行。所以,我知道经线上的线程是分裂的,并在 16 个 CUDA 内核上处理。这个想法对我来说很有意义,因为每个 CUDA 内核都有 1 个 32 位 ALU。
但是,在其他链接中,他们声称 1 个 CUDA 内核能够处理 32 个并发线程(与扭曲大小相同((https://cvw.cac.cornell.edu/GPU/simt_warp(。因此,1 个 CUDA 翘曲只能由一个 CUDA 核心处理。这也是有道理的,因为同一扭曲上的所有线程都使用相同的 PC 计数器。
所以,我的问题是 CUDA 扭曲如何与 CUDA 核心映射?
在 CUDA GPU 内部,有称为 SM(流式多处理器(的计算单元。每个 SM 都有各种硬件资源(扭曲调度程序、指令获取/解码、寄存器文件、执行/功能单元、共享内存、L1 缓存等(,用于支持 CUDA 执行线程。
每当发出指令时,它都会在翘曲范围内发出。 因此,发出的任何指令都需要该类型指令的32个功能单元。 CUDA 低级指令 (SASS( 可以分为多个类别,并且有一个功能单元类型将处理该指令或该类别中的指令。 例如,从内存加载指令(例如LD
( 将由 LD/ST 单元(加载/存储(处理。 这些指令处理单元有许多不同种类。
一些其他特定类型的单元是 SP 和 DP 单元。 SP 单元可以处理单精度浮点乘法、加法或乘法加法指令。 DP 单元与此类似,只是它处理处理双精度浮点类型的指令。
因此,为了发出指令,翘曲调度器最终需要32个适合该指令类型的单元类型。 对于单精度浮点乘法运算,在该周期内需要 32 个 SP 单元可用来接收发出的指令。
其他类型的指令仍然需要 32 个单位(最终(,但 SM 中可能没有 32 个给定类型的单位。 当特定类型的单元少于 32 个时,扭曲调度程序将跨多个时钟周期调度单个指令。 例如,假设特定的 GPU SM 设计只有 4 个 DP 单元。 然后,当 warp 调度器具有例如 DP 乘法运算/指令时,它将使用这 4 个单元总共 8 个时钟周期 (4x8=32(,以便在考虑每个线程时为每个指令提供一个功能/执行单元,整个扭曲范围。 每个线程最终需要一个功能单元。每个功能单元可以为每个时钟处理一条指令,用于一个线程。 为了处理在翘曲范围内发出的指令,要么需要32个功能单元,以便可以在单个时钟周期内发出指令,要么在多个时钟周期内向较少数量的功能单元发出指令。
CUDA 中的术语"核心"通常用于指代上述定义的 SP 单元。 鉴于此,我们可以立即确定:
- CUDA"核心"真的不像CPU核心。
- CUDA"核心"将仅参与相对较少数量的指令类型的指令处理,包括SP浮点加法,乘法和乘法加法。任何其他指令类型都需要不同类型的功能单元来处理该指令。 仅仅因为 SM 包含例如 128 个 CUDA 内核(即 SP 单元(,并不意味着它还包含 128 个 DP 单元,或 128 个 LD/ST 单元,或特定数量的任何其他功能单元类型。 SM 中的功能单元数量可能并且确实因功能单元类型而异。 不同的 GPU 架构(Maxwell、Pascal、Volta(和架构中的不同计算能力可能具有这些功能单元类型的不同组合或数量。