【问题标题】:CUDA gridDim, blockDim and threadIdxCUDA gridDim、blockDim 和 threadIdx
【发布时间】:2015-09-12 12:16:53
【问题描述】:

这是一个概念问题。在 CUDA 中,gridDim、blockDim 和 threadIdx 可以是 1D、2D 或 3D。我想知道,他们的 2D 和 3D 版本是如何解释的?

更详细一点,CUDA 是否将多维 gridDim、blockDim 和 threadIdx 视为一个线性序列,就像 C 存储多维数组一样?如果不是,我们应该如何解释多维gridDim、blockDim和threadIdx?

谢谢。

编辑 1. 这个问题不是重复的。我实际上遇到了提到的问题。它询问的是 GPU 线程的执行顺序,而不是它们的布局,就像这个一样。

编辑 2. 另外,这个问题的答案可以在http://docs.nvidia.com/cuda/cuda-c-programming-guide/#thread-hierarchy 找到。谢谢@talonmies,供参考。综上所述,多维 gridDim、blockDim 和 threadIdx 是为了方便。它们可以像列主有序多维数组一样解释。

【问题讨论】:

  • 他们的 2D 和 3D 版本是什么意思??您能否进一步扩展您的问题?

标签: c arrays cuda gpu


【解决方案1】:

更详细一点,CUDA 是否将多维 gridDim、blockDim 和 threadIdx 视为一个线性序列,就像 C 存储多维数组一样?

是的。
所有多维数组在 C 中都是线性化的。它们以行优先顺序线性化——将同一行的所有元素放入连续的位置,即行 然后依次被放入内存空间。
CUDA C 也使用行优先布局。二维数组布局示例:

【讨论】:

  • 这不能回答问题
  • @talonmies;实际上我在等待 CUDA 冠军! :) 请详细说明?
  • 问题不在于数组布局。它是关于 GPU 内核网格中的线程和块编号排序
  • @talonmies; AFAIK,网格是线程块数组,块是线程数组。
  • @talonmies;参考会很有帮助。
【解决方案2】:

直接引用CUDA programming guide

线程的索引和它的线程ID在一个 直截了当:对于一维块,它们是相同的; 对于大小为 (Dx, Dy) 的二维块,线程的线程 ID 索引 (x, y) 为 (x + y Dx);对于一个 3D 大小的块 (Dx, Dy, Dz),索引为 (x, y, z) 的线程的线程 ID 为 (x + y Dx + z Dx Dy)。

所以,是的,编程模型中的逻辑线程编号是顺序的,然后 x 维度变化最快,然后是 y 维度,然后是 z 维度。这适用于块内的线程编号和网格内的块编号。编号类似于column major 有序多维数组,尽管实际的threadIdxblockIdx 变量本身只是反映调度程序分配给每个线程或块的内部线程和块标识字的结构。

您应该注意threadIdxblockIdx 隐含的编号只是为了方便程序员,并不暗示GPU 上线程的执行顺序。

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2012-10-22
    • 2012-06-09
    • 2013-10-26
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多