使用多少个 CUDA 核心来处理一个 CUDA 扭曲?
Posted
技术标签:
【中文标题】使用多少个 CUDA 核心来处理一个 CUDA 扭曲?【英文标题】:How many CUDA cores is used to process a CUDA warp? 【发布时间】:2020-09-20 15:54:50 【问题描述】:我正在阅读答案并且存在冲突的想法: 在这个链接https://www.3dgep.com/cuda-thread-execution-model/ 中,两个warp(64 个线程)可以在一个SM(32 个CUDA 核心)上同时运行。所以,我知道扭曲上的线程被分割并在 16 个 CUDA 核心上处理。这个想法对我来说很有意义,因为每个 CUDA 内核都有 1 个 32bitALU。
但是,在其他链接中,他们声称 1 个 CUDA 内核能够处理 32 个并发线程(与 warp 大小相同)(https://cvw.cac.cornell.edu/GPU/simt_warp)。因此,1 个 CUDA 扭曲只能由一个 CUDA 核心处理。这也是有道理的,因为同一个 warp 上的所有线程都使用同一个 PC 计数器。
那么,我的问题是如何将 CUDA 扭曲与 CUDA 核心映射?
【问题讨论】:
这个问题没有一个答案。它取决于硬件,并且随着时间的推移而发展。康奈尔链接显然是错误的,从来没有任何 GPU 可以按照文本描述的方式工作 【参考方案1】:Inside a CUDA GPU,有称为 SM(流式多处理器)的计算单元。每个 SM 都有各种硬件资源(warp 调度程序、指令获取/解码、寄存器文件、执行/功能单元、共享内存、L1 缓存等),用于支持 CUDA 执行线程。
每当发出指令时,都会在整个经线范围内发出指令。因此,发布的任何指令都需要 32 个功能单元来执行该类型的指令。 CUDA 低级指令 (SASS) 可以分为多个类别,并且有一种功能单元类型将处理该指令或该类别中的指令。例如,从内存加载指令(例如LD
)将由 LD/ST 单元(加载/存储)处理。这些指令处理单元有许多不同的种类。
一些额外的particular kinds of units are SP and DP units。 SP 单元可以处理单精度浮点乘法、加法或乘法加法指令。 DP 单元与处理双精度浮点类型的指令类似。
因此,为了发出指令,warp-scheduler 最终将需要 32 个适合该指令类型的单元类型。对于单精度浮点乘法运算,在该周期内需要 32 个可用的 SP 单元来接收发出的指令。
其他类型的指令仍将需要 32 个单元(最终),但 SM 中可能没有 32 个给定类型的单元。当特定类型的单元少于 32 个时,warp 调度程序将跨多个时钟周期调度单个指令。例如,假设一个特定的 GPU SM 设计只有 4 个 DP 单元。然后是warp调度程序,当它有例如要发出的 DP 乘法操作/指令,将使用这 4 个单元共 8 个时钟周期(4x8=32),以便在考虑每个线程、warp-wide 时为每条指令提供一个功能/执行单元。每个线程最终都需要一个功能单元。每个功能单元每个时钟可以为一个线程处理一条指令。为了处理整个warp-wide发出的指令,要么需要32个功能单元,这样指令就可以在一个时钟周期内发出,要么指令将在多个时钟周期内发出,给更少的功能单元。
CUDA 中的术语“核心”通常用于指代上述定义的 SP 单元。鉴于此,我们可以立即确定:
-
CUDA“核心”真的不像CPU核心。
CUDA“核心”只涉及相对少量指令类型的指令处理,包括 SP 浮点加法、乘法和乘法加法。 任何其他指令类型都需要不同类型的功能单元来处理该指令。并且仅仅因为一个 SM 包含,例如 128 个 CUDA 核心(即 SP 单元),并不意味着它还包含 128 个 DP 单元,或 128 个 LD/ST 单元,或特定数量的任何其他功能单元类型。 SM 中功能单元的数量可以而且确实因功能单元类型而异。不同的 GPU 架构(Maxwell、Pascal、Volta)和架构内的不同计算能力,可能具有这些功能单元类型的不同组合或数量。
【讨论】:
以上是关于使用多少个 CUDA 核心来处理一个 CUDA 扭曲?的主要内容,如果未能解决你的问题,请参考以下文章