3

我正在做的事情突出了一个事实,即我对块和网格在 cuda 中的工作方式没有牢牢掌握。我有一个 1000x10 矩阵,我想遍历它并用一个值填充每个元素。内核是这样的:

__global__ void myfun(float *vals,float *out, int M, int N)
  {  
      int row = blockIdx.y*blockDim.y + threadIdx.y;
      int col = blockIdx.x*blockDim.x + threadIdx.x;
      int index = row*N + col;

      if( (row < M ) && (col < N) ) {
          out[index] = index;
      }
}

其中,M=1000 和 N = 10。我不知道如何将其分割,以便覆盖矩阵中的每个元素。由于我需要覆盖 1000*10 = 10,000 个元素并且考虑到线程数量的限制,我不能使用 (10,1000,1) 的块大小。使用 pycuda,我尝试过诸如 block = (10,100,1), grid = (1,10) 之类的方法,但我从未完全覆盖矩阵元素。这样做的正确方法是什么?

4

1 回答 1

3

固定块大小,并保持网格大小动态。这样,无论 M 和 N 的值如何,内核都会覆盖矩阵的每个元素。

block = (8,8)
grid = ((N + 7) / 8, (M + 7) / 8)

使用此网格和块配置启动内核。保持设备的限制,如果需要,您可以更改块大小。

于 2013-05-19T16:08:34.597 回答