首页 文章

CUDA中的块尺寸

提问于
浏览
5

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

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

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

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

2 回答

  • 0

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

    它可能是三件事的组合:首先,可以驻留在块内的线程数量有限制;第二,块尺寸通常是32的倍数,更常见的是2的幂大于32;第三,在多维问题的解决方案中使用的坐标系统通常是定向的,这样你就可以直接观察场景(即,重要位在X和Y中比在Z中分布更多) .

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

    为了支持不太常见的2D访问,CUDA应该在X维度上最低限度地支持多达512(使用X维度应该在坐标系中定向以使其测量最大扩展的约定)和Y维度中的32 . 它必须在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坐标系统约定 .

    编辑:根据我的总结和假设答案,你问题的真正答案是:这是一个仲裁决定 .

  • 3

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

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

相关问题