我有运行cuda-4.0的NVIDIA GTX 570计算能力2.0。
CUDA SDK中的deviceQuery可执行文件为我提供了有关我的CUDA设备及其各种属性的信息。输出中的两行是
每个块的最大线程数:1024
块的每个维度的最大大小:1024 x 1024 x 64
为什么块的第三维限制为最多64个线程,而X和Y维度最多可以变为1024个线程?
答案 0 :(得分:3)
EDIT2:此外,请带上一粒盐;这是一个纯粹假设的答案或猜测。确实有一个明确的基于硬件的原因,为什么64是最大值。坦率地说,我不知道,我的回答是基于这样的假设,即本身没有这样的硬件限制。
这可能是三件事的组合:首先,可以驻留在块内的线程数量有限制;第二,块尺寸通常是32的倍数,更常见的是2的幂大于32;第三,在多维问题解决方案中使用的坐标系统通常是定向的,这样你就可以直接观察场景(即,重要位在X和Y中的分布比在Z中更多)。
CUDA自然必须支持1D访问,因为这是一种非常常见且高效的访问模式。为了支持这一点,X维必须允许在1024个线程的整个范围内变化。
为了支持不常见的2D访问,CUDA应该在X维度上最低限度地支持多达512个(使用X维度应该在坐标系中定向的约定,以便它测量最大的扩展)和32 in Y维度。它必须在X维度上支持高达1024,并且我认为它们放宽了X维度不小于Y维度并允许完整1024个Y值范围的要求。但是,根据我的理解,对于Y维度最大值,32将是非常大的。
为了支持3D访问,保持X,Y> = Z并尝试达到1024,似乎在最佳情况下X = Y = Z = 10;因此,根据我的假设
,允许Z大于10没有真正的论据总之,我不明白他们为什么不能达到最大值(1024,32,10)。我的问题是为什么要制作它们(1024,1024,64)?我一直回到的唯一答案是允许程序员有一定的灵活性来违反X> = Y> = Z坐标系约定。
编辑:鉴于我的总结和假设答案,您问题的真正答案是:这是一项仲裁决定。
答案 1 :(得分:0)
我的猜测是,因为threadIdx.x,threadIdx.y和threadIdx.z保存在一个特殊的单个32位寄存器中,甚至可能还有一些其他附加数据。也许warp id?或者也许是多处理器块id来识别给定线程处理哪个块,如果给定多处理器运行多个?
这纯粹是推测性的,我没有数据支持它,但我想他们希望尽可能少的特殊寄存器。