CUDA手动指定螺纹块的目的

CUDA手动指定螺纹块的目的,cuda,gpu,Cuda,Gpu,刚开始学习CUDA,有些东西我还不太明白。我想知道除了优化GPU工作负载之外,是否还有将线程拆分为块的原因。因为如果没有,我无法理解为什么需要手动指定块的数量及其大小。如果只提供解决任务所需的线程数量,并让GPU通过SMs分发线程,不是更好吗 即,考虑下面的虚拟任务和GPU安装。 number of available SMs: 16 max number of blocks per SM: 8 max number of threads per block: 1024 假设我们需要处理256

刚开始学习CUDA,有些东西我还不太明白。我想知道除了优化GPU工作负载之外,是否还有将线程拆分为块的原因。因为如果没有,我无法理解为什么需要手动指定块的数量及其大小。如果只提供解决任务所需的线程数量,并让GPU通过SMs分发线程,不是更好吗

即,考虑下面的虚拟任务和GPU安装。

number of available SMs: 16
max number of blocks per SM: 8
max number of threads per block: 1024
假设我们需要处理256x256矩阵的每个条目,我们希望为每个条目分配一个线程,即线程总数为256x256=65536。那么块的数量是:

总线程数/每个块的最大线程数=65536/1024=64

最后,64个块将分布在16条短信中,每个短信8个块。现在这些都是GPU可以自动处理的琐碎计算,对吗

我能想到的手动提供块数量及其大小的唯一其他原因是,以特定的方式分离线程,以便它们具有共享的本地内存,即从某种程度上将一个线程块与另一个线程块隔离


但肯定还有另一个原因吗?

我将试着从我最了解的角度回答你的问题

决定每个块的线程数的主要因素是多处理器占用率。多处理器占用率的计算方法是活动扭曲与支持的最大活动扭曲数之比。warps的线程可能出于多种原因处于活动或休眠状态,具体取决于应用程序。因此,线程数量的固定结构可能不可行

此外,每个多处理器的所有线程都共享固定数量的寄存器。如果所需的寄存器总数超过最大值,则应用程序可能会失败

此外,在共享内存被大量使用的情况下,给定块可用的固定共享内存也可能影响关于线程数量的决定


因此,一种确定线程数量的简单方法是直接使用,以防您想完全忘记手头的应用程序类型。另一个更好的选择是考虑占用与正在运行的应用程序的类型。 块中的线程保证并发运行,因此它们可以通信(特别是通过共享内存)。所以你的怀疑是对的。