Sdk CUDA中的块尺寸

Sdk CUDA中的块尺寸,sdk,cuda,Sdk,Cuda,我有一个运行cuda-4.0的NVIDIA GTX 570计算能力2.0 CUDA SDK中的deviceQuery可执行文件为我提供有关CUDA设备及其各种属性的信息。输出中的两行是 每个块的最大线程数:1024 块的每个维度的最大大小:1024 x 1024 x 64 为什么当X和Y维度最多可以变化1024个线程时,块的第三维度最多只能限制为64个线程?EDIT2:另外,请对此持保留态度;这是一个纯粹的假设性答案,或猜测。64是最大值可能确实有一个明确的基于硬件的原因。坦白地说,我不知道,我

我有一个运行cuda-4.0的NVIDIA GTX 570计算能力2.0

CUDA SDK中的deviceQuery可执行文件为我提供有关CUDA设备及其各种属性的信息。输出中的两行是

每个块的最大线程数:1024

块的每个维度的最大大小:1024 x 1024 x 64

为什么当X和Y维度最多可以变化1024个线程时,块的第三维度最多只能限制为64个线程?

EDIT2:另外,请对此持保留态度;这是一个纯粹的假设性答案,或猜测。64是最大值可能确实有一个明确的基于硬件的原因。坦白地说,我不知道,我的回答是基于这样一个假设,即从本质上讲,没有这样的硬件限制

这可能是三件事的结合:首先,一个块中可以驻留的线程数量是有限制的;第二,块尺寸通常是32的倍数,更常见的是2的幂大于32;第三,用于解决多维问题的坐标系通常是定向的,以便您直接查看场景(即,重要位在X和Y中的分布比在Z中的分布更多)

CUDA自然必须支持1D访问,因为这是一种非常常见和高效的访问模式。为了支持这一点,必须允许X维度在1024个线程的整个范围内变化

为了支持不太常见的2D访问,CUDA应至少支持X维度中的512(使用X维度应在坐标系中定向以使其测量最大排列的约定)和Y维度中的32。它必须支持多达1024个X维度,我想他们放宽了X维度不小于Y维度的要求,并允许完整的1024个Y值范围。然而,在我的理解中,32对于Y维度的最大值来说已经足够大了

为了支持3D访问,保持X,Y>=Z并尝试达到1024,在最好的情况下X=Y=Z=10;所以,在我的假设下,没有真正的理由允许Z大于10

总之,我不明白他们为什么不能达到最大值(1024、32、10)。我的问题是为什么要制造它们(1024102464)?我反复提到的唯一答案是允许程序员有一些灵活性来违反X>=Y>=Z坐标系约定


编辑:根据我的总结和假设答案,您的问题的真正答案是:这是一个任意决定。

我的猜测是,因为threadIdx.x、threadIdx.y和threadIdx.z保存在一个特殊的32位寄存器中,甚至可能还有其他一些附加数据。也许是翘曲id?或者,如果给定的多处理器运行多个线程,则可以使用多处理器块id来标识给定线程处理的块

这纯粹是推测,我没有数据支持,但我想他们希望拥有尽可能少的特殊寄存器