首页 文章

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

提问于
浏览
10

我对可以在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

根据我的理解,我将以上陈述理解为:

For a CUDA kernel we can launch at most 65536 blocks. Each launched block can contain up to 1024 threads. Hence in principle, I can launch up to 65536*1024 (=67108864) threads.

它是否正确?如果我的线程使用了很多寄存器怎么办?我们仍然能够达到理论上最大的线程数吗?

在编写并启动CUDA内核之后,我怎么知道我启动的线程和块的数量为 indeed been instantiated . 我的意思是我不希望GPU计算一些垃圾,或者表现得非常奇怪,如果我偶然实例化了比特定内核更多的线程 .

1 回答

  • 18

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

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

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

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

    此外,在编写和启动CUDA内核之后,我怎么知道我发起的线程和块的数量确实已经实例化了 . 我的意思是我不希望GPU计算一些垃圾,或者表现得很奇怪,如果我偶然实例化了比特定内核更多的线程 .

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

相关问题