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

Posted

技术标签:

【中文标题】单个 CUDA 内核可以启动的最大线程数【英文标题】:Max number of threads which can be initiated in a single CUDA kernel 【发布时间】:2012-08-18 04:03:36 【问题描述】:

我对在 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 计算一些垃圾,或者行为怪异,如果我偶然实例化了比该特定内核可能的更多线程。

【问题讨论】:

这可能对你有帮助:***.com/questions/2392250/… 【参考方案1】:

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

不,这是不正确的。您可以启动最多 65535 x 65535 x 65535 块的网格,每个块的每个块最多有 1024 个线程,尽管每个线程的资源限制可能会将每个块的线程总数限制为小于此最大值。

如果我的线程使用了很多寄存器怎么办?我们还能到达吗 这个理论上的最大线程数?

不,在这种情况下,您将无法达到每个块的最大线程数。 NVIDIA CUDA 工具包的每个版本都包含一个占用计算器电子表格,您可以使用它来查看寄存器压力对限制块大小的影响。

另外,在编写并启动 CUDA 内核之后,我怎么知道 我启动的线程和块的数量确实是 实例化。我的意思是我不希望 GPU 计算一些垃圾,或者 行为怪异,如果我偶然实例化了比实际更多的线程 可能适用于该特定内核。

如果您选择了非法的执行配置(因此不正确的块大小或网格大小),内核将不会启动并且运行时将发出cudaErrorInvalidConfiguration 错误消息。您可以使用标准的cudaPeekAtLastError()cudaGetLastError() 来检查任何内核启动的状态。

【讨论】:

以上是关于单个 CUDA 内核可以启动的最大线程数的主要内容,如果未能解决你的问题,请参考以下文章

可以在 CUDA 上启动的最大线程数

如何计算正在启动的 CUDA 线程数?

为啥允许我运行块数超过 GPU 的 CUDA 核心数的 CUDA 内核?

CUDA - 多处理器、Warp 大小和每个块的最大线程数:确切的关系是啥?

CUDA 扭曲和每个块的最佳线程数

块中的 CUDA 最大线程数