刚开始学习CUDA,还有一些我无法理解的东西。我想知道除了优化GPU工作负载之外是否有理由将线程分成块。因为如果没有,我就无法理解你为什么需要手动指定块数及其大小。简单地提供解决任务所需的线程数并让GPU在SM上分配线程会不会更好?
即,考虑以下虚拟任务和GPU设置。
number of available SMs: 16
max number of blocks per SM: 8
max number of threads per block: 1024
假设我们需要处理256x256矩阵的每个条目,并且我们需要为每个条目分配一个线程,即线程的总数是256x256 = 65536.然后块数是:
overall number of threads / max number of threads per block = 65536 / 1024 = 64
最后,将在16个SM之间分配64个块,使其为每个SM 8个块。现在这些是GPU可以自动处理的微不足道的计算,对吗?
我能想到的手动提供块数及其大小的唯一原因是以特定方式分离线程,以便它们具有共享本地内存,即将一个线程块与另一个线程块隔离。
但肯定还有其他原因吗?
答案 0 :(得分:1)
我会尝试从我最了解的角度回答你的问题。
决定每个块的线程数的主要因素是多处理器占用率。多处理器的占用率计算为活动warp与max的比率。支持的活动warp数。由于许多原因,取决于应用,warp的线程可以是活动的或休眠的。因此,线程数量的固定结构可能不可行。
此外,每个多处理器在该多处理器的所有线程之间共享固定数量的寄存器。如果所需的总寄存器超过最大值。数字,申请可能会失败。
除此之外,在大量使用共享内存的情况下,给定块可用的固定共享内存也可能影响对线程数的决定。
因此,如果您想完全忘记手头的应用程序类型,那么使用occupancy calculator spreadsheet可以直接判断线程数。另一个更好的选择是考虑占用率以及正在运行的应用程序类型。