13

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

4

1 回答 1

24

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

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

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

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

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

If you choose an illegal execution configuration (so incorrect block size or grid size) the kernel will not launch and the runtime will issue a cudaErrorInvalidConfiguration error message. You can use the standard cudaPeekAtLastError() and cudaGetLastError() to check the status of any kernel launch.

于 2012-08-22T19:03:26.747 回答