【问题标题】:Why is Max Threads per Multiprocessor 1536 on my Compute Capability 2.0 GPU?为什么我的 Compute Capability 2.0 GPU 上的每个多处理器的最大线程数为 1536?
【发布时间】:2017-10-09 10:01:50
【问题描述】:

在我的 GPU 上,使用 Compute Capability 2.0,每个多处理器的最大线程数是 1536。为什么不是 2 的幂?

以下是我的 GPU 的一些详细信息:

Physical Limits for GPU Compute Capability: 2.0   
Threads per Warp                            32  
Max Warps per Multiprocessor                48  
Max Thread Blocks per Multiprocessor        8  
Max Threads per Multiprocessor              1536  
Maximum Thread Block Size                   1024  
Registers per Multiprocessor                32768  
Max Registers per Thread Block              32768  
Max Registers per Thread                    63  
Shared Memory per Multiprocessor (bytes)    16384  
Max Shared Memory per Block                 16384  
Register allocation unit size               64  
Register allocation granularity             warp  
Shared Memory allocation unit size          128  
Warp allocation granularity                 2  

【问题讨论】:

  • devnglee 已经做到了。顺便说一句,2.x 是费米而不是麦克斯韦……
  • 我不明白你从哪里得到的 256....
  • 这对我来说似乎也有些武断。他可能只是想说这不是 2 的幂。
  • @Shadow :是的,我的意思正是你提到的。

标签: cuda gpu


【解决方案1】:

Threads per Warp x Max Warps per Multiprocessor = Max Threads per Multiprocessor

32 x 48 = 1536

Max Warps per Multiprocessor实际上是Maximum number of **resident** warps per multiprocessor,而Max Threads per Multiprocessor就是Maximum number of **resident** threads per multiprocessor。

检查this。在表 14 中,您将看到上述规则适用于所有计算能力。

数字 1536 表示每个多处理器(在 cuda 中称为 Streaming Processor 的 SM)最多可以有 1536 个活动线程。这并不意味着您只能启动 1536 个线程。您可以在对 CUDA 内核的调用中启动超过 1536 个线程,但每个 SM 只能包含 1536 个线程。此外,这并不意味着 1536 个线程同时在物理上执行。 Warp 是执行单元,直到今天,在所有代的 CUDA 中都是 32。

以下引用来自here。

相比之下,CUDA 设备上最小的可执行并行单元包含 32 个线程(称为线程束)。现代 NVIDIA GPU 最多可支持每个多处理器并发 1536 个活动线程(请参阅 CUDA C 编程指南的特性和规范)在具有 16 个多处理器的 GPU 上,这会导致超过 24,000 个并发活动线程。


编辑

另外的问题是:

您能否还强调一下为什么每个多处理器的 Max Warps 是 48 而不是 2 的幂(因为内核数和寄存器大小 = 65536 字节都是 2 的幂)?

每个 SM 的核心数并不总是 2 的幂。 CPU 核心 和 CUDA 核心 之间也存在一些细微差别。以计算能力 3.x 的设备为例(link)。

一个多处理器包括:

  • 192 个用于算术运算的 CUDA 内核,
  • 32 个用于单精度浮点超越函数的特殊函数单元,
  • 4 个 warp 调度程序。

如您所见,CUDA 内核的数量(192) 不是 2 的幂,而 CPU 内核是通用的,CUDA 内核不执行单精度浮点超越函数。这些操作由其他一些特殊功能单元处理。签出this。

另外,在你的问题中它说Registers per Multiprocessor 是 32K。这意味着每个 SM 有 32K 32 位寄存器。所以总的寄存器大小是128KB。

鉴于所有这些,我认为Max Warps per Multiprocessor 没有理由成为 2 的幂。

【讨论】:

  • 感谢您的解释。您能否还强调一下为什么每个多处理器的 Max Warps 是 48 而不是 2 的幂(因为内核数和寄存器大小 = 65536 字节都是 2 的幂)。
  • @user2118922 答案已编辑以反映此附加问题。
  • 谢谢。我有一些演讲幻灯片,其中这些最大限制和图表不匹配并引起了很多混乱。我使用的是计算能力 2.0(而不是 2.1),link 表明它有 32 个 CUDA 核心用于算术运算。但每个多处理器的最大驻留扭曲数仍然是 48(不是 2 的幂)。 (来自link。我现在明白这个限制是针对2.x(不仅仅是2.0)
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 2012-07-18
  • 2013-07-13
  • 2017-09-24
  • 1970-01-01
  • 2013-07-22
  • 2020-12-09
  • 1970-01-01
相关资源
最近更新 更多