【问题标题】:CUDA C programing guide: how do thread and block indexing calculations work?CUDA C 编程指南:线程和块索引计算如何工作?
【发布时间】:2017-07-20 11:43:57
【问题描述】:

在 CUDA_C_Programming_Guide,Chapter2,Thread Hierarchy

__global__ void MatAdd(float A[N][N],float B[N][N],float C[N][N])  
{
  int i=blockId.x*blockDim.x+threadIdx.x;  
  int j=blockId.y*blockDim.y+threadIdx.y;  
  if(i<N&&j<N)  
    C[i][j]=A[i][j]+B[i][j];
}

int main()
{
....
  dim3 threadPerBlock(16,16);
  dim3 numBlock(N/threadPerBlcok.x,N/threadPerBlock.y);
  MatAdd<<<numBlocks,threadPerBlock>>>(A,B,C);
....
}

我对此很陌生,无法理解“int i=blockIdx.x*blockDim.x+threadIdx.x”。为什么会这样? 有没有人可以给我解释一下? 非常感谢。 例如,如何使用“i”和“j”来确认Block(1,1)中的Thread(1,1)?

【问题讨论】:

  • 代码属于帖子本身。不要发布代码图片。
  • 图一展示了block和thread的位置关系
  • 图片 1 未加载。现在是图 2。
  • 图1是代码,我贴出来。(不好意思,刚用完
  • titan xp是1格还是6格?

标签: cuda


【解决方案1】:

我在 > autor:Shane Cook 中找到了答案。 第 5 章对此有明确的解释。 对于 2D 数组,我们需要 dim3 来创建 2D 布局线程。 “dim3 threadPerBlock(16,16)”表示单个block的x轴有16个线程,Y轴有16个线程。 “dim3 numBlocks(N/threadPerBlock.x,N/threadPerBlock.y)”表示单个网格沿 x 轴有 N/threadPerBlock.x 块,沿 y 轴有 N/threadPerBlock.y。 gridDim.x 或 gridDim.y 表示网格中沿 x/y 轴的块数。 blockDim.x 或 blockDim.y 表示块中沿 x/y 轴的线程数。 threadIdx.x 或 threadIdx.y 表示块中沿 x/u 轴的线程索引。 blockIdx.x 或 block.idx.y 表示网格中沿 x/y 轴的块索引。 所以如果我们想知道线程的绝对索引,我们应该知道当前块后面有多少块以及当前线程后面有多少个线程 (row*(sizeof(array_element)*width)))+((sizeof(array_element)*offset) )。所以我们得到 i= blockIdx.x*blockDim.x+threadIdx.x 。 有图片显示网格、块和线程尺寸。 enter image description here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 2012-04-09
    • 2012-09-02
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2013-07-14
    • 2014-10-13
    相关资源
    最近更新 更多