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