CUDA中的块尺寸

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

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

每块的最大线程数:1024

块的每个尺寸的最大尺寸:1024 x 1024 x 64

为什么块的第三维仅限于多达64个线程,而X和Y维可以改变多达1024个线程?


编辑2:此外,请带上一粒盐。 这是一个纯粹假设的答案或猜测。 确实有一个明确的基于硬件的原因,为什么64是最大的。 坦率地说,我不知道,我的回答是基于一个假设,即本身没有这种硬件限制。

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

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

为了支持不太常见的二维访问,CUDA应该在X维上最低限度地支持512个(使用X维应该在坐标系中定向以使其测量最大扩展的约定),并且在Y维中使用32维。 它必须在X维度上支持高达1024,我想他们放宽了X维度不小于Y维度并允许Y值满1024范围的要求。 不过,按我的理解,32位对于Y维度的最大值已经足够大了。

为了支持3D访问,维护X,Y> = Z并试图达到1024,似乎是在最好的情况下X = Y = Z = 10; 所以根据我的假设,让Z大于10就没有真正的争论

总之,我不明白他们为什么不能达到最大值(1024,32,10)。 我的问题是为什么让他们(1024,1024,64)? 我不断回来的唯一答案是允许程序员灵活地违反X> = Y> = Z坐标系惯例。

编辑:给出我的总结和假设的答案,真正的答案是这样的:这是一个任意的决定。


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

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

链接地址: http://www.djcxy.com/p/38465.html

上一篇: Block dimensions in CUDA

下一篇: SDL + OpenGL: access violation when creating buffer