我对可以在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计算一些垃圾,或者表现得非常奇怪,如果我偶然实例化了比特定内核更多的线程。
答案 0 :(得分:19)
对于CUDA内核,我们最多可以启动65536个块。每次推出 块最多可包含1024个线程。因此原则上我可以发射 最多65536 * 1024(= 67108864)个线程。
不,这不正确。您可以启动最多65535 x 65535 x 65535块的网格,每个块最多有1024个线程,但每个线程资源限制可能会将每个块的线程总数限制为小于此最大值。
如果我的帖子使用了很多寄存器怎么办?我们还能够达到吗? 这个理论上最大的线程数?
不,在这种情况下,您将无法达到每个块的最大线程数。 NVIDIA CUDA工具包的每个版本都包含一个占用计算器电子表格,您可以使用它来查看套准压力对限制块大小的影响。
此外,在编写和启动CUDA内核之后,我怎么知道 我发起的线程和块的数量确实如此 实例化。我的意思是我不想让GPU计算一些垃圾,或者 奇怪的是,如果我偶然实例化了更多的线程 对于那个特定的内核是可能的。
如果选择非法执行配置(块大小或网格大小不正确),内核将无法启动,运行时将发出cudaErrorInvalidConfiguration
错误消息。您可以使用标准cudaPeekAtLastError()
和cudaGetLastError()
来检查任何内核启动的状态。