在我的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
答案 0 :(得分:5)
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中称为 SM Streaming Processor )最多可以有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的力量。