单个CUDA核心可以启动的最大线程数

14

我对Fermi型号的GPU可以启动的最大线程数感到困惑。

我的GTX 570设备查询显示如下信息。

  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 65535

据我的理解,我认为以上陈述如下:

对于CUDA内核,我们最多可以启动65536个块。每个启动的块可以包含多达1024个线程。因此原则上,我最多可以启动65536 * 1024 (=67108864)个线程。

这是正确的吗?如果我的线程使用了大量寄存器,我们是否仍能达到该理论最大线程数呢?

编写和启动CUDA内核后,如何知道已经实例化的线程和块的数量确实已被实例化。我的意思是,如果我恰好实例化了比该特定内核可能的更多的线程,我不希望GPU计算一些无关紧要的东西或表现怪异。


这可能会对您有所帮助:https://dev59.com/LXE95IYBdhLWcg3wPrkI - user1154664
1个回答

25
对于CUDA内核,最多可以启动65536个块。每个启动的块可以包含高达1024个线程。因此原则上,我最多可以启动65536 * 1024(= 67108864)个线程。
不,这是不正确的。您可以启动最多65535 x 65535 x 65535个块的网格,并且每个块最多有1024个线程,尽管每个线程资源限制可能会限制每个块的总线程数少于此最大值。
如果我的线程使用了很多寄存器怎么办?在这种情况下,您将无法达到每个块的最大线程数。每个NVIDIA CUDA工具包的发行版都包括一个可用于查看寄存器压力对限制块大小的占用率计算器电子表格。
此外,在编写和启动CUDA内核之后,如何知道已经实例化了启动的线程和块的数量。我的意思是,如果我偶然实例化了比特定内核所允许的更多的线程,我不希望GPU计算一些垃圾或表现出怪异行为。如果选择非法执行配置(因此块大小或网格大小不正确),则内核将无法启动,运行时将发出cudaErrorInvalidConfiguration错误消息。您可以使用标准的cudaPeekAtLastError()和cudaGetLastError()来检查任何内核启动的状态。

有没有类似于cudaOccupancyMaxPotentialBlockSize的相关函数,可以返回我们在任何设备上可以启动的最大网格和块数?抽象出这些数字会很有用。 - Mahyar Mirrashed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接